[resolu]allocation dynamique double pointeur passer en parametre

allocation dynamique double pointeur passer en parametre [resolu] - C - Programmation

Marsh Posté le 10-11-2010 à 22:41:58    

hi,
 
je dois transformer une liste chainé en tableau, et le prototype de la fonction qui fait ça m'est imposé.
 

Code :
  1. int VersTableau(struct wagon *l, long **t)


 
elle retourne la taille du tableau, comme vous pouvez vous en douter wagon est la tete de liste, et ce qui m'embette c'est l'**tab
 
ça me permet de recuperer l'adresse du tableay que je vais creer, mais j'arette pas de m'embrouiller
 
donc en gros je veux faire ça je pense :
 
http://img258.imageshack.us/img258/5650/fuckingdbp.jpg
 
le problemme est, comment l'ecrire?
 
voila mon main :
 

Code :
  1. int main(void)
  2.     {     
  3.     long length = 0;
  4.     long tab[] = {12,587,164,187,487,4154};
  5.     long **tablo;
  6.     struct wagon *chaine = NULL;
  7.     length = sizeof(tab)/4; //retourbne le nb d'octet que fait tab, donc div par 4
  8.     chaine = VersListeSL(tab, length);
  9.     AfficheLSC(chaine);
  10.    
  11.     //conversion de la chaine en tableau
  12.     versTableau(chaine, tablo);
  13.     system("pause" );
  14.     }


 
et voici la fonction :
 

Code :
  1. long versTableau(struct wagon *l, long **t)
  2.        {
  3.        //renvoi la taille du tab on passe la liste et un pointeur vers un pointeur de tableau
  4.      
  5.        //calculer la taille de la liste
  6.        //:stocker cette taille
  7.        //creer le tableau
  8.        //remplir le tableau
  9.        //revoyer la taille
  10.        long length = 0;
  11.        long counter = 0;
  12.        struct wagon *first = NULL;
  13.        first = l;//on sauvgarde le debut de la liste
  14.        while(l->suiv !=NULL) //on quitte la boucle a l'avant dernier wagon
  15.                      {
  16.                      counter++;
  17.                      l = l->suiv;
  18.                      }
  19.        counter++;
  20.        length = counter;
  21.        *t = new long[counter];
  22.      
  23.        l = first;
  24.        counter =0;
  25.        while(l->suiv != NULL)
  26.                      {
  27.                      system("pause" );
  28.                      *t[counter] = l->data;
  29.                      counter++;
  30.                      l = l->suiv;
  31.                      }
  32.        *t[counter] = l->data; //comme avant, un wagon avant
  33.        system("pause" );
  34.        return(length);
  35.        }


 
ça bug au moment du new :/
 
merci


Message édité par sliders_alpha le 11-11-2010 à 11:29:22
Reply

Marsh Posté le 10-11-2010 à 22:41:58   

Reply

Marsh Posté le 11-11-2010 à 00:32:26    

1. Ca ne bug pas. Ca émet un message d'erreur. Quel est ce message ? Les débutants ne lisent jamais les messages d'erreur. Parfois, ils sont trompeurs, mais souvent, ils donnent des indications précieuses.
 
2. new n'est pas une instruction du langage C, mais une instruction du langage C++.
Soit la question a été postée dans la mauvaise section du forum, soit il fallait utiliser malloc au lieu de new.
Si la compilation a été faite avec un compilateur C, cela ne passe pas, c'est normal.
Si la compilation a été faite avec un compilateur C++, cela aurait dû passer, s'il y a les bons includes.
 
Voir les tutoriaux sur l'allocation dynamique en C et en C++, par exemple http://www.yolinux.com/TUTORIALS/C [...] emory.html
 
3. Comme ce tableau ne doit pas être gigantesque, on peut faire ce programme sans utiliser l'allocation dynamique. C'est plus simple, et plus rapide à l'exécution.

Reply

Marsh Posté le 11-11-2010 à 00:42:44    

ça bug : la console crashe, pas de message
 
c'est du C/C++, c'est comme ça qu'on nous l'apprend en cours, quand je poste dans la categorie C++ on me dit en C++ on utilise de vecteur pas des tableau revient quand tu aura re-ecrit ton code
 
3/ l'allocation dynamique est imposé, exercice ecole, d'ailleur je vois pas pourquoi tu pense que le tableau n'est pas forcement grand, on converti une liste chainnée, celle ci peut avoir n'importe quelle taille
 
c'est pas vraiment a l'allocation que j'ai des problemme (je pense) mais plutot un cafouillage entre tout ces pointeur
 
j'ai fais ça histoire d'y voir plus clair
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. long testdp(long **tab);
  5. int main(void)
  6.     {
  7.     cout << "creation de *tablo\n";
  8.     long *tablo;
  9.     cout << "tablo = "<<tablo<<"\n";
  10.     cout << "*tablo = "<<*tablo<<"\n";
  11.     cout << "&tablo = "<<&tablo<<"\n\n";
  12.     cout << "passage de &tablo en parametre\n soit l'adresse de la case qui contient tablo\n\n";
  13.    
  14.     testdp(&tablo);
  15.     cout << "tablo[0] = "<<tablo[0]<<"\n";
  16.     cout << "tablo[1] = "<<tablo[1]<<"\n";
  17.     cout << "tablo[2] = "<<tablo[2]<<"\n";
  18.     cout << "tablo[3] = "<<tablo[3]<<"\n";
  19.     cout << "tablo[4] = "<<tablo[4]<<"\n";
  20.     cout << "tablo[5] = "<<tablo[5]<<"\n";
  21.     system("pause" );
  22.     }
  23. long testdp(long **tab)
  24.        {
  25.         cout << "nous voila dans la fonction\n";
  26.         cout << "\n";
  27.        
  28.         cout << "*tab = "<<*tab<<" = tablo\n";
  29.         cout << "**tab = "<<**tab<<" = *tablo\n";
  30.         cout << "tab = "<<tab<<" = &tablo\n";
  31.        
  32.         system("pause" );
  33.        
  34.         *tab = new long[6];
  35.        
  36.         cout <<"le new a retourner "<<*tab<<" et je l'ai mis dans *tab\n";
  37.        
  38.         system("pause" );
  39.        
  40.         cout << "je vais mettre 200 dans le contenue de "<<*tab<<"\n";
  41.         *tab[0] = 200;
  42.         cout << "je vais mettre 201 dans le contenue de "<<*tab+1<<"\n";
  43.         *tab[1] = 201;
  44.         cout << "je vais mettre 202 dans le contenue de "<<*tab+2<<"\n";
  45.         *tab[2] = 202;
  46.         cout << "je vais mettre 203 dans le contenue de "<<*tab+3<<"\n";
  47.         *tab[3] = 203;
  48.         cout << "je vais mettre 204 dans le contenue de "<<*tab+4<<"\n";
  49.         *tab[4] = 204;
  50.         cout << "je vais mettre 205 dans le contenue de "<<*tab+5<<"\n";
  51.         *tab[5] = 205;
  52.        
  53.         cout <<"\nremplissage du tableau effectué\n";
  54.         cout <<"sortie de la fonction\n\n";
  55.        }


 
la console crash a *tab[2] = 202;

Reply

Marsh Posté le 11-11-2010 à 01:08:52    

En faisant:

Code :
  1. (*tab)[1] = 201;
  2. (*tab)[2] = 202;


 
cela fonctionne, surement une regle de priorite des operateurs que j'ai oublie...
 
Liberer la memoire allouee est toujours une bonne pratique (derniere ligne du main):

Code :
  1. delete [] tablo


 
Tu devrais apprendre a utiliser un debugger, c'est quand meme bien plus pratique que des "print" !

Reply

Marsh Posté le 11-11-2010 à 11:29:04    

it's working =O
 
merci beaucoup =D

Reply

Sujets relatifs:

Leave a Replay

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