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

  FORUM HardWare.fr
  Programmation
  C

  [resolu]allocation dynamique double pointeur passer en parametre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[resolu]allocation dynamique double pointeur passer en parametre

n°2035374
sliders_al​pha
Posté le 10-11-2010 à 22:41:58  profilanswer
 

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
mood
Publicité
Posté le 10-11-2010 à 22:41:58  profilanswer
 

n°2035388
olivthill
Posté le 11-11-2010 à 00:32:26  profilanswer
 

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.

n°2035389
sliders_al​pha
Posté le 11-11-2010 à 00:42:44  profilanswer
 

ç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;

n°2035390
mr simon
Posté le 11-11-2010 à 01:08:52  profilanswer
 

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" !

n°2035410
sliders_al​pha
Posté le 11-11-2010 à 11:29:04  profilanswer
 

it's working =O
 
merci beaucoup =D


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

  [resolu]allocation dynamique double pointeur passer en parametre

 

Sujets relatifs
float et double sur architecture 32bits[C] tableau dynamique 2 dimension
tableau 2D dynamiquePasser un argument à un batch sans passer par un fichier
tableau a deux dimension en parametrePB à l'affichage des actualités dynamique
passer dune image a une autrepasser une variable dans la clause where ... besoin d'aide
Création dynamique de boutons 
Plus de sujets relatifs à : [resolu]allocation dynamique double pointeur passer en parametre


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