[C] Pointer de pointer de pointer

Pointer de pointer de pointer [C] - C - Programmation

Marsh Posté le 07-04-2013 à 17:38:41    

:hello:  
 
J'ai défini deux structure dans mon prog :
 

Code :
  1. struct _solution {
  2.     int N_sol;
  3.     unsigned char *p;
  4. };
  5. typedef struct _solution Solution;
  6. struct _sec_grille {
  7.     int N;
  8.     int sgrille_num;
  9.     Solution *s;
  10. };
  11. typedef struct _sec_grille GSec;


 
J'ai créé un double pointer et je souhaiterais avoir accès à tous les p depuis celui ci.
 
J'ai essayé ceci :
 

Code :
  1. (*grille_sec[j]).(*s[k]).p = (unsigned char*)malloc(arete*sizeof(unsigned char));


 
Après avoir alloué les deux structure précédente convenablement, mais code::blocks me renvoie une erreur à la compilation : expected identifier befor '(' token
 
Est-ce qu'une âme charitable pourrait m'expliquer mon erreur ?
 
Merci ! :)


---------------
Topic de ventes: http://forum.hardware.fr/hfr/Achat [...] 3018_1.htm :o
Reply

Marsh Posté le 07-04-2013 à 17:38:41   

Reply

Marsh Posté le 07-04-2013 à 20:25:20    

Si, comme je l'imagine, votre variable grille_sec est une double pointeur vers une GSec, ou un pointeur de tableaux, alors (*grille_sec[j]) est de type GSec.
 
Dans ce cas, (*s[k]) n'a pas de sens car l'attribut S est un pointeur simple sur Solution et vous faites un double déréférencement, via le (*) et le [k].  
 
C'est là qu'est votre erreur.
 
Bonne continuation !
 
Edit : Mais le message ne colle pas trop, il y a peut être autre chose, mais il faudrait avoir la déclaration exacte de la variable grille_sec pour valider.


Message édité par Farian le 07-04-2013 à 20:29:45
Reply

Marsh Posté le 07-04-2013 à 21:14:18    

:hello:
 
Merci pour cette réponse voici la déclaration de grille_sec :
 

Code :
  1. GSec **grille_sec = NULL;
  2. if ( (grille_sec = (GSec**)malloc((*grille_p).lenght*sizeof(GSec*))) ==NULL){
  3.     perror("erreur d'allocation" );
  4. }
  5. for(j=0; j<arete; j++){
  6. (*grille_sec[j]).s = NULL;
  7. if( ( (*grille_sec[j]).s = (Solution*)malloc(arete*sizeof(Solution)) )== NULL){
  8.     perror("erreur dans l'allocation du tableau de solution" );
  9. }
  10. (*grille_sec[j]).N= arete;
  11. for(k=0;k<arete;k++){
  12.             if( ( (*grille_sec[j]).(*s[k]).p = (unsigned char*)malloc(arete*sizeof(unsigned char))) == NULL){
  13.             perror("erreur dans l'allocation des cases de solution" );
  14.             }
  15. }
  16. }


 
Dans un premier temps, j'avais alloué les char *p avec  
 

Code :
  1. if( ( (*grille_sec[j]).s[k].p = (unsigned char*)malloc(arete*sizeof(unsigned char))) == NULL){
  2.             perror("erreur dans l'allocation des cases de solution" );
  3.             }


 
Mais dans ce cas, j'obtiens un malloc() : memory corruption
 
J'ai donc pensé que l'accés au char *p était incorrect.
 
Je suis un peu bloqué  :??:


---------------
Topic de ventes: http://forum.hardware.fr/hfr/Achat [...] 3018_1.htm :o
Reply

Marsh Posté le 07-04-2013 à 21:55:10    

Re-bonjour !
 
Vous n'allouez qu'une seule dimension du tableau grille_sec, et vous déréférencez deux fois, cela ne peut pas marcher.
 
Dans la ligne 3, vous allouez grille_sec comme un tableau de N pointeurs, mais ensuite vous déréférencez ces N pointeurs (ligne 10) sans avoir alloué la mémoire correspondante.
 
Pourquoi faire un double pointeur, vu que vous n'utilisez qu'une dimension sur les deux ?
 
Bon courage !
 
Edit : si je comprends bien, l'erreur que vous obtenez ("malloc : memory corruption" ) est une erreur à l'exécution, ce qui n'a rien à voir avec une erreur à la compilation : La première indique que vous avez mal géré vos pointeurs dans le programme, tandis que la deuxième indique une erreur de syntaxe (pour simplifier) dans votre code. Dans le premier cas, vous accédez mal à vos valeurs d'un point de vue dynamique, "fonctionnel", presque ou vous ne respectez pas les cycles de vie (allocation / utilisation / désallocation) de vos objets / pointeurs.


Message édité par Farian le 07-04-2013 à 21:58:24
Reply

Marsh Posté le 07-04-2013 à 22:22:23    

Re-bonjour,

 

Merci une nouvelle fois pour cette réponse :)
Mon programme va utiliser arete pointer vers GSec, c'est pour cela que j'ai pensé passer par un double pointer.

 

Je viens de comprendre grâce à vous qu'il fallait allouer les grille_sec[i] !

 

Merci pour votre aide !


Message édité par hecube le 07-04-2013 à 22:22:38

---------------
Topic de ventes: http://forum.hardware.fr/hfr/Achat [...] 3018_1.htm :o
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed