Déclaration de structure...

Déclaration de structure... - C++ - Programmation

Marsh Posté le 24-05-2003 à 17:56:47    

Salut,
 
alors je me pose la question de savoir laquelle d'entre ces deux méthodes il est préférable d'utiliser:
 

  • Déclarer un vecteur de structures
  • Appeller une fonction qui remplit ce vecteur
  • Utiliser les données de ce vecteur dans la fonction appellante


ou bien:
 

  • Appeller une fonction qui déclare le vecteur de structures et qui le remplit
  • Dans la fonction appellante, redéclarer le vecteur pour l'utiliser


Je pense qu'il est préférable d'opter pour la première solution, puisqu'elle ne nécessite qu'une seule déclaration, mais c'est pour être sûr...
 
Merci d'avance


---------------
Another .Net Blog
Reply

Marsh Posté le 24-05-2003 à 17:56:47   

Reply

Marsh Posté le 24-05-2003 à 17:58:39    

gné, je capte pas tout, solution 1 je vais dire

Reply

Marsh Posté le 24-05-2003 à 20:26:07    

euuuh ... Je dirais simplement que ton vecteur doit être détruit au même niveau que celui où il est créé ... Mais pareil, c'est un peu short pour dire, là ...


---------------
last.fm
Reply

Marsh Posté le 24-05-2003 à 23:04:23    

Je pense qu'il est préférable de déclarer ton vecteur dans la fonction qui va l'utiliser. En effet, la déclaration va dépendre de l'utilisation. Dans certains cas, il vaudra mieux utiliser une allocation sur le tas et dans d'autre, sur la pile.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 25-05-2003 à 14:10:50    

++Taz a écrit :

gné, je capte pas tout, solution 1 je vais dire


 
Bon, ben un peu de code alors (il fonctionne, c'est pas un problème :D ):
 
J'ai deux structures et un vecteur:
 

Code :
  1. struct ContenuUneStatUnXML
  2. {
  3.         AnsiString NomStat;
  4.         vector<int> VecUneStatUnXML; //Contient chaque Frame
  5. };
  6. struct ContenuTtesStatUnXML
  7. {
  8.         AnsiString PathXML;
  9.         vector<ContenuUneStatUnXML> VecTtesStatUnXML;
  10. };
  11. vector<ContenuTtesStatUnXML> VecTtesStatsTsXML;


 
J'ai une fonction appellante MakeClip:
 

Code :
  1. vector<ContenuTtesStatUnXML> VecTtesStatsTsXML;
  2. VecTtesStatsTsXML.clear();
  3. ContenuUneStatUnXML CUSUX;
  4. ContenuTtesStatUnXML CTSUX;
  5. for (unsigned int i=0; i < VecSelectedIndex.size(); i++)
  6. {
  7.    int IndexDsContenu = VecSelectedIndex[i];
  8.    AnsiString PathXML = VecListeMatches[IndexDsContenu].PathFichierStats;
  9.    CTSUX.PathXML = PathXML;
  10.    if (!RemplirVecTSTX(VecTtesStatsTsXML,VecSelectedStats,CUSUX,CTSUX))
  11.                 return false;
  12.   //ICI ON UTILISE LE VECTEUR ET LES DONNEES QU'IL CONTIENT
  13. }


 
Et une fonction appellée RemplirVecTSTX, qui va chercher des infos dans un fichier XML et qui remplit les vecteurs de structures:
 

Code :
  1. bool __fastcall TListeMatchesForm::RemplirVecTSTX(
  2.                 vector<ContenuTtesStatUnXML> & VecTtesStatsTsXML,
  3.                 vector<int> & VecSelectedStats,
  4.                 struct ContenuUneStatUnXML & CUSUX,
  5.                 struct ContenuTtesStatUnXML & CTSUX)
  6. {
  7. XMLStats->FileName = CTSUX.PathXML;
  8. XMLStats->Active = true;
  9. if (!XMLStats->Active)
  10.    return false;
  11. _di_IXMLNode PtrContenu = XMLStats->DocumentElement;
  12. int NbreStatsChoisies = VecSelectedStats.size();
  13. for (int i=0; i < 2; i++)
  14. {
  15.    _di_IXMLNode PtrEquipe = PtrContenu->ChildNodes->GetNode(i);
  16.    AnsiString NomEquipe = PtrEquipe->GetAttribute("Equipe" );
  17.    _di_IXMLNode PtrStaff = PtrEquipe->ChildNodes->GetNode(0);
  18.    int NbreJoueurs = PtrStaff->ChildNodes->GetCount();
  19.        
  20.    CUSUX.VecUneStatUnXML.clear();
  21.    for (int j=0; j < NbreJoueurs; j++)
  22.    {
  23.       _di_IXMLNode PtrJoueur = PtrStaff->ChildNodes->GetNode(j);
  24.       AnsiString NomJoueur = AnsiString(PtrJoueur->GetAttribute("Nom" )).Delete(1,3);
  25.       if (EquipeChoisie || (AnsiString(NomJoueur) == NomSelectionne))
  26.       {
  27.          CTSUX.VecTtesStatUnXML.clear();
  28.          for (int k=0; k < NbreStatsChoisies; k++)
  29.          {
  30.             _di_IXMLNode PtrStatGlob = PtrJoueur->ChildNodes->GetNode(VecSelectedStats[k]);
  31.             int NbreStats = PtrStatGlob->ChildNodes->GetCount();
  32.                                
  33.             CUSUX.NomStat = pListeStats[VecSelectedStats[k]];
  34.             for (int l=0; l < NbreStats; l++)
  35.             {
  36.                _di_IXMLNode PtrStat = PtrStatGlob->ChildNodes->GetNode(l);
  37.                int FrameStat = PtrStat->GetNodeValue();
  38.                CUSUX.VecUneStatUnXML.push_back(FrameStat);
  39.             }
  40.             CTSUX.VecTtesStatUnXML.push_back(CUSUX);
  41.          }
  42.       }
  43.    }
  44.    if (EquipeChoisie && (NomEquipe == NomSelectionne))
  45.       break;
  46. }
  47. VecTtesStatsTsXML.push_back(CTSUX);
  48. return true;
  49. }


 
Bon alors ici je déclare le vecteur

Code :
  1. vector<ContenuTtesStatUnXML> VecTtesStatsTsXML;


et les structures

Code :
  1. ContenuUneStatUnXML CUSUX;
  2. ContenuTtesStatUnXML CTSUX;


dans la fonction appellante MakeClip et je les fais passer par référence à la fonction appellée RemplirVecTSTX, et je les utilise au retour de cette fonction...
 
C'est la solution 1...
 
La solution 2 consisterait à déclarer de la même manière mon vecteur et mes structures, mais dans RemplirVecTSTX, puis au retour de la fonction dans MakeClip, les redéclarer de la même manière pour les utiliser...
 
Et plus j'écris, plus je pense que c'est la solution 1 qui doit être utilisée... J'attends confirmation...
 
En espérant avoir été plus clair :)
 
Edit: typo


Message édité par haazheel le 25-05-2003 à 14:14:41

---------------
Another .Net Blog
Reply

Sujets relatifs:

Leave a Replay

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