Bonjour à tous,
voici mon problème.
J'ai les classes (simplifiées) suivantes:
Dans DS_CrossBar_Infos::Get_Pins() je remplis les vecteurs output_pins et
input_pins à coups de push_back:
output_pins.push_back(DS_CrossBar_Output_Pin(//...))
input_pins.push_back(DS_CrossBar_Input_Pin(//...))
Ensuite dans la fonction DS_CrossBar_Infos::Get_Relations_Pins() je
renseigne les membres *related_in, *routed_in...
Pour cela, je fais comme suit:
for (std::vector<DS_CrossBar_Input_Pin>::iterator input_pin =
input_pins.begin(); input_pin != input_pins.end(); ++input_pin)
{
//blabla
std::vector<DS_CrossBar_Input_Pin>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
input_pin->related_in = ite;
}
Comme vous le voyez j'attribue l'iterateur au pointeur related_in...
Ca compile, mais à l'execution j'ai une erreur...
J'imagine que ce n'est pas la bonne affectation, mais je ne vois pas
comment faire...
Bonjour à tous,
voici mon problème.
J'ai les classes (simplifiées) suivantes:
Dans DS_CrossBar_Infos::Get_Pins() je remplis les vecteurs output_pins et
input_pins à coups de push_back:
output_pins.push_back(DS_CrossBar_Output_Pin(//...))
input_pins.push_back(DS_CrossBar_Input_Pin(//...))
Ensuite dans la fonction DS_CrossBar_Infos::Get_Relations_Pins() je
renseigne les membres *related_in, *routed_in...
Pour cela, je fais comme suit:
for (std::vector<DS_CrossBar_Input_Pin>::iterator input_pin =
input_pins.begin(); input_pin != input_pins.end(); ++input_pin)
{
//blabla
std::vector<DS_CrossBar_Input_Pin>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
input_pin->related_in = ite;
}
Comme vous le voyez j'attribue l'iterateur au pointeur related_in...
Ca compile, mais à l'execution j'ai une erreur...
J'imagine que ce n'est pas la bonne affectation, mais je ne vois pas
comment faire...
Bonjour à tous,
voici mon problème.
J'ai les classes (simplifiées) suivantes:
Dans DS_CrossBar_Infos::Get_Pins() je remplis les vecteurs output_pins et
input_pins à coups de push_back:
output_pins.push_back(DS_CrossBar_Output_Pin(//...))
input_pins.push_back(DS_CrossBar_Input_Pin(//...))
Ensuite dans la fonction DS_CrossBar_Infos::Get_Relations_Pins() je
renseigne les membres *related_in, *routed_in...
Pour cela, je fais comme suit:
for (std::vector<DS_CrossBar_Input_Pin>::iterator input_pin =
input_pins.begin(); input_pin != input_pins.end(); ++input_pin)
{
//blabla
std::vector<DS_CrossBar_Input_Pin>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
input_pin->related_in = ite;
}
Comme vous le voyez j'attribue l'iterateur au pointeur related_in...
Ca compile, mais à l'execution j'ai une erreur...
J'imagine que ce n'est pas la bonne affectation, mais je ne vois pas
comment faire...
Tu fais peut-être la bonne affectation, le problème c'est que le
pointeur n'a probablement plus de sens au moment ou tu l'utilises.
std::vector invalide ses itérateurs sur deletion ou insertion
d'élements. En gros, quand tu modifies la taille d'un std::vector, il
peut réallouer les objets contenus et modifier leurs adresses.
Pour que ça marche, il faut t'interdire de modifier la taille (ou plus
généralement d'invoquer toute opération invalidant les itérateurs) du
vecteur après avoir pris l'adresse des éléments contenus.
Pour faire ça tu peux essayer de jouer avec "const" mais ça risque
d'être compliqué.
Par ailleurs, tu devrais passer ces membres "private", et protéger un
peu plus tes invariants d'objets (et commencer par les exprimer
clairement).
Tu fais peut-être la bonne affectation, le problème c'est que le
pointeur n'a probablement plus de sens au moment ou tu l'utilises.
std::vector invalide ses itérateurs sur deletion ou insertion
d'élements. En gros, quand tu modifies la taille d'un std::vector, il
peut réallouer les objets contenus et modifier leurs adresses.
Pour que ça marche, il faut t'interdire de modifier la taille (ou plus
généralement d'invoquer toute opération invalidant les itérateurs) du
vecteur après avoir pris l'adresse des éléments contenus.
Pour faire ça tu peux essayer de jouer avec "const" mais ça risque
d'être compliqué.
Par ailleurs, tu devrais passer ces membres "private", et protéger un
peu plus tes invariants d'objets (et commencer par les exprimer
clairement).
Tu fais peut-être la bonne affectation, le problème c'est que le
pointeur n'a probablement plus de sens au moment ou tu l'utilises.
std::vector invalide ses itérateurs sur deletion ou insertion
d'élements. En gros, quand tu modifies la taille d'un std::vector, il
peut réallouer les objets contenus et modifier leurs adresses.
Pour que ça marche, il faut t'interdire de modifier la taille (ou plus
généralement d'invoquer toute opération invalidant les itérateurs) du
vecteur après avoir pris l'adresse des éléments contenus.
Pour faire ça tu peux essayer de jouer avec "const" mais ça risque
d'être compliqué.
Par ailleurs, tu devrais passer ces membres "private", et protéger un
peu plus tes invariants d'objets (et commencer par les exprimer
clairement).
Michael wrote:Bonjour à tous,
voici mon problème.
J'ai les classes (simplifiées) suivantes:
En encore plus simplifié :
Michael wrote:
Bonjour à tous,
voici mon problème.
J'ai les classes (simplifiées) suivantes:
En encore plus simplifié :
Michael wrote:Bonjour à tous,
voici mon problème.
J'ai les classes (simplifiées) suivantes:
En encore plus simplifié :
Bon du coup j'ai changé mes vecteurs en:
std::vector<DS_CrossBar_Output_Pin *> output_pins;
J'insère comme suit:
output_pins.push_back(new DS_CrossBar_Output_Pin((name.Pos("Audio") == 0 ?
VIDEO : AUDIO),name,i));
et j'utilise comme ceci:
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
(*input_pin)->related_in = *ite;
Je n'ai plus qu'un seul problème:
class DS_CrossBar_Pin
{
private:
long num_pin;
public:
__fastcall DS_CrossBar_Pin();
bool __fastcall operator==(long _num_pin) const
{ return _num_pin == this->num_pin; }
};
Dans le code suivant:
long lRelated = 3;
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
J'ai le message d'erreur suivant:
[C++ Erreur] _algobase.c(102): E2034 Impossible de convertir 'const long'
en 'DS_CrossBar_Input_Pin *'
Je pense qu'il faut que je passe par une fonction boost ou quelque chose du
genre, mais je sais pas faire ça...
Par ailleurs, tu devrais passer ces membres "private", et protéger un
peu plus tes invariants d'objets (et commencer par les exprimer
clairement).
C'est à dire? Quels membres passer en private? Et c'est quoi des invariants
d'objets dans mon cas?
Bon du coup j'ai changé mes vecteurs en:
std::vector<DS_CrossBar_Output_Pin *> output_pins;
J'insère comme suit:
output_pins.push_back(new DS_CrossBar_Output_Pin((name.Pos("Audio") == 0 ?
VIDEO : AUDIO),name,i));
et j'utilise comme ceci:
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
(*input_pin)->related_in = *ite;
Je n'ai plus qu'un seul problème:
class DS_CrossBar_Pin
{
private:
long num_pin;
public:
__fastcall DS_CrossBar_Pin();
bool __fastcall operator==(long _num_pin) const
{ return _num_pin == this->num_pin; }
};
Dans le code suivant:
long lRelated = 3;
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
J'ai le message d'erreur suivant:
[C++ Erreur] _algobase.c(102): E2034 Impossible de convertir 'const long'
en 'DS_CrossBar_Input_Pin *'
Je pense qu'il faut que je passe par une fonction boost ou quelque chose du
genre, mais je sais pas faire ça...
Par ailleurs, tu devrais passer ces membres "private", et protéger un
peu plus tes invariants d'objets (et commencer par les exprimer
clairement).
C'est à dire? Quels membres passer en private? Et c'est quoi des invariants
d'objets dans mon cas?
Bon du coup j'ai changé mes vecteurs en:
std::vector<DS_CrossBar_Output_Pin *> output_pins;
J'insère comme suit:
output_pins.push_back(new DS_CrossBar_Output_Pin((name.Pos("Audio") == 0 ?
VIDEO : AUDIO),name,i));
et j'utilise comme ceci:
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
(*input_pin)->related_in = *ite;
Je n'ai plus qu'un seul problème:
class DS_CrossBar_Pin
{
private:
long num_pin;
public:
__fastcall DS_CrossBar_Pin();
bool __fastcall operator==(long _num_pin) const
{ return _num_pin == this->num_pin; }
};
Dans le code suivant:
long lRelated = 3;
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
J'ai le message d'erreur suivant:
[C++ Erreur] _algobase.c(102): E2034 Impossible de convertir 'const long'
en 'DS_CrossBar_Input_Pin *'
Je pense qu'il faut que je passe par une fonction boost ou quelque chose du
genre, mais je sais pas faire ça...
Par ailleurs, tu devrais passer ces membres "private", et protéger un
peu plus tes invariants d'objets (et commencer par les exprimer
clairement).
C'est à dire? Quels membres passer en private? Et c'est quoi des invariants
d'objets dans mon cas?
Bon du coup j'ai changé mes vecteurs en:
std::vector<DS_CrossBar_Output_Pin *> output_pins;
J'insère comme suit:
output_pins.push_back(new DS_CrossBar_Output_Pin((name.Pos("Audio") == 0 ?
VIDEO : AUDIO),name,i));
et j'utilise comme ceci:
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
(*input_pin)->related_in = *ite;
Je n'ai plus qu'un seul problème:
class DS_CrossBar_Pin
{
private:
long num_pin;
public:
__fastcall DS_CrossBar_Pin();
bool __fastcall operator==(long _num_pin) const
{ return _num_pin == this->num_pin; }
};
Dans le code suivant:
long lRelated = 3;
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
J'ai le message d'erreur suivant:
[C++ Erreur] _algobase.c(102): E2034 Impossible de convertir 'const long'
en 'DS_CrossBar_Input_Pin *'
Bon du coup j'ai changé mes vecteurs en:
std::vector<DS_CrossBar_Output_Pin *> output_pins;
J'insère comme suit:
output_pins.push_back(new DS_CrossBar_Output_Pin((name.Pos("Audio") == 0 ?
VIDEO : AUDIO),name,i));
et j'utilise comme ceci:
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
(*input_pin)->related_in = *ite;
Je n'ai plus qu'un seul problème:
class DS_CrossBar_Pin
{
private:
long num_pin;
public:
__fastcall DS_CrossBar_Pin();
bool __fastcall operator==(long _num_pin) const
{ return _num_pin == this->num_pin; }
};
Dans le code suivant:
long lRelated = 3;
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
J'ai le message d'erreur suivant:
[C++ Erreur] _algobase.c(102): E2034 Impossible de convertir 'const long'
en 'DS_CrossBar_Input_Pin *'
Bon du coup j'ai changé mes vecteurs en:
std::vector<DS_CrossBar_Output_Pin *> output_pins;
J'insère comme suit:
output_pins.push_back(new DS_CrossBar_Output_Pin((name.Pos("Audio") == 0 ?
VIDEO : AUDIO),name,i));
et j'utilise comme ceci:
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
if (ite != input_pins.end())
(*input_pin)->related_in = *ite;
Je n'ai plus qu'un seul problème:
class DS_CrossBar_Pin
{
private:
long num_pin;
public:
__fastcall DS_CrossBar_Pin();
bool __fastcall operator==(long _num_pin) const
{ return _num_pin == this->num_pin; }
};
Dans le code suivant:
long lRelated = 3;
std::vector<DS_CrossBar_Input_Pin *>::iterator ite = std::find
(input_pins.begin(),input_pins.end(),lRelated);
J'ai le message d'erreur suivant:
[C++ Erreur] _algobase.c(102): E2034 Impossible de convertir 'const long'
en 'DS_CrossBar_Input_Pin *'
Es-tu sûr d'avoir besoin de ces « __fastcall » ? Qu'est-ce que
c'est ?
Es-tu sûr d'avoir besoin de ces « __fastcall » ? Qu'est-ce que
c'est ?
Es-tu sûr d'avoir besoin de ces « __fastcall » ? Qu'est-ce que
c'est ?
Encore une fois tu peux t'en sortir, localement en faisant de la RAII,
ou avec des smart-pointers.
Encore une fois tu peux t'en sortir, localement en faisant de la RAII,
ou avec des smart-pointers.
Encore une fois tu peux t'en sortir, localement en faisant de la RAII,
ou avec des smart-pointers.