STD::list, un problème lors de l'utilisation d'attributs de type liste dans un o

mohamed_bn Messages postés 47 Date d'inscription jeudi 9 novembre 2000 Statut Membre Dernière intervention 10 septembre 2010 - 10 sept. 2010 à 19:26
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 11 sept. 2010 à 03:08
Bonjour,

J'ai une structure comme suit:
typedef struct DataFlow : public cObject {

std::list receivedPackets;
int numberOfPacketsNotYetAcknowledged;
...
}DataFlow;
puis, j'utilise un tableau de structure "Dataflow" (de même pour vecteur d'objets Dataflow).
Lorsque je stocke des éléments à cette liste, l'insertion se déroule correctement comme prévue (j'ai vérifié ceci dans la même fonction qui fait l'insertion).
Le problème c'est que lorsque je recherche par la suite l'un des éléments déjà insérés dans la liste (à partir du programme principal) je trouve que ça n'existe pas (et la taille de la liste est nulle). Au même temps, les autres attributs de type int, double,... sont bien remplis et contiennent les informations insérés.
Je voudrai bien savoir comment faire pour créer un attribut de type liste dans ma structure.
J'aime clarifier que tout marche correctement lorsque j'insère des éléments à un objet de type Dataflow et le problème apparait que lorsque j'utilise un tableau ou vecteur de strucure Dataflow

merci de m'aider à trouver une solution pour ce problème car le container list est le plus adéquat dans ma situation

med belhassen

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
10 sept. 2010 à 21:50
Déjà en C++, une structure est une classe dont la visibilité est publique par défaut.
Donc on écrit:
struct DataFlow : public cObject
{
  std::list receivedPackets;
  int numberOfPacketsNotYetAcknowledged;
...
};

ou
class DataFlow : public cObject
{
public:
  std::list receivedPackets;
  int numberOfPacketsNotYetAcknowledged;
...
};

(C'est pareil)


Je ne vois pas d'erreur dans ce que tu as fait, donc ton problème vient d'ailleurs (fais voir les morceaux de code qui exploitent ta structure).

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
mohamed_bn Messages postés 47 Date d'inscription jeudi 9 novembre 2000 Statut Membre Dernière intervention 10 septembre 2010
10 sept. 2010 à 22:14
voici les méthodes qui exploitent la structure Dataflow:
void insertPacketSequenceNumber(uint16_t sequenceNumber)
{
receivedPackets.push_back(sequenceNumber);
numberOfPacketsNotYetAcknowledged++;
}

bool lookupPacketSequenceNumber(uint16_t sequenceNumber)
{
for (std::list::iterator it= receivedPackets.begin();it!=receivedPackets.end();it++)
{
if ((*it)==sequenceNumber)
return true;
}
return false;
}

void addDataPacketSequenceNumberToItsDataFlow(nsaddr_t source,nsaddr_t destination, uint16_t sequenceNumber)
{
DataFlow *f=getFlow(source,destination);
if(f!=NULL)
{
f->insertPacketSequenceNumber(sequenceNumber);
}
else
{
dataFlows_t[currentNumberOfFlows].insertPacketSequenceNumber(sequenceNumber);
dataFlows_t[currentNumberOfFlows].flowSource=source;
dataFlows_t[currentNumberOfFlows].flowDestination=destination;
currentNumberOfFlows++;
}
}


DataFlow* getFlow(nsaddr_t src, nsaddr_t dest)
{
for(uint i=0;i<currentNumberOfFlows;i++)
{
//DataFlow * f=check_and_cast<DataFlow*>(*it);
if((dataFlows_t[i].flowSource==src)&&(dataFlows_t[i].flowDestination==dest))
return &dataFlows_t[i];
}
return NULL;

}

dans le programme principal: le tableau de structures Dataflow est déclaré et instancié comme suit:
Déclaré:
typedef std::list<DataFlow*> DataFlows_t;
DataFlow *dataFlows_t;
Instancié:
dataFlows_t= new DataFlow[taille];

J'ai essayé même le container deque et il pose le même problème
Cordialement,
mohamed belhassen
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 sept. 2010 à 03:08
Là, comme cela, je ne vois pas.
Peux-tu essayer de vérifier que tu ne copies pas la structure sans faire exprès ? Tu remplirais alors le tableau d'une de ses copies, ce qui expliquerais ton problème.

Voici un exemple qui pourrait être une piste:

void fillList(DataFlow dataFlow)
{
  dataFlow.receivedPackets ...
  // Ici tu remplis ta liste "receivedPackets"
}

typedef std::list<DataFlow*> DataFlows_t;
DataFlow *dataFlows_t;
//Instancié:
dataFlows_t = new DataFlow[taille];

fillList(dataFlows_t[0]); // On veut remplir le tableau du premier element.

//dataflows_t[0].size => 0 à cause de la copie.


Pour corriger mon exemple, j'ajouterais une référence pour éviter la copie:

void fillList(DataFlow& dataFlow)


________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous