Problème de pointeur

Problème de pointeur - C++ - Programmation

Marsh Posté le 13-07-2008 à 20:44:55    

Salut à tous,
 
J'ai un problème avec un pointeur qui me rend fou  :pt1cable: !
En fait j'ai une fonction qui me crée un tableau dynamique pointé par le pointeur.
L'appel de la fonction ne crée pas de problème mais lorsque je veux accéder aux données du tableau après l'appel j'ai le droit à une erreur de segmentation.
 
Autre chose lorsque je met les deux fonctions dans le même fichier je n'ai pas l'erreur de segmentation et tout se passe bien.
 
J'utilise le compilateur g++.
 
graph.h :
 

Code :
  1. void LoadExample(GLfloat *curVertexArray);


 
graph.cpp :
 

Code :
  1. void LoadExample(GLfloat *curVertexArray)
  2. {
  3. curVertexArray = new GLfloat[6];
  4. curVertexArray[0] = 0;
  5. curVertexArray[1] = 0;
  6. curVertexArray[2] = 0;
  7. curVertexArray[3] = 1;
  8. curVertexArray[4] = 1;
  9. curVertexArray[5] = 1;
  10. }


 
main.cpp:
 

Code :
  1. #include"graph.h"
  2. GLfloat *Vertex;
  3. void InitGL(int Width, int Height)
  4. {
  5.     int i;
  6.     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  7.     glClearDepth(1.0);
  8.     glDepthFunc(GL_LESS);
  9.     glEnable(GL_DEPTH_TEST);
  10.     glShadeModel(GL_SMOOTH);
  11.     glMatrixMode(GL_PROJECTION);
  12.     glLoadIdentity();
  13.     gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
  14.     glMatrixMode(GL_MODELVIEW);
  15.     BuildFont();
  16.     InitConsole();
  17.     glEnable(GL_LIGHTING);
  18.     glEnable(GL_LIGHT0);
  19.     glEnableClientState(GL_VERTEX_ARRAY);
  20.     LoadExample(Vertex);
  21.     glVertexPointer(3,GL_FLOAT,0,Vertex);
  22.     for (i=0;i<6;i++)
  23.     {
  24.         printf("Vertex[%d]=%f\n",i,Vertex[i]);   //erreur de segmentation ici.
  25.     }
  26. }


 
Quelqu'un as une idée d'où vient le problème problème?
 
Merci d'avance pour vos réponses.
 
A++

Reply

Marsh Posté le 13-07-2008 à 20:44:55   

Reply

Marsh Posté le 13-07-2008 à 23:59:42    

Dans ta fonction, tu modifies la variable locale et donc ca n'a aucune influence à l'extérieur de ta fonction. Deux solutions donc : soit tu passes une référence vers ton pointeur dans ta fonction, soit (meilleure idée à mon avis) tu alloues ton tableau à l'extérieur de ta fonction.
Sinon, attention à ton utilisation de variables globales tout de même ... Ca semble assez peu justifié ici.

Reply

Marsh Posté le 14-07-2008 à 01:20:47    

Tu peut aussi retourner ton pointeur plutôt que de le prendre en paramètre et faire un truc du genre
 
Vertex = LoadExemple();
 
dans ce cas, LoadExemple ferait effet de constructeur (dans un style pauvre, ala C), et tu ferait peut-être mieux de créer une classe pour ça (ce qui au passage te permettra de gérer le delete de ton tableau avec moins de soucis).


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 14-07-2008 à 09:22:58    

et bon, std::vector quoi ...

Reply

Marsh Posté le 14-07-2008 à 15:33:55    

Salut à vous!
 
Merci pour vos réponses rapides, j'ai fais une Class et ça marche impec  :bounce: .
 
Sinon c'est quoi les avantages de std::vector ?
 
Merci encore A+.

Reply

Marsh Posté le 14-07-2008 à 15:39:32    

... c'est standard et certainement plus fool-proof que ta classe de tableau perso.
Juste pour voir, ta classe implante-elle une forme canonique de coplien propre ?

Reply

Marsh Posté le 14-07-2008 à 16:10:30    

Ok je vais voir pour le std::vector
 
Sinon je n'ai qu'un constructeur et un destructeur.
Est-ce que je risque d'avoir des problèmes si je ne fais pas la forme canonique de coplien?
 
A++

Reply

Marsh Posté le 14-07-2008 à 16:28:39    

theshockwave a écrit :

Dans ta fonction, tu modifies la variable locale et donc ca n'a aucune influence à l'extérieur de ta fonction. Deux solutions donc : soit tu passes une référence vers ton pointeur dans ta fonction, soit (meilleure idée à mon avis) tu alloues ton tableau à l'extérieur de ta fonction.
Sinon, attention à ton utilisation de variables globales tout de même ... Ca semble assez peu justifié ici.


 
Non il n'y a pas de problème à instancier un tableau de cette façon. La variable est locale mais pointe bien vers la même zone mémoire que celle qui est copiée. Mais pour les variables globales, je suis d'accord : à éviter.
Par contre tu as oublié de désallouer ton tableau avant la sortie de ton programme.

delete[] tableau

Reply

Marsh Posté le 14-07-2008 à 16:43:52    

katmai a écrit :

Ok je vais voir pour le std::vector
 
Sinon je n'ai qu'un constructeur et un destructeur.
Est-ce que je risque d'avoir des problèmes si je ne fais pas la forme canonique de coplien?
 
A++


 
amuses toi à renvoyer une instance de ta classe par valeur ou à utiliser l'opérateur = dessus ca va etre fun sans FCC

Reply

Marsh Posté le 14-07-2008 à 18:38:08    

Citation :

Par contre tu as oublié de désallouer ton tableau avant la sortie de ton programme.


 
Oui merci j'ai vu c'est pour faire des tests j'ai pas pris le temps de le faire.
 

Citation :

amuses toi à renvoyer une instance de ta classe par valeur ou à utiliser l'opérateur = dessus ca va etre fun sans FCC


 
Ok je vois! Par contre je ne peux pas utiliser std::vector car la fonction glVertexPointer me demande un pointeur vers un GLfloat et non pas un std::vector. Y a t'il une solution?
 
A+

Reply

Marsh Posté le 14-07-2008 à 18:38:08   

Reply

Marsh Posté le 14-07-2008 à 18:58:55    

Lire la doc de std::vector :o
 

Code :
  1. vector<GLfloat> stuff;
  2. //remplier stuff
  3. glVertexPointer( &stuff[0], ... );

Reply

Marsh Posté le 14-07-2008 à 23:45:23    

Ok merci ça marche!
 
A+

Reply

Sujets relatifs:

Leave a Replay

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