Problème tableau multi-dimensions

totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009 - 18 juin 2007 à 18:01
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 18 juin 2007 à 18:17
Bonjour!
j'utilise un tableau [i][3] mais il fait planté mon appli.
Je pense que je l'ai mal déclarer mais je vois pas mon erreur.
mes tableau accepte des nombres flottants.
Il fait planter mon programme dès que je veux écrire dedans:

Visual Studio just in time debugger:

"An unhandled Win 32 exception occured in Post Processing.exe

Exception non gérée à 0x00415767 dans CAPI_PostProcessing.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0xfdfdfdfd."

Voici mon prog raccourcis:

#include

"stdafx.h"#include

<conio.h>#include

#include

<fstream>#include

<string>#include

<cmath>#include

<conio.h>using

namespace std;
char

FileName[256]; 

 

bool

is_readable(
const string & file ) {

ifstream FileName ( file.c_str() );

return !FileName.fail(); }

 

void

_tmain(
int argc, _TCHAR* argv[]){

float CalValues;

float InitPointX,InitPointY;

float DistX,DistY;

char FileName[256];

char Psimu;fstream File;

string line;

float Power,Dir;

float DistRel,DistAbs;

int NbMeas;size_t size = line.size()+ 1000000;

char *InfoLine=
new
char[size];

int i,j,l,NbMaxValues;NbMaxValues=100000;

float ** ConvertValues;

float ** Values_To_At;

/*** allocation dynamique de mémoire ***/ConvertValues=

new
float *[NbMaxValues];Values_To_At=

new
float *[NbMaxValues];

for(i = 0; i<NbMaxValues;i++){

ConvertValues[i]=

new
float[2];}

for(l=0; l<NbMaxValues;l++){

Values_To_At[l]=

new
float[2];}

i=0;

if(File){

cout<<

"!!!file open!!!\n\n\n"<<endl;
//instructions

while ( getline( File, line ) ){

strncpy( InfoLine, line.c_str(), size );

if (strncmp(InfoLine,
";[GPS]",6)==0){

Dir=atof(InfoLine+72);

cout<<

"Direction:"<<Dir<<endl;}

else
if(strncmp(InfoLine,
";",1)!=0){

NbMeas=atof(InfoLine+0);

if (Psimu==
'Y'){

if(NbMeas<100){

Power=-90;

DistRel=atof(InfoLine+17);

}

else{

Power=-90;

DistRel=atof(InfoLine+18);

}

}

else
if(Psimu==
'N'){

if(NbMeas<100){

Power=atof(InfoLine+2);

DistRel=atof(InfoLine+17);

}

else{

Power=atof(InfoLine+3);

DistRel=atof(InfoLine+18);

}

}

cout <<

"Numero de mesure:"<< NbMeas<<
"\tPuissance:"<< Power<<
"\tDistance:" << DistRel<<
"\tDirection:"<<Dir << endl;Dir=(Dir*3.141592654)/180;

//conversion deg to radConvertValues[i][0]=DistRel;      //Mon PROGRAMME PLANTE ICI!!!

ConvertValues[i][1]=Dir;

ConvertValues[i][2]=Power;

i++;

}

/*** Calculation of course ***/i=0;

DistX=(InitPointX+(cos(Dir)*ConvertValues[i][0]))*CalValues;

DistY=(InitPointX+(sin(Dir)*ConvertValues[i][0]))*CalValues;

Values_To_At[i][0]=DistX;

Values_To_At[i][1]=DistY;

Values_To_At[i][2]=ConvertValues[i][2];

i++;

for(i=1;i<NbMaxValues;i++){

Values_To_At[i][0]=(Values_To_At[i-1][0]+(cos(Dir)*ConvertValues[i][0]))*CalValues;

Values_To_At[i][1]=(Values_To_Atl[i-1][0]+(sin(Dir)*ConvertValues[i][0]))*CalValues;

Values_To_At[i][2]=ConvertValues[i][2];

}

}

}

else{

cout <<

"Impossible d'ouvrir le fichier !" << endl;

return ;
//l'ouverture à échoué, on quitte...}

File.close();

delete [] InfoLine;

delete ConvertValues;

delete Values_To_Atoll;

/*** Fin du programme ***/

return}mon programme récupère des infos dans un fichier. Ces infos sont enregistrer dans mon tableau puis convertit pour être envoyé vers un autre tableau qui me permettra d'écrire un fichier avec mes infos convertit.

Quelqu'un pourrai m'aidé?

Je vous remercie.
Cordialement

1 réponse

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
18 juin 2007 à 18:17
Ton code est extrêmement dur à lire.

J'ai tout de même repéré ceci:
ConvertValues[i]=

newfloat[2];

ainsi que

Values_To_At[l]=

newfloat[2];

avec

ConvertValues[i][2]=Power;

et

Values_To_At[i][2]=ConvertValues[i][2];

Tu alloues de la mémoire pour 2 float mais tu essais d'en stocker 3.
Aussi, je ne vois aucun endroit ou tu test i dans ta boucle while(getline...). D'après ce que je peux comprendre, s'il y a plus de 3 lignes, tu écris en dehors du buffer.

Dans les deux cas si-dessus, tu as un buffer overflow.

C++ (@++)<!--
0