Utilisation d'un "vector" dans une structure

Signaler
Messages postés
4
Date d'inscription
jeudi 8 avril 2010
Statut
Membre
Dernière intervention
1 novembre 2010
-
Messages postés
4
Date d'inscription
jeudi 8 avril 2010
Statut
Membre
Dernière intervention
1 novembre 2010
-
Bonjour,
Je rencontre un soucis lorsque je veux utiliser un "vector" dans une structure. Je n'ai pas de soucis de compilation mais lors de l'exécution.

Voici le code qui définit ma structure :

struct grid
{
long ID;
double coord[3];
vector <long> elements;
};
grid noeud; // voici un élément (noeud) de cette strucutre

Lorsque j'essaie de rentrer des valeurs dans mon élément élémentaire par ce code :

noeud.ID=1;
noeud.coord[1]=15.2;
noeud.coord[2]=8.3;
noeud.coord[3]=7.2;
noeud.elements.push_back(10);

Mon programme plante lorsque le push_back tente de s'effectuer.
Je ne comprends pas du tout pourquoi.
J'ai recherché sur le net, mais pas de traces de ce genre de soucis.
Merci de votre aide.
Julien

6 réponses

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
Pour moi, ta vraie erreur, a été de faire commencer ton tableau coord à 1.
Un tableau commence à 0. Donc si tu as 3 éléments, alors le tableau va de 0 à 2 !

Ceci fonctionne très bien chez moi:
#include 
#include <vector>

struct Grid
{
  long id;
  double coord[3];
  std::vector<long> elements;
};

int main()
{
  Grid noeud;

  noeud.id = 1;
  noeud.coord[0] = 15.2;
  noeud.coord[1] = 8.3;
  noeud.coord[2] = 7.2;
  noeud.elements.push_back(10);

  return 0;
}


PS: Évite les using namespace std, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

________________________________________________________________________
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
Messages postés
4
Date d'inscription
jeudi 8 avril 2010
Statut
Membre
Dernière intervention
1 novembre 2010

Merci de ta réponse très rapide!
J'ai vérifié ton code, il fonctionne parfaitement en effet.
Cependant dans mon application, cela ne fonctionne toujours pas.
j'appelle cette commande dans une fonction ou "noeud" n'est pas pris en paramètre, cela peut il poser problème?
Concernant ta remarque sur les tableaux, je suis au courant, mais j'ai décidé pour une lisibilité plus simple d'utiliser les indices 1,2 et 3 (je sais je gaspille de la mémoire ;-)).
Merci,
Julien
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
(je sais je gaspille de la mémoire ;-)).

Non, tu ne fait pas que gaspiller pas de la mémoire, tu créer surtout une erreur qui fait planter ton programme !!!
Si tu essaies d'aller à l'indice 3 d'un tableau de taille 3, c'est équivalent à accéder à l'élément 457892: tu es hors bornes et le comportement est donc indeterminé !
Ex: int tab[1];
tab[1] = 5; // Peut planter, corrompre ta mémoire, ou encore sileucieusement ne rien faire.

Je t'invite à te reseigner sur ce qu'est la pagination mémoire.

Concernant ta remarque sur les tableaux, je suis au courant, mais j'ai décidé pour une lisibilité plus simple d'utiliser les indices 1,2 et 3

Si tu fais du C, du C++, du Java ou dans quasiment tous les langages, un tableau commence à 0. Il faut t'y habituer. (On commence à 0, car on considère qu'un tableau est un pointeur, et qu'un pointeur décalé de 0, est le début du tableau).
C'est une base importante de l'informatique, ne l'ignore pas :p

Je pense que ton bug vient de tes indices de bornes. Corrige les. Si ça plante toujours, poste une partie de ton code ou tu penses qu'il y a un problème.

________________________________________________________________________
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
Messages postés
4
Date d'inscription
jeudi 8 avril 2010
Statut
Membre
Dernière intervention
1 novembre 2010

Mise à jour :
En regardant en détail, en fait ce sont mes tableaux qui me faisaient planter et pas mon instruction d'implémentation "push_back".
J'avais mis des system("pause") pour debugger et ça ne planter que pour l'instruction push_back alors que le problème était sur la ligne du dessus. (faut que j'arrête de changer de langage tous les 4 matins, ça fait faire des bêtises!!
Je me colle à la suite de mes soucis, en espérant être moins c..
Merci encore
Messages postés
11
Date d'inscription
vendredi 2 avril 2004
Statut
Membre
Dernière intervention
27 novembre 2010

J'arrive un peu après la bataille, mais je pense que l'info est utile.
En créant ta structure tu as en quelque sorte "aligné" en mémoire un long, 3 doubles et un vecteur de long.

En remplissant ton tableau, tu as décalé tous les indices en numérotant de 1 à 3 au lieu de 0 à 2. Les indices 1 et 2 se sont décalés d'un cran, mais l'indice 3 a carrément été inscrit en dehors des limites du tableau, et tu as donc inscrit ton double dans la zone mémoire ou était inscrit le vecteur.

D'ou le crash au moment d'y accéder, tu demande l'accès à un pointeur que tu as écrasé.

Cela dit, je rejoins le post précédent, c'est une très grosse erreur de vouloir numéroter tes tableaux à partir de 1. Tu peux penser que c'est plus simple, mais dans le developpement tu va être amené à manipuler du code qui n'est pas de toi, et on va être amené à manipuler ton code. Cela nécéssite des conventions et c'est mieux de s'y plier.

A l'extrême limite, tu peux éventuellement te faire une fonction d'accès au tableau qui serait du genre :
long GetCoord(Grid _mygrid, int indice)
{
//petit assert pour vérifier que ton indice est bon
assert(indice>0 && indice <=3);
return_mygrid.coord[indice-1];//indice are starting at pos 1.
}
Messages postés
4
Date d'inscription
jeudi 8 avril 2010
Statut
Membre
Dernière intervention
1 novembre 2010

Je suis entièrement d'accord avec vous deux.
Mon soucis viens du fait que je programme trop souvent en vba où la définition des tableau est un peu différente. Je programme aussi dans des langages "exotiques" tels que PCL et TCL et j'ai tendance à avoir des petits soucis de temps en temps entre les définitions de chacuns.
Faut que je me fasse un petit lexique pour chaque.
Merci ballesteros, cela m'éclaire parfaitement sur mon erreur.
Je vais de ce pas, changer mon fusil d'épaule pour éviter des soucis à l'avenir!!
Encore Merci!