pointeurs de pointeurs [RESOLU] [C] - C - Programmation
Marsh Posté le 25-04-2011 à 10:04:49
Si je comprends bien (tu aurais pu faire plus court comme test )
Tu espères pouvoir modifier tes pointeurs test et essai juste en les passant dans une fonction qui les assigne au résultat de malloc ?
Ca ne peut pas marcher pour une raison simple: Quand tu fais passer un paramètre à une fonction, cette fonction va en réalité travailler avec une copie de ce paramètre. A la fin de ta fonction, ce paramètre va donc être détruit et évidemment tu auras donc perdu le pointeur que t'a retourné malloc.
Si tu voulais pouvoir modifier ce pointeur "a distance", il faudrait que tu fasses passer en paramètre l'adresse du pointeur (donc setinit(&essai) et maininit(&test)), que tu modifies bien évidemment le prototype de ces fonctions en conséquence et une fois cela fait, tu aurais alors un pointeur sur pointeur.
Ce que ça change ? Tu pourras alors modifier l'adresse du pointeur essai et test en faisant une assignation toute simple comme *essai = NULL; ou *test = malloc() ou ce que tu veux
J'espère avoir répondu à ta question
Marsh Posté le 25-04-2011 à 10:32:17
Merci mais je n'arrive pas à compiler correctement à présent.
J'ai fait ça comme modifs :
settings.h
Code :
|
settings.c
Code :
|
main.c
Code :
|
Je vois bien que l'erreur est dans l'affectation à présent mais je ne vois pas comment écrire ça correctement.
Marsh Posté le 25-04-2011 à 10:41:58
Pour te simplifier les choses (tu pourras comprendre après ): Tu as bien modifié le prototype, par contre dans ta fonction à chaque fois que tu as "test" ou "essai" il faut qu tu remplaces par *test et par *essai (donc tu mets une étoile chaque fois, ce n'est pas l'adresse du pointeur de pointeur que tu veux modifier mais l'adresse du premier pointeur)
Donc par exemple, tu remplaces if (essai != NULL) par if (*essai != NULL) etc ...
Marsh Posté le 25-04-2011 à 10:45:37
Je creuse pour comprendre pourtant !!
Ca fonctionne pour malloc et le test, mais je ne comprend pas la syntaxe à adopter pour l'affectation :
Code :
|
Je me prend des :
error: request for member `a' in something not a structure or union
Marsh Posté le 25-04-2011 à 11:04:07
Tu as essayé (*essai)->a=12; ? Faut faire gaffe à l'endroit ou on met les *, faut pas déréférencer n'importe quoi
Parce que je pense qu'en faisant *essai->a = 12, ton compilateur doit comprendre essai->*a = 12
Marsh Posté le 25-04-2011 à 11:09:14
J'essaye ça de suite !!
Moi, j'en étais là pour contourner :
Code :
|
Merci de ton aide précieuse et claire, j'avance vite avec une aide qui explique et ne met pas des commentaires lapidaires et inutiles comme souvent sur les forums, j'apprécie.
Marsh Posté le 25-04-2011 à 11:17:05
Ca fonctionne !!!
Et ton analyse du préprocesseur est correcte, il comprend l'inverse, belle blague celle-là, merci grandement de ta pédagogie.
Je mets tout au propre et je post ici mon code complet, si ça peut en aider d'autres à "naviguer" dans les pointeurs de pointeurs en C ...
settings.h
Code :
|
settings.c
Code :
|
main.h
Code :
|
main.c
Code :
|
Résultat du code :
Code :
|
Marsh Posté le 25-04-2011 à 11:42:27
Tu peux éditer le premier post et changer le titre si tu y tiens vraiment, mais effectivement il n'y a pas de politique concernant le titre des sujets
Bonne continuation
Marsh Posté le 25-04-2011 à 12:31:02
Je vois pas trop ce que tu veux faire, mais si j'avais à utiliser ce type de structure, je procéderais ainsi:
(Bon, à reformater, la page web ayant pas la même notion de tabulations que mon emacs en mode electric-c)
Code :
|
Code :
|
Code :
|
In Hope It Helps,
A+,
Marsh Posté le 25-04-2011 à 09:36:49
Bonjour,
J'étais en train d'écrire un petit programme de test pour bien comprendre les principes des pointeurs en C en i686 en gcc, tout se compile bien, les données sont lisibles dans les fonctions, mais plus à leur sortie, je ne comprend pas mon erreur.
Pouvez-vous me corriger ce code ?
Merci.
settings.h
settings.c
main.h
main.c
Le résultat d'exécution donne ceci :
Il manque donc bien les lignes d'impression du main.
Merci pour votre aide
Message édité par Noobs69 le 25-04-2011 à 18:18:30