2014-07-02 1 views
1

Je commence par un tableau d'entiers test[] qui représente un ensemble d'images. Les deux premiers éléments de test[] sont la hauteur et la largeur de la première image. Les quatre éléments (height*width) suivants sont des valeurs de pixel. Les six suivants représentent l'image suivante et ainsi de suite.Pourquoi est-ce que j'obtiens EXC_BAD_ACCESS même si le pointeur semble être valide?

Mon objectif est d'accéder aux images à travers des objets image sans dupliquer quoi que ce soit dans le tableau test[]. J'essaie de le faire via ImageSet::import.

int main(){ 
    int test[] = {2,2,1,2,3,4, 
        2,2,4,5,6,7, 
        2,2,9,8,0,9}; 
    ImageSet set = ImageSet(); 
    set.import(test); //ImageSet::import 
    return 0; 
} 

ImageSet::import utilise la variable du curseur pour stocker l'index de début de l'image suivante. appelle Image::import pour lire ces données dans un objet image. Les données pour cette image particulière doivent commencer à l'adresse &data[cursor].

void ImageSet::import(int data[]){ 
    int cursor = 0; 
    for(int i = 0; i < NUM_SRC_IMAGES; i++){ 
     int height = data[cursor]; 
     int width = data[cursor+1]; 
     source_[i].import(&data[cursor]); //this is Image::import 
     cursor += height * width + 2; 
    } 
} 

Dans image::import, je reçois un mauvais accès en essayant de lire data[0]. Selon le débogueur, data[] points à la valeur correcte de 2, mais EXC_BAD_ACCESS est levée quand je tente d'obtenir cette valeur via data[0].

void Image::import(int data[]){ 
    height_ = data[0]; //the problem occurs right here 
    width_ = data[1]; 
    matrix_ = &data[2]; 
} 

J'apprécierais beaucoup une explication de ce que je fais mal. J'apprécierais également des suggestions pour réaliser mon objectif sans arithmétique de pointeur.

Merci!

+0

Avez-vous essayé de le transmettre comme 'source_ [i] .import (data + cursor)'? – manman

+2

Un programme complet s'il vous plaît. http://sscce.org –

+0

Ajoutez deux instructions d'impression après 'for (int i = 0; i

Répondre

0

Je dirais que pendant la phase d'optimisation du compilateur réarrange votre boucle

for(int i = 0; i < NUM_SRC_IMAGES; i++){ 
    source_[i].import(&data[cursor]); //this is Image::import 
    int height = data[cursor]; // -> would also crash, but you don't see it because import crashes earlier 
    int width = data[cursor+1]; 
    cursor += height * width + 2; 
} 

Et depuis que vous avez défini NUM_SRC_IMAGES trop grand, vous lisez après la fin de l'essai.

BTW, vous devriez également penser à utiliser STL comme style d'itérateur, puis appeler set.import(begin(test), end(test)); En faisant abstraction du type sous-jacent, vous pouvez lire les données de n'importe quel conteneur. Et vous pouvez vérifier à la fin pour ne jamais lire après la fin.

0

Avec les informations limitées dans la question, je peux suggérer ce qui suit:

  1. essayer de modifier l'importation à ImageSet::import(const int* data, size_t size) ou ... de préférence, ImageSet::import(const int (&data[18])) - cela permet une référence claire par opposition à une donnée [] peut être optimisé dans certaines circonstances. Ce dernier spécifie également explicitement à vos collègues devs qu'il s'agit d'une référence de tableau (par opposition à un pointeur). Idem pour Image::import.

  2. En Image::import impression sur la valeur de data (à savoir &data[0]) - cela vous permettra de savoir si l'adresse est valide.

  3. à la fin de la boucle en ImageSet::import impriment la valeur de cursor.

Ma conjecture est dans la troisième boucle ou alors, la valeur de cursor devient trop importante, supérieure à 18. Je ne sais pas ce que votre intention est ...mais cette logique cursor += 3 + 4*2 (à titre d'exemple) semble vraiment suspect.

Questions connexes