Plantage à la compilation

totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009 - 6 juin 2007 à 12:34
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 8 juin 2007 à 22:58
Bonjour,
Je développe un prograame afin de récupérer des infos de ma carte d'acquisition NI.
Je stock mes infos récupérer dans un tableau pour les réécrir par la suite dans un fichier.

Lorsque que je compile mon programme, il n'y as pas de problème

Mais quand je l'execute,  boite de dialogue Visual Studio Just In Time s'ouvre pour le débogage car:

"An unandled win32 exception occured in prog.exe"

Apparemment ce serait une violation d'accès lors de l'écriture de mes données dans mon tableau car quand je lance le déboggeur, un nouveau message apparait:

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

Voici le code pour écrire dans mon tableau:

double

* DistValues =NULL;

while

(!(Gps->isReady())){

DAQ.startMeasAbs();      // je lance ma mesure : 100 mesures en 10ms

Dist=DAQ.getDistAbs();   // je récupère mes infos

m=0;DistValues[m] =Dist;      // je stocke ma valeur dans mon tableau

//printf("mesure %i : %lf\n",k, Dist);

//Sleep(1);
m++;                           // j'incrémente m
k++;

}

Voilà, lorsque j'enlève l'écriture dans mon tableau tout fonctionne très bien.
J'avais déja eu ce problème et avec un Sleep c'était passer mais la ça ne fonctionne pas.
Peut être que mon PC n'est pas assez puissant, je stock 250 autres valeurs dans un autre tableau?

Quelqu'un pourrait il m'aider?

Je vous remercie.

13 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
6 juin 2007 à 12:40
DistValues[m] =Dist;


DistValues a été alloué ?

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
6 juin 2007 à 12:41
Autre chose, titre erroné, c'est plantage à l'exécution.
Donc erreur de code comme d'hab.

ciao...
BruNews, MVP VC++
0
totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009
6 juin 2007 à 14:07
Oui DistValue a été alloué.
Désolée pour le titre.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 juin 2007 à 15:10
Je ne vois que 2 possibilités.
Comme le dis BruNews, DistValue n'a pas reçu une zone mémoire
ou
Tu écris en dehors de la zone mémoire de DistValue.
Cependant, il serait très étonnant qu'il s'agisse de la 2ème possibilité car m, la variable qui permet d'écrire en mémoire, égal toujours à 0 dans ton code.
Je pencherais donc pour la première. DistValue n'a pas de mémoire car tout ce que l'on peut voir dans ton code c'est un pointeur qui pointe sur rien :
double *DistValue = 0;

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 juin 2007 à 15:18
Ou bien, une autre possibilité, tu n'alloues pas suffisamment de mémoire.

C++ (@++)<!--
0
totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009
6 juin 2007 à 16:08
Ok, merci, j'ai modifié mon code et ça fonctionne mieux.
Cependant, je ne peut plus enregistrer directement mes infos dans mon tableau.
Je suis obligé de passer par un pointeur:

Voici mon allocation de mémoire et mes modifs:

double

Dist=0;

double

** DistValues =NULL;

double *dist=&Dist;      // pointeur sur la valeur de Dist

for

(m=0; m<NUMBER_MAX_MEASURES; m++)      //allocation de mémoireDistValues[m] = (

double*)malloc(
sizeof(
double)*Dist);

while

(!(Gps->isReady())) //tant que le GPS n'est pas près, on fait les mesures.{

DAQ.startMeasAbs();      // lancement de la mesure

Dist=DAQ.getDistAbs();      // récupération de la mesure

DistValues[m] = dist;         // envoie de la valeur de Dist via le pointeur dist.

//printf("mesure %i : %lf\n",k, Dist);

//Sleep(1);m++;

k++;

}

delete DistValues;      //libération de la mémoire

Voilà, mais les valeurs que je récupère sont incorect.
Y a t'il une erreur dans mon code que je n'aurais pas vu?

Je vous remercie
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 juin 2007 à 16:16
C'est quoi tout ça ?
Pourquoi tu déclare un pointeur de pointeurs ? Et pourquoi tu n'alloue rien du tout à chacun des pointeurs ? (malloc(
sizeof(
double)*Dist) alors que Dist égal 0)

Un simple pointeur suffis amplement.

double *DistValue = (double*)malloc(nombrededouble*sizeof(double));
...
DistValue[m] = Dist;

C++ (@++)<!--
0
totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009
6 juin 2007 à 16:40
Ok merci,
c'est la première fois que j'alloue de la mémoire et je comprend pas trop:

j'ai modifié comme tu m'a dit:

double

* DistValues =NULL;
DistValues=(

double*)malloc(NUMBER_MAX_MEASURES *
sizeof(
double));

par contre il faut que je modifie aussi ce code:

for

(m=0; m<NUMBER_MAX_MEASURES; m++)DistValues[m] = (

double*)malloc(
sizeof(
double)*freqNb);      //freqNB =1

Non?
sinon: cannot convert from "double*" to double!!!
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 juin 2007 à 16:51
Supprime cette boucle. Elle est maintenant inutile.

BruNews >> Et un post de plus dans ton décompte des pointeurs non alloués ?

C++ (@++)<!--
0
totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009
6 juin 2007 à 17:05
OK, merci

Mais le seul problème est que maintenant j'ai une erreur lorsque j'écris les valeurs de mon tableau dans mon fichier:

sprintf(lastLine, "%d\t%02.2f\t\t Distance covered: %02.2f cm",j, values[j][i], DistValues[j][m]); // values : float ** values , et DistValues: Double* DistValues.

voici l'erreur:

"error C2109: subscript requires array or pointer type"

tu voit d'ou ça vient?
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 juin 2007 à 17:18
Va falloir que tu révises certaines notions sur les pointeurs.
DistValues[j][m]
DistValues est un pointeur et non un pointeur de pointeurs.
DistValues[m] serait la bonne façon de l'utiliser.

C++ (@++)<!--
0
totoscill Messages postés 48 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 10 décembre 2009
6 juin 2007 à 17:49
oui mais c'est pour ça que j'avais déclarer **DistValue!

Comme ça je peut utiliser DistValue[j][m] afin d'enregistrer les différentes valeurs stocker dans mon tableau.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 juin 2007 à 22:58
Déclares *DistValue. Et au lieu d'avoir:
DistValue[j][m], tu auras Distvalue[j*largeur_de_ton_tableau + m ];

c'est pareil.
0