[C++] problème avec delete []

problème avec delete [] [C++] - C++ - Programmation

Marsh Posté le 08-05-2004 à 16:56:07    

bonjour à tous
 
J'ai un petit problème, et je pense que c'est du à delete[]. Je n'ai ni erreur de compilation, ni erreur de segmentation, mais mon programme s'arrete (sans me redonner la main) au milieu d'une boucle. Voici la portion de code qui pose problème :
 

Code :
  1. double * Reseau::Rcalcule_sortie (double * exemples)
  2. {
  3. // cette fonction s'occupe de calculer la sortie du réseau  
  4. cout << " a "<< flush ;
  5. // initialisation de l'entrée  
  6. double * Rentree=new double[Rnb_entrees[0]];
  7. for (int i=0;i<Rnb_entrees[0];i++)
  8. {
  9. Rentree[i]=exemples[i+Rdecalage]; // on remplit l'entrée avec les valeurs du vecteur d'entrée  
  10. }
  11. double * entree=new double[Rnb_entrees[0]];
  12. entree=Rentree; // entree est le vecteur d'entrée de la couche de neurones en cours  
  13. double * sortie=new double[Rcouche[0]]; // sortie est le vecteur de sortie de la couche de neurones en cours  
  14. cout << " b " << flush;
  15. // calcul couche par couche de la sortie  
  16. int nprec=0;
  17. for (int i=0;i<Rnbcouches;i++) // de la premiere à la derniere couche de neurones  
  18. {
  19. cout << Rnbcouches << flush;
  20. for (int j=0;j<Rcouche[i];j++) // du premier neurone de la couche au dernier  
  21. {
  22. sortie[j]=neurone[nprec+j].Ncalcule_sortie(entree); // on calcule la sortie  
  23. // du neurone en cours et on la rentre dans le vecteur de sortie  
  24. }
  25. nprec+=Rcouche[i]; // fait car les neurones sont ne sont pas indexés par couche  
  26. if (i!=Rnbcouches-1) // si on n'est pas sur la dernière couche de neurones  
  27. {
  28. cout << "!" << flush;
  29. // on veut ici dire que le vecteur de sortie de la couche en cours est le vecteur  
  30. // d'entrée de la couche suivante.  
  31. delete [] entree; // on efface entree, qui n'a plus d'utilité  
  32. entree=new double [Rcouche[i]]; // entree va etre de la taille de sortie  
  33. entree=sortie; // on met la sortie dans l'entrée  
  34. delete [] sortie; // on efface sortie, qui va etre de la taille du nombre de neurones  
  35. sortie=new double [Rcouche[i+1]]; // dans la couche suivante  
  36. cout << ";" << flush;
  37. }
  38. else // si la couche en cours est la derniere  
  39. {
  40. Rsortie=sortie; // on sauvegarde la sortie dans la variable de la classe Reseau  
  41. cout << "-" << flush;
  42. }
  43. }
  44. cout << "z" << flush;
  45. return Rsortie; // et on renvoie la sortie  
  46. }


 
dans ce code, le probleme est entre le cout << "!" << flush;  et le cout << ";" << flush; . Cette portion est exécutée environ 500 fois avant de s'arreter.
Vous auriez une idée de comment corriger ca ?
 
merci d'avance :)

Reply

Marsh Posté le 08-05-2004 à 16:56:07   

Reply

Marsh Posté le 08-05-2004 à 17:12:23    

entree=sortie; // on met la sortie dans l'entrée  
        delete [] sortie;
 
 
tu crois faire quoi là ? entree est dans le décor

Reply

Marsh Posté le 08-05-2004 à 18:23:11    

j'ai besoin de changer la taille de sortie, donc je pense qu'il faut le deleter avant non ?
ca marcherait si plutot que de faire entree=sortie, je copiais un à un les éléments de sortie dans entree ?

Reply

Marsh Posté le 08-05-2004 à 18:36:30    

je sais pas ce que t'as besoin de faire, je vois juste
 
         entree=new double [Rcouche[i]]; // entree va etre de la taille de sortie  
        entree=sortie; // on met la sortie dans l'entrée  
 
 
ça fuit comme un seau percé
 
entree=sortie; // on met la sortie dans l'entrée  
        delete [] sortie; // on efface sortie, qui va etre de la taille du nombre
 
corruption mémoire ...

Reply

Marsh Posté le 08-05-2004 à 19:15:23    

je vais prendre un exemple. On va dire qu'au début, entree est de dimension 5. Le programme va ensuite "transformer" ces entrées et va fournir, par exemple, 4 sorties (donc sortie est de dimension 4)
le truc, c'est que ces sorties vont être les futures entrées pour la couche d'après. Il faut donc que je sauvegarde sortie et que je le mette dans entree. C'est tout ce que je veux faire.
Mais pour ca, il faut bien que entree ait la meme taille que sortie non ? Et ensuite, sortie va devoir etre de dimension 3 (par exemple), donc je redimensionne sortie.
 
Et si je mettais entree et sortie de taille maximale (la taille maximum qu'ils peuvent prendre) et que je ne les delete pas, tu penses que ca marcherait ?

Reply

Marsh Posté le 08-05-2004 à 19:21:57    

je te lis pas, je m'intéresse pas à ton algo.
 
t'as rien bité aux pointeurs
 
forme toi ou passe à std::vector

Reply

Marsh Posté le 08-05-2004 à 19:26:16    

j'ai une connaissance assez limitée des pointeurs ;)
merci quand meme :)

Reply

Marsh Posté le 08-05-2004 à 19:30:19    

ben alors les utilises pas :o
 
 
tu te rends compte de ce que tu fais quand tu écris  
 
entree=new double [Rcouche[i]];
entree=sortie;
delete [] sortie;  

Reply

Marsh Posté le 08-05-2004 à 19:46:01    

y a pas trop le choix quand meme ;)
 
dans le code, là, d'abord je déclare que entree a une certaine taille, ensuite je dis que l'adresse mémoire d'entree vaut l'adresse mémoire de sortie, mais la troisieme ligne je sais pas trop comment elle est gérée. Soit ca supprime l'adresse mémoire de sortie, et donc celle d'entree, soit ca fait que supprimer la liaison entre sortie et son adresse mémoire, c'est ca que j'ignore.
Mais vu que ca seg fault pas, j'ai pensé que c'etait la deuxieme solution la bonne

Reply

Marsh Posté le 08-05-2004 à 19:58:26    

mais tu me parles de quoi là ?
 
 
d'abord je déclare que entree a une certaine taille, ensuite je dis que l'adresse mémoire d'entree vaut l'adresse mémoire de sortie
 
 
t'es dans l'incompréhension totale, t'es pas cohérent du tout en plus ... pour toi l'affectation à deux sens différents ...
 
 
 
allez utilise std::vector

Reply

Marsh Posté le 08-05-2004 à 19:58:26   

Reply

Marsh Posté le 08-05-2004 à 20:31:45    

utiliser std vector sera pas plus simple pour moi ;)
je vais d'abord essayer ce que j'ai mis plus haut, en esperant que ca marche.

Reply

Marsh Posté le 08-05-2004 à 20:42:35    

ça marchera pas, au mieux, ça fuira. t'es incapable de gérer la mémoire, c'est trop complexe pour toi. utilise std::vector et après, si tu y tiens vraiment, tu pourras retourner aux pointeurs :  comme ton algo fonctionne et ne s'occupe pas de la mémoire, ça sera plus facile. concentre toi sur ton algo, tu n'es pas capable de gérer la mémoire, et c'est de toute façon déconseillé de le faire de maniè-re brute

Reply

Marsh Posté le 08-05-2004 à 21:24:39    

Là suis franchement d'accord avec Taz, j'espère que c'est pour un truc perso qui ne sera jamais divulgué ...

Reply

Marsh Posté le 08-05-2004 à 21:48:27    

Cricri_ a écrit :

Là suis franchement d'accord avec Taz, j'espère que c'est pour un truc perso qui ne sera jamais divulgué ...


C'est pour le code de PyGTK. Le code est disponible :)

Reply

Marsh Posté le 08-05-2004 à 21:51:42    

belgique a écrit :

C'est pour le code de PyGTK. Le code est disponible :)

heink ?

Reply

Marsh Posté le 08-05-2004 à 22:00:21    

Cricri_ a écrit :

Là suis franchement d'accord avec Taz, j'espère que c'est pour un truc perso qui ne sera jamais divulgué ...


 
bien sûr, c'est perso ;)
j'ai pas la prétention de vouloir faire quelque chose de professionnel, loin de là.

Reply

Marsh Posté le 08-05-2004 à 22:01:02    


Humour foireux  :whistle:


Message édité par belgique le 08-05-2004 à 22:01:09
Reply

Marsh Posté le 08-05-2004 à 22:25:28    

Library a écrit :

bien sûr, c'est perso ;)
j'ai pas la prétention de vouloir faire quelque chose de professionnel, loin de là.

fais quelque chose qui marche

Reply

Marsh Posté le 08-05-2004 à 22:36:38    

crois bien que c'est là mon seul but ;)
que ce soit optimisé et propre, je m'en fous completement :)

Reply

Marsh Posté le 08-05-2004 à 22:48:35    

mais souvent optimisation et propreté sont voisines
et quelque chose qui marche vraiment doit être propre

Reply

Marsh Posté le 08-05-2004 à 23:07:51    

je veux quelque chose qui marchotte, qui est plus lent que ce que ca devrait etre, moins fonctionnel aussi, mais qui fais ce que je veux.

Reply

Marsh Posté le 08-05-2004 à 23:43:58    

:pfff:

Reply

Marsh Posté le 09-05-2004 à 00:07:12    

on a pas la meme conception de la programmation, c'est tout ;)

Reply

Marsh Posté le 09-05-2004 à 00:13:13    

ça c'est clair, tu bricoles

Reply

Marsh Posté le 09-05-2004 à 01:12:05    

Library a écrit :

on a pas la meme conception de la programmation, c'est tout ;)

Vaudrait peut etre pas employer ce terme, vu ta conception.
A+,

Reply

Marsh Posté le 10-05-2004 à 12:50:44    

entree=new double [Rcouche[i]];  
entree=sortie;  
delete [] sortie;
 
=> comment se tirer dans le pied en 3 lignes ^^


---------------
-( BlackGoddess )-
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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