probleme con avec new

probleme con avec new - C++ - Programmation

Marsh Posté le 21-03-2004 à 15:39:54    

j'ai (à nouveau) un petit probleme
sauf que cette fois-ci, mon probleme vient d'un new.
Je veux créer un tableau à deux dimensions et la, quelque chose de bizzare se passe :
lorsque j'écris  

Code :
  1. int ** a;
  2.   *a=new int[3];
  3.   for (int i=0;i<3;i++)
  4.     a[i]=new int [4];


cela compile bien.
 
Par contre, je veux faire maintenant la meme chose sauf que  
- ce sont des float et pas des entiers (ca ca pose pas de probleme)
- le "a" est déclaré dans une structure
j'écris donc

Code :
  1. config.*donnees=new float [nb_series];
  2.   for (int i=0;i<nb_series;i++)
  3.     config.donnees[i]=new float[nb_exemples];
  4.   int i=0;
  5.   int j=0;
  6.   while(std::getline(fichier, ligne))
  7.     {
  8.       std::istringstream flig(ligne);
  9.       while (flig >> x)
  10.         {
  11.           config.donnees[i][j]=x;
  12.           j++;
  13.         }
  14.       i++;
  15.     }


 
L'erreur qu'il renvoie est :

Citation :


g++ -c fonctions.cc -o fonctions.o
fonctions.cc: In function `configuration init_conf()':
fonctions.cc:101: `donnees' undeclared (first use this function)
fonctions.cc:101: (Each undeclared identifier is reported only once for each function it appears in.)
make: *** [fonctions.o] Erreur 1


 
Pourtant, il connait bien config.donnees, j'ai vérifié.
 
A la place de la ligne config.*donnees=new float [nb_series]; j'ai essayé aussi *config.donnees=new float [nb_series]; et la mise en commentaire de cette ligne. A chaque fois ca compile mais ca renvoie une segmentation fault à l'execution du programme.
 
Vous savez ce qui peut merder ?
aidez moi je suis un peu desesperé :D

Reply

Marsh Posté le 21-03-2004 à 15:39:54   

Reply

Marsh Posté le 21-03-2004 à 15:44:20    

Library a écrit :

cela compile bien.


Ouais, ça compile.
Mais c'est tout.
 
Et puis *(config.donnees)


Message édité par verdoux le 21-03-2004 à 15:44:33
Reply

Marsh Posté le 21-03-2004 à 15:53:44    

verdoux a écrit :


Ouais, ça compile.
Mais c'est tout.
 
Et puis *(config.donnees)


 
*(config.donnees) ca fait segmentation fault aussi ;)
 
mais c'est vrai que j'ai pas vérifié qu'il y avait pas de segmentation fault avec mon exemple du début...
alors, c'est quoi le secret pour créer un tableau à deux dimensions en C++ ?

Reply

Marsh Posté le 21-03-2004 à 16:10:01    

int ** a;
    *a=new int[3];  
 
tu le sens pas bizarre le *a là ?

Reply

Marsh Posté le 21-03-2004 à 16:15:50    

c'est vrai que ca fait un peu bizzare
mais vu que ca compilait j'étais content :D
 
pour l'instant à l'aide de ce que j'ai trouvé sur internet j'en suis à :

Code :
  1. config.donnees=new float * [nb_series];
  2.   for (int k=0;k<nb_series;k++)
  3.     {
  4.       config.donnees[k]=new float [nb_exemples];
  5.     }


 
mais y a toujours une segmentation fault :(

Reply

Marsh Posté le 21-03-2004 à 16:18:48    

ben tu foires ailleurs qu'est-ce qu'on y peut ...
 
t'es sur que ton j dépasse pas nb_exemples-1 ?

Reply

Marsh Posté le 21-03-2004 à 16:31:00    

ca foire ailleurs que lorsque je rentre les données apparamment
à la fin j'ai mis  

Code :
  1. std::cout << "ok3";
  2.   fichier.close();
  3.   std::cout << "ok2";
  4.   std::cout << config.donnees[0][0] << std::endl;
  5.   std::cout << "ok";
  6.   return config;


 
à ce moment ca m'affiche "ok3ok20.0193785
Segmentation fault"
 
mais si je mets

Code :
  1. std::cout << "ok3";
  2.   fichier.close();
  3.   std::cout << "ok2";
  4.   //std::cout << config.donnees[0][0] << std::endl;
  5.   std::cout << "ok";
  6.   return config;


 
ca affiche juste "segmentation fault"
bizzare bizzare...

Reply

Marsh Posté le 21-03-2004 à 16:32:47    

1) pas la peine de fermer les fichier, le destructeur le fait tout seul
2) mais std::flush après ton dernier ok
3) montre le prototype de ta fonction et la définition de ta classe config

Reply

Marsh Posté le 21-03-2004 à 16:37:41    

avec le std::flush ca m'affiche bien ok3ok2ok avant de faire la segmentation fault
le prototype et la définition sont la :

Code :
  1. struct configuration
  2. {
  3.   int nbcouches;
  4.   int *dim;
  5.   int *couche;
  6.   int * fonction;
  7.   float eta;
  8.   float ** donnees;
  9. };
  10. configuration init_conf ();

Reply

Marsh Posté le 21-03-2004 à 16:40:13    

dis-moi, tu serais pas un rigolo qui fait du C avec des class^struct enfin du C avec des cout en bref ...
 
ben prends ton débuggeur et trouve ou ça plante. sinon apprends le C++. on peut rien faire d'autre pour toi


Message édité par Taz le 21-03-2004 à 16:40:18
Reply

Marsh Posté le 21-03-2004 à 16:40:13   

Reply

Marsh Posté le 21-03-2004 à 17:00:21    

ben j'ai aucune formation en programmation, j'ai tout appris tout seul avec juste l'aide de quelques forums et d'internet. J'ai appris les bases du C l'année dernière et là j'avais besoin des classes pour avoir un programme plus lisible donc je me suis dit que j'allais faire mon programme en C++ mais effectivement, je connais juste les bases de ce langage donc dès que ca foire je trouve pas les solutions (ca doit etre propre à tous les débutants ca)
 
sinon un debuggeur y en a bien un intégré à emacs mais je sais pas m'en servir donc...
 
enfin si t'as pas la solution à mon problème de segmentation fault je concois très bien que ca puisse t'emmerder d'aider quelqu'un qui n'y connait rien, mais si t'as la solution s'il te plait donne la, c'est un des seuls points qui pose problème à programmer et le reste je devrais y arriver.

Reply

Marsh Posté le 21-03-2004 à 17:02:27    

les solutions je te les ai déjà données

Reply

Marsh Posté le 21-03-2004 à 17:08:11    

ah oui j'avais oublié de remettre j à 0 au début de la boucle, c'est vraiment trop con comme erreur (et ca l'est encore plus de rester bloqué 45 min dessus)
merci pour les réponses que tu m'as apportées :)

Reply

Marsh Posté le 21-03-2004 à 17:11:10    

(encore un exemple d'un débutant qui s'est lancé et qui est dans le mur depuis le départ)

Reply

Marsh Posté le 21-03-2004 à 17:20:41    

Taz a écrit :


t'es sur que ton j dépasse pas nb_exemples-1 ?

moi je parle dans le vide sinon

Reply

Marsh Posté le 21-03-2004 à 18:23:28    

heu je suis debutant en c++ aussi, mais si j'ai bien compris, les class c'est fait pour "remplacer" les structures non ?
 
donc library ce que tu devrais faire c'est:
 

Code :
  1. class configuration
  2.   {
  3.       public:
  4.       init_conf();
  5.       private:
  6.       int nbcouches;
  7.       int *dim;
  8.       int *couche;
  9.       int * fonction;
  10.       float eta;
  11.       float ** donnees;
  12.   };


 
taz, tu confirme ?
 


---------------
Découvre le HFRcoin ✈ - smilies
Reply

Marsh Posté le 21-03-2004 à 18:25:05    

Fabien a écrit :

heu je suis debutant en c++ aussi, mais si j'ai bien compris, les class c'est fait pour "remplacer" les structures non ?
 
donc library ce que tu devrais faire c'est:
 

Code :
  1. class configuration
  2.   {
  3.       public:
  4.       init_conf();
  5.       private:
  6.       int nbcouches;
  7.       int *dim;
  8.       int *couche;
  9.       int * fonction;
  10.       float eta;
  11.       float ** donnees;
  12.   };


 
taz, tu confirme ?
 
 

tu n'as absolument rien compris. c'est pire, archi pire ... la notion de constructeur ça vous dit quelque chose ?

Reply

Marsh Posté le 21-03-2004 à 18:26:04    

ca va mal finir encore :)

Reply

Marsh Posté le 21-03-2004 à 18:26:39    

Taz a écrit :

tu n'as absolument rien compris. c'est pire, archi pire ... la notion de constructeur ça vous dit quelque chose ?

oui, et ?


---------------
Découvre le HFRcoin ✈ - smilies
Reply

Marsh Posté le 21-03-2004 à 18:27:07    

xterminhate a écrit :

ca va mal finir encore :)

quand tu maitrises pas le sous ensemble qu'est le C au C++, c'est pas la peine d'aller plus loin

Reply

Marsh Posté le 21-03-2004 à 18:27:25    

Fabien a écrit :

oui, et ?
 

la preuve est faite que non

Reply

Marsh Posté le 21-03-2004 à 18:28:21    

Taz a écrit :

la preuve est faite que non

ha j'avais pas vu qu'il voulais initialiser qqchose [:dawa]


---------------
Découvre le HFRcoin ✈ - smilies
Reply

Marsh Posté le 21-03-2004 à 18:29:01    

il faut mettre dans le constructeur les allocations de pointeur, et dans le destructeur les desallocations corspondantes. Mais le mieux serait peut etre de virer tous les pointeurs...
 

Code :
  1. struct configuration
  2. {
  3. configuration(); // construct
  4. ~configuration(); // destruct
  5. int nbcouches;
  6. int *dim;
  7. int *couche;
  8. int * fonction;
  9. float eta;
  10. float ** donnees;
  11. };

Reply

Marsh Posté le 21-03-2004 à 18:30:06    

xterminhate a écrit :

il faut mettre dans le constructeur les allocations de pointeur, et dans le destructeur les desallocations corspondantes. Mais le mieux serait peut etre de virer tous les pointeurs...
 

Code :
  1. struct configuration
  2. {
  3. configuration(); // construct
  4. ~configuration(); // destruct
  5. int nbcouches;
  6. int *dim;
  7. int *couche;
  8. int * fonction;
  9. float eta;
  10. float ** donnees;
  11. };



et voilà, ça va encore segfaulter ...

Reply

Marsh Posté le 21-03-2004 à 18:31:29    

c'est clair, mais faut bien les guider pas à pas ?!

Reply

Marsh Posté le 21-03-2004 à 18:33:56    

xterminhate a écrit :

c'est clair, mais faut bien les guider pas à pas ?!

pas comme ça. il faut qu'il comprenne d'abord ce qui ce passe quand on manipule une struct C

Reply

Marsh Posté le 21-03-2004 à 18:36:01    

C++ et STL fournissent suffisament d'argument pour éviter au maximum les pointeurs dans les class/struct. Remplacer les pointeurs permettrait de fiabiliser le code dans un premier temps.

Reply

Marsh Posté le 21-03-2004 à 21:36:46    

Taz a écrit :

les solutions je te les ai déjà données


 
Taz t'es ptèt pas mauvais en C++ mais oublies pas que tu as été de leur niveau il n'y a pas forcément TROP longtemps... t'as aussi le droit de rester cordial sur le forum ou de t'abstenir de répondre.

Reply

Marsh Posté le 21-03-2004 à 21:39:08    

peut être. je dis juste que passer au C++ alors qu'on ne sais pas allouer correctement une maitrise, c'est la preuve que ce n'était pas le moment de migrer. il y a tant de choses dans le C qui sont intéressantes et complexes à maitriser, sans qu'on ait besoin de se lancer dans le C++, qui repose sur de nombreux mécanismes basiques du C

Reply

Marsh Posté le 21-03-2004 à 21:44:50    

Taz a écrit :

peut être. je dis juste que passer au C++ alors qu'on ne sais pas allouer correctement une maitrise, c'est la preuve que ce n'était pas le moment de migrer. il y a tant de choses dans le C qui sont intéressantes et complexes à maitriser, sans qu'on ait besoin de se lancer dans le C++, qui repose sur de nombreux mécanismes basiques du C

mais on fait pas toujours ce que l'on veut dans la vie, moi je suis obligé de faire un prog en c++, donc voila [:spamafote]


---------------
Découvre le HFRcoin ✈ - smilies
Reply

Marsh Posté le 21-03-2004 à 21:48:34    

tu ne m'a pas compris. le C peut être vu comme un sous ensemble du C++. pas la peine d'utiliser des concepts non maitrisés du C++ quand on a des lacunes en C. si tu commences à nous faire une struct avec une fonction membre init, pour ma part de préfère encore une fonction globale init et une approche classique à la C. donc encore une fois : pour bien comprendre le C++, il faut __d'abord__ s'assurer des bases correcte de ce sous ensemble qu'est le C, pour __ensuite__ étudier les apports du C++ notemment côté objet.

Reply

Marsh Posté le 21-03-2004 à 22:11:30    

mais quand on a jamais étudié ces langages avec quelqu'un qui s'y connait et qui peut donner des conseils, faire éviter les erreurs connes, quelqu'un qui trouve un moyen pour expliquer simplement les choses, on fait comment ?
Est ce que tu as appris ces langages tout seul en quelques heures ? Sincèrement je ne pense pas, et meme si tu es juste arrivé à ce niveau de maitrise sans aide extérieure je te félicite vraiment.
Mais je n'ai pas eu assez de cours en info (et surtout les cours étaient à un niveau très faible. C'est pour dire, je suis dans les meilleurs de la promo en programmation) et je suis meme pas sur que les profs d'info qu'on a connaissent assez les subtilités du C et C++ pour les expliquer voire pourl es comprendre.
En bref, je n'ai pas eu de formation sérieuse dans ces langages, et je dirais meme que ce n'est pas ma vocation. Je programme de temps en temps mais je ne suis pas expert dans le domaine.

Reply

Marsh Posté le 21-03-2004 à 22:28:35    

moi quand je veux apprendre quelques choses, je fais chapitre par chapitre, je m'amuse pas à lire les derniers chapitres alors que j'ai pas terminée la première partie. tu ne devrais pas être confronter à ce genre d'erreur à ce niveau, c'est la preuve de lacunes et d'imcompréhension de la couche objet. c'est tout ce que j'ai a dire.

Reply

Marsh Posté le 21-03-2004 à 22:48:48    

je suis d'accord que la méthode la plus efficace pour apprendre c'est de prendre un bouquin et de lire tous les chapitres.
Mais dans mon cas c'est différent : je programme occasionnellement et je connais juste les bases. Je pense connaitre assez les bases pour ne pas être bloqué à chaque ligne et comme je programme rarement, je prefere me lancer directement dans le programme que j'ai à faire. Bien sûr, je suis obligé de demander de l'aide pour les passages un peu complexe, mais comme j'écris environ un programme par an je ne veux pas investir trop de temps dans l'apprentissage de quelque chose que j'aurai de toutes facons oublié pour mon prochain programme.
Mon but n'est pas de connaitre à fond le langage pour pouvoir développer facilement tous mes programmes, mon but est de connaitre assez le langage pour ne pas être trop bloqué lorsque j'écris mon programme annuel.

Reply

Marsh Posté le 21-03-2004 à 22:52:39    

ben prends un langage plus simple alors :o

Reply

Marsh Posté le 21-03-2004 à 22:57:34    

Taz a écrit :

ben prends un langage plus simple alors :o


 
lol ;)
en fait j'avais deja fait ce programme l'année dernière, en C, et c'etait un bordel immonde avec tous les indices des tableaux (faut dire que les tableaux tridimensionnels ca aide pas)
la pour un autre projet je me suis dit que j'allais reprendre la meme idée, mais l'ancien programme était tellement merdique que c'etait impossible de le reprendre, et je me suis dit que pour faire un code plus lisible il faudrait que j'utilise des objets, d'où le C++.
voila mes motivations ;)

Reply

Marsh Posté le 21-03-2004 à 22:59:06    

Fais à l'ancienne en php [:xfred4]  
 
 
 ;)

Reply

Marsh Posté le 21-03-2004 à 23:00:35    

Limit a écrit :

Fais à l'ancienne en php [:xfred4]  
 
 
 ;)  


 
ah oui c'est vrai, j'ai meme fait le programme en php mais c'etait tellement lent que j'ai du apprendre le C pour faire mon programme :D

Reply

Marsh Posté le 21-03-2004 à 23:01:27    

enfin faire des calculs de réseaux neuronaux le php était pas tellement adapté :D

Reply

Marsh Posté le 21-03-2004 à 23:02:20    

Library a écrit :


reprendre, et je me suis dit que pour faire un code plus lisible il faudrait que j'utilise des objets, d'où le C++.

le fait est que tu ne le fais pas

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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