begin process at 2012 02 09 20:03:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

c++ et delete


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

c++ et delete

vendredi 26 août 2005 à 11:49:10 | c++ et delete

anne-lise

Bonjour !

voila, j'ai un probleme lorsque je veux faire des delete sur des tableauz.

J'ai une fonction du type :
float* function(param, int n){
   float* l = new float[n];
   float* m = new float[n];
   float* y = new float[n];
   float* u = new float[n];

   corps de la fonction ou je manipule tout ca

   delete[] l;
   delete[] m;
   delete[] y;
   return u;
}
Ceci compile mais donne une erreur a l'execution : Debug Error, damage after normal block ...
Ca vient des delete mais je ne sais pas pourquoi. Comment faire mon delete sans provoquer d'erreur ? Pourquoi ceci ne marche pas


vendredi 26 août 2005 à 12:23:20 | Re : c++ et delete

cosmobob

salut,
donne le reste de ta fonction.
regarde aussi si t'as pas d'overflow (si tu fais float* m = new float[n], tu peux utiliser m[0] à m[n-1]. m[n] n'est pas valide !!!)

a+

vendredi 26 août 2005 à 13:26:55 | Re : c++ et delete

anne-lise

je ne pense pas que le probleme se situe dans le corp de la fonction car sans les delete je n'ai pas de probleme d'execution et qu'avec les delete le probleme se pose dans plusieures de mes fonctions. Je pense que c'est plutot dans la declaration que ca se passe, cela dit, voici la fonction :

 float* function(float alpha[], float gamma_l[], float gamma_u[], float d[], int n, int nbrow,int nbcolumn)
 {
  float*l;
  float*m;
  float*y;
  l = new float[n-nbcolumn];
  m = new float[n];
  y = new float[n];
  float* u = new float[n];

  for(int x=0;x<nbcolumn;x++){
   m[x*nbrow+0]=alpha[x*nbrow+0];
   for(int i=0;i<nbrow-1;i++){
    l[x*nbrow+i] = gamma_l[x*nbrow+i]/m[x*nbrow+i];
    m[x*nbrow+i+1] = alpha[x*nbrow+i+1]-l[x*nbrow+i]*gamma_u[x*nbrow+i];
   }
   
   y[x*nbrow+0] = d[x*nbrow+0];
   for(int j =1;j<nbrow;j++){
    y[x*nbrow+j] = d[x*nbrow+j] - l[x*nbrow+j-1]*y[x*nbrow+j-1];
   }

   u[x*nbrow+nbrow-1] = y[x*nbrow+nbrow-1]/m[x*nbrow+nbrow-1];
   for(int k = nbrow-2;k>=0;k--){
    u[x*nbrow+k] = (y[x*nbrow+k]-gamma_u[x*nbrow+k]*u[x*nbrow+k+1])/m[x*nbrow+k];
   }
  }
  /*delete[] l;
  delete[] m;
  delete[] y;*/
  return u;
 }

vendredi 26 août 2005 à 15:40:44 | Re : c++ et delete

cosmobob

comme prévu, ya sans doute overflow:
l[x*nbrow+i] = ...
que valent n, nbrow et nbcolumn ? j'ai supposé que n = nbrow * nbcolumn

essaye avec ce code la:

float* function(float alpha[], float gamma_l[], float gamma_u[], float d[], int n, int nbrow,int nbcolumn)
{
   float*l;
   float*m;
   float*y;
   l = new float[n-nbcolumn];
   m = new float[n];
   y = new float[n];
   float* u = new float[n];

   for(int x=0;x<nbcolumn;x++)
   {
      ASSERT(x*nbrow < n); // verifie les bornes pour m
      m[x*nbrow+0]=alpha[x*nbrow+0];
      for(int i=0;i<nbrow-1;i++)
      {
         ASSERT(x*nbrow+i < n-nbcolumn); // pour l
         l[x*nbrow+i] = gamma_l[x*nbrow+i]/m[x*nbrow+i];
         ASSERT(x*nbrow+i+1 < n); // pour m
         m[x*nbrow+i+1] = alpha[x*nbrow+i+1]-l[x*nbrow+i]*gamma_u[x*nbrow+i];
      }
      y[x*nbrow+0] = d[x*nbrow+0];
      for(int j =1;j<nbrow;j++)
      {
         ASSERT(x*nbrow+j < n); // pour y
         ASSERT(x*nbrow+j-1 < n-nbcolumn); // pour l
         y[x*nbrow+j] = d[x*nbrow+j] - l[x*nbrow+j-1]*y[x*nbrow+j-1];
      }
      ASSERT( x*nbrow+nbrow-1 < n);
      u[x*nbrow+nbrow-1] = y[x*nbrow+nbrow-1]/m[x*nbrow+nbrow-1];
      for(int k = nbrow-2;k>=0;k--)
      {
         ASSERT(x*nbrow+k < n);
         u[x*nbrow+k] = (y[x*nbrow+k]-gamma_u[x*nbrow+k]*u[x*nbrow+k+1])/m[x*nbrow+k];
      }
   }
   delete[] l;
   delete[] m;
   delete[] y;
   return u;
}


ca t'enverra une erreur Debug assertion failed si tu allais dépasser les bornes de tes tableaux de float.


vendredi 26 août 2005 à 15:47:59 | Re : c++ et delete

cosmobob

au fait, quand tu manipules les tableaux de cette maniere, tu fais du C et non du C++ !!
en C++, il y a le type vector pour gerer les tableaux, qui permet notamment de controler si tu débordes, et qui libere tout seul la memoire.

#include <vector>
using namespace std;

vector<float> gamma_u;
...
gamma_u.resize(n);
gamma_u[i] = 3.14; // pas de controle des bornes
//ou bien:
gamma_u.at(i) = 3.14; // lance une exception si i dépasse n-1

etc.



vendredi 26 août 2005 à 16:31:33 | Re : c++ et delete

anne-lise

il y avait effectivement un probleme dans les indices, merci !

Le plus etonnant c'est que malgre ce probleme, le programme avait des resultats coherents, j'ai donc pense a des problemes de declaration et non aux indices !
Merci !
Al



Cette discussion est classée dans : fonction, erreur, delete, float


Répondre à ce message

Sujets en rapport avec ce message

net use * /delete EN C++ [ par LeBobo ] Salut. J'ai un petit programme qui utilise la fonction : system(''net use * /delete'') ; Le problème est que mon programme à une interface graphique w Au secour ! [ par slashparof ] Au secour! Je ne comprend vraiment pas le problème visual studio me compile cette fonction correctement, mais mon programme cause une erreur quand j'a variable membre non static dans une fonction membre static [ par adrod ] J'ai une erreur du compilateur: Error C2597. Je suis allé sur msdn pour avoir plus de précision et ils me disent:To access the nonstatic member, you m Constructeur destructeur ? [ par Davy8x ] J'ai débuté un casse brique 3D en C++ OpenGL. J'ai j'uste programmé une balle qui se déplace en 3D, une sorte de bate (un paver) avec l'accélération e shellexecute et mfc [ par dambeaufort ] bonjour,je developpe actuellement une application sous mfc.dans cette application, j'ai besoin de d'ouvrir et de lancer des fichier. Pour se faire j'u Afficher une DialogBox [ par Gabi ] Donc, j,essai d'afficher une DialogBox juste après que ma fenêtre soit affichée. Mais ça ne marche pas. Aucune erreur de compilation, ni aucune erreur erreur de conception? [ par frdestroyers27 ] Salut a tous!ca serait pour savoir si je fait une erreur de conception!j'ai un fichier main.cpp avec la fonction WinMain dedans qui contient juste un pourquoi ca marche pas :'( [ par xboxut ] salut j ai un probleme avec une fonction pour initialiser des particules,pouvez vous me dire pourquoi il ne marche pas et comment le faire marcher#inc tableau a 2 dim [ par Kevin972 ] salut a tous!!g un probleme pour passer en parametre un tableau a 2 dimensions:fonction1(void){ float tab[400][400];............ fonction(tab);}fo Quelle est cette erreur __w64 ? [ par themaste ] Bonjour à tous!Je suis en train de faire un programme, que j'avais fais sous dos avant.Puisque ca marchait, je l'ai repris pour faire une application


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,342 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales