totoscill
Messages postés48Date d'inscriptionjeudi 26 avril 2007StatutMembreDernière intervention10 décembre 2009
-
6 juin 2007 à 12:34
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 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?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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;
totoscill
Messages postés48Date d'inscriptionjeudi 26 avril 2007StatutMembreDernière intervention10 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?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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)
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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.