A voir également:
- Erreur malloc/free
- Erreur 0x80070643 - Accueil - Windows
- Word 2013 free download - Télécharger - Traitement de texte
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Sketchup free - Télécharger - 3D
- Erreur 38 free ✓ - Forum Free mobile
4 réponses
Utilisateur anonyme
4 janv. 2013 à 14:31
4 janv. 2013 à 14:31
Bonjour
Le problème c'est que tu fais un realloc de tableLabyrinth à l'intérieur de processingLabyrinth().
Ceci modifie la variable locale de la fonction, mais pas la variable tableLabyrinth du main.
Donc dans ton main, tableLabyrinth ne correspond plus au tableau alloué. Ça m'étonne même qu'il n'y ait pas d'erreur pour i=0 !
Tu n'as plus qu'à passer tableLabyrinth par adresse.
Le problème c'est que tu fais un realloc de tableLabyrinth à l'intérieur de processingLabyrinth().
Ceci modifie la variable locale de la fonction, mais pas la variable tableLabyrinth du main.
Donc dans ton main, tableLabyrinth ne correspond plus au tableau alloué. Ça m'étonne même qu'il n'y ait pas d'erreur pour i=0 !
Tu n'as plus qu'à passer tableLabyrinth par adresse.
Utilisateur anonyme
4 janv. 2013 à 15:23
4 janv. 2013 à 15:23
Si tu t'intéresses à la variable tableLabyrinth elle-même (ce qui est le cas), il s'agit bien d'un passage par valeur, puisque dans l'appel à la fonction il n'y a pas l'opérateur &. Tout ce que tu feras à l'intérieur de la fonction ne modifiera pas la variable tableLabyrinth du main.
Par contre, si tu t'intéresses à ce qui est pointé par tableLabyrinth, tu as bien fait un passage par adresse, puisque (bonjour M. de La Palice) tableLabyrinth contient l'adresse de ce qui est pointé par tableLabyrinth. Et tu peux donc, depuis l'intérieur de ta fonction, modifier ce qui est pointé par tableLabyrinth.
Par contre, si tu t'intéresses à ce qui est pointé par tableLabyrinth, tu as bien fait un passage par adresse, puisque (bonjour M. de La Palice) tableLabyrinth contient l'adresse de ce qui est pointé par tableLabyrinth. Et tu peux donc, depuis l'intérieur de ta fonction, modifier ce qui est pointé par tableLabyrinth.
Utilisateur anonyme
4 janv. 2013 à 16:37
4 janv. 2013 à 16:37
Il ne suffit pas de rajouter & dans l'appel. Il faut en tenir compte dans la fonction : tu ne passes plus tableLabyrinth mais son adresse.
Je vais changer le nom du paramètre de la fonction en ptableLabyrinth pour montrer qu'il s'git maintenant d'un pointeur sur tableLabyrinth et non plus de tableLabyrinth elle-même. Attention aux *
En espérant que je ne me suis pas trompé.
Au fait, à quoi sert ton initialisation de tableLabyrinth dans main ?
Je vais changer le nom du paramètre de la fonction en ptableLabyrinth pour montrer qu'il s'git maintenant d'un pointeur sur tableLabyrinth et non plus de tableLabyrinth elle-même. Attention aux *
void processingLabyrinth(int*** ptableLabyrinth, int* sizeTableLabyrinthRows, int* sizeTableLabyrinthColumns){ int i = 0; //je code en dur la taille des lignes et des colonnes *sizeTableLabyrinthRows = 10; *sizeTableLabyrinthColumns = 10; //réallocation du tableau d'enregistrement *ptableLabyrinth = (int**)realloc(*ptableLabyrinth, sizeof(int*)*(*sizeTableLabyrinthRows)); while(i<*sizeTableLabyrinthRows){ *ptableLabyrinth[i] = (int*)malloc( sizeof(int)*(*sizeTableLabyrinthColumns)); i++; }
En espérant que je ne me suis pas trompé.
Au fait, à quoi sert ton initialisation de tableLabyrinth dans main ?
Utilisateur anonyme
4 janv. 2013 à 18:10
4 janv. 2013 à 18:10
Je viens de faire l'essai et je me suis rendu compte que j'ai oublié des parenthèses dans ma modification :
Je ne sais pas comment tu as fait, chez moi sans ces parenthèses c'est une erreur d'exécution à l'allocation...
Sinon chez moi ça marche, ça marchait même avec ta version initiale, sûrement parce que le realloc n'a pas déplacé physiquement les données.
Je suppose que le code qui est derrière les //... est toujours présent : peux-tu le mettre réellement en commentaire pour n'exécuter que ce que tu as montré et voir si tu as toujours le problème ?
(*ptableLabyrinth)[i] = (int*)malloc...
Je ne sais pas comment tu as fait, chez moi sans ces parenthèses c'est une erreur d'exécution à l'allocation...
Sinon chez moi ça marche, ça marchait même avec ta version initiale, sûrement parce que le realloc n'a pas déplacé physiquement les données.
Je suppose que le code qui est derrière les //... est toujours présent : peux-tu le mettre réellement en commentaire pour n'exécuter que ce que tu as montré et voir si tu as toujours le problème ?
Je n'en sais rien, je ne suis pas professionnel et je n'ai que de vagues souvenirs du C (d'où mon oubli des parenthèses). Mais j'ai une idée claire de ce qu'est un pointeur, et ça ne me gêne pas de parler d"un pointeur sur un pointeur sur un pointeur, quitte à faire un petit dessin (ce que j'ai vraiment fait) pour visualiser ce dont j'ai besoin ou ce dont on parle.
4 janv. 2013 à 14:49
J'ai une autre question, quand une je passe mon tableau en paramètre dans processingLabyrinth() ce n'est pas déjà un passage par adresse ? Mon prof de C a pas était très clair sur ce point...