2016-12-09 1 views
-1

J'ai une fonction qui devrait modifier un tableau (de flottants) dans la fonction parente d'origine. Je suis en utilisant le code suivant:C - passage d'un tableau par référence - seul ensemble d'éléments

void sortFunction(Word**words, int wordCount){ //to sure if two * are correct (pointer to an array..?) 
int i = 0; 
for(i=0;i<wordCount-1;i++){ 
    Word first = *words[i]; //values fine 
    Word second = *words[i+1]; //weird values, causes segfault 
    if(first.data[0] > second.data[0]){ 
     //do stuff 
    } 
    } 
} 

int main(int argc, char ** argv){ 
    Word* words = NULL; 
    int wordsCount = ... 
    //filling the array in a loop and using realloc for memory allocation 
    //Here, the array is filled correctly (verified) 
    sortFunction(&words, wordsCount); 
} 

Word est un typedef struct et Word.data est le tableau de flotteur (dynamique). Lors de l'archivage de la fonction parente, le tableau est alloué et les valeurs définies correctement.

J'ai essayé avec environ 10 éléments dans le tableau, mais toujours seul le premier ([0]) élément est bien dans le sortFunction(), deuxième et tous les autres sont foiré. J'ai aussi une propriété int dans la structure, et quand j'essaie de l'imprimer pour le second élément, je reçois quelque chose de plus de 1 milliard. Je suppose que je ne passe pas correctement le tableau - j'utilise le code suivant (juste un échantillon) pour passer des variables régulières, donc j'ai essayé de le modifier pour un tableau, mais apparemment, pas correctement. Quelle est la bonne façon de le faire pour un tableau?

void foo(int*var){ 
    *var=8; 
} 

int main(){ 
    int var = 5; 
    changeVar(&var); 
} 

Merci d'avance pour tout conseils!

+3

Lecture par ex. [cette table de priorité d'opérateur] (http://en.cppreference.com/w/c/language/operator_precedence) et le problème devrait être évident. –

+0

@Someprogrammerdude Tristement pas:/Je pense (comme je le pensais avant), que ça a quelque chose à voir avec la partie "Mots de mots"? –

+1

Non, pas cette partie, mais la partie '* words [i]'. Le compilateur le traite comme '* (mots [i])' ce qui est faux. –

Répondre

3

Postfix [] a une priorité supérieure unaire *, donc *words[i] est analysé comme *(words[i]), ce qui est pas ce que vous voulez.

Vous devez déréférencer le pointeur wordsavant appliquer l'indice, de sorte que vous devez regrouper explicitement l'opérateur * avec words entre parenthèses en utilisant:

Word first = (*words)[i]; 
Word second = (*words)[i + 1]; 
1

D'abord, vous n'avez pas besoin de passer **, juste on est assez, parce que vous passerez l'adresse de votre choix de toute façon:

void sortFunction(Word* words, int wordCount) 

et appelez comme:

sortFunction(words, wordsCount); 

En second lieu, le comportement non défini son origine dans la déclaration suivante:

Word first = *words[i]; Word second = *words[i+1];

Il aurait dû être (*words)[i] mais encore, vous copiez struct, de sorte que votre dynamiquedata tableau n'est pas copié correctement. éviter cette copie inutile, et utiliser ce lieu, après avoir changé le protoype de sortFunction:

Word* first = &words[i]; 
Word* second = &words[i+1]; 
if(first->data[0] > second->data[0]) 

p.s: Cela ne garantit pas que le reste de votre code est correct, seulement les commentaires des parties que vous avez montré du code.