Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1816 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Pointer de pointer de pointer

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Pointer de pointer de pointer

n°2184620
hecube
La ruse est finaude !
Posté le 07-04-2013 à 17:38:41  profilanswer
 

: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
mood
Publicité
Posté le 07-04-2013 à 17:38:41  profilanswer
 

n°2184630
Farian
Posté le 07-04-2013 à 20:25:20  profilanswer
 

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
n°2184640
hecube
La ruse est finaude !
Posté le 07-04-2013 à 21:14:18  profilanswer
 

: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
n°2184641
Farian
Posté le 07-04-2013 à 21:55:10  profilanswer
 

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
n°2184644
hecube
La ruse est finaude !
Posté le 07-04-2013 à 22:22:23  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Pointer de pointer de pointer

 

Sujets relatifs
[C] A l'aide je ne comprends rien a ce programme[C] Remplacer un char dans une chaine de caractère
langage C - PB unsigned charlangage C
C++ - Cplex problem de variable dans une boucle for & random[Objective C][Cocoa] Détecter si un host est accessible
[C#] Trier un tableau d'objetwarning: ISO C forbids assignment between function pointer and `void *
[C++] Vector class et pointer 
Plus de sujets relatifs à : [C] Pointer de pointer de pointer


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR