guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 2009
-
25 juin 2009 à 14:13
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 2009
-
30 juin 2009 à 14:13
Bonjour,
J'ai un problème d'allocation mémoire sur un tableau. J'alloue le tableau comme ceci :
int i ; // A ce moment du code, il vaut 4000
double* data_values;
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 25 juin 2009 à 14:33
Salut
data_value est un pointeur. Donc quand tu fais sizeof d'un pointeur, sur un processeur 32 bits, il te retourne 4 octets. C'est tout à fait normale.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 25 juin 2009 à 15:01
Ben oui *data_values est de type double donc 8 octets...
Si l'allocation a échoué alors data_value sera égale à NULL. sinon, il sera égale à l'adresse de ta zone mémoire alloué.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 26 juin 2009 à 10:24
Comme dit NitRic, il suffit de sauvegader le nombre d'élément de ton tableau dans une variable.
C'est le plus simple.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 20091 26 juin 2009 à 10:33
Petit problème, quand je rentre la fonction de NitRic, j'obtiens un magnifique :
Process returned -1073741819 (0xC0000005) execution time : 0.515 s
Press any key to continue.
Si le debug peut vous aider...
Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: H:\CodeBlocks\NcComp\NcComp\
Adding source dir: H:\
Adding file: bin\Debug\NcComp.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.7.50.20071127
Child process PID: 3080
Program received signal SIGSEGV, Segmentation fault.
In ntdll!RtlpNtMakeTemporaryKey () (C:\WINDOWS\system32\ntdll.dll)
int main()
{
ARRAY a;
a.num_of_elems = 4000;
a.data = (double*)calloc(a.num_of_elems, sizeof(double));
if(a.data==0){
printf("Erreur allocation\n");
return 0;
}
for (int i = 0; i < a.num_of_elems; ++i)
{
a.data[i] = 5;
}
return 0;
}
Ton problème doit venir d'ailleurs, montre nous ton code, et la ligne ou le debbuger s'arrète.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 20091 26 juin 2009 à 10:53
rectif, le code de NitRic marche et ça m'affiche bien 4000, problème résolu, MERCI
Enfin, ça veut dire que ça vient d'ailleurs et que j'ai un autre problème... Mais bon, au moins j'avance ^^
Une idée d'où ça aurait pu venir, le fait que le sizeof ne m'affiche pas la taille de la mémoire allouée ?
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 20091 26 juin 2009 à 11:11
En fait, le code bug à ce moment là :
for(pk= 0;pk<i;pk++){
if(data_values[pk]!=data_values2[pk]){
printf("Valeurs numero %d differentes : %f pour le premier fichier, %f pour le second fichier\n",pk, data_values[pk],data_values2[pk]);
moy_ecart_abs + = (data_values[pk]-data_values2[pk]);
getchar();
}
Sachant que je ne fais rien d'autre que remplir le tableau durant tout le reste du programme et que je n'y touche plus par la suite.
Le but de ce morceau de code est de comparer deux valeurs dans un tableau pour ensuite faire un écart absolu.
Le problème c'est que ce code ne bug pas si je ne lui rajoute plus de variable. Il s'exécute normalement. Seulement je suis LOIIIIIIIIIIIIIIIIIN d'avoir fini mon travail dessus et j'aurais besoin de rejouter encore une bonne vingtaine de variables ^^
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 26 juin 2009 à 12:02
Et à quoi est égale i dans ta boucle for? Si i est plus quand que 4000 (le nombre d'élément), ça va planté. Trace cette variable parce que le problème vient forcement de là.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 20091 26 juin 2009 à 13:30
Non, i = 4000, justement, c'est en fonction de cette variable que j'alloue la mémoire de data_values... C'est pour cela que je ne vois pas pourquoi ça plante. De plus, le compilo ne rentre même pas dans la boucle, il plante à la lecture des conditions :/
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 26 juin 2009 à 14:02
Pourquoi tu me dis qu'il plante sur la ligne rouge qui est DANS la boucle for et maintenant tu dis que le prog plante AVANT cette boucle...
Si tu ne mets pas ton code, on ne pourra jamais d'aider!
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 20091 26 juin 2009 à 14:09
désolé je me suis planté, je voulais dire la condition du if et pas la boucle for
Il n'y a aucune autre partie qui touche à data_values ou data_values2 mis à part une fonction(nc_get_var_double(...)) d'une bibliothèque fournie (netcdf, dont la doc est là ) qui sert à les remplir.
Apparemment il bug à la lecture de c'te foutue condition... Mais je sais pas pourquoi...
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 26 juin 2009 à 14:16
Essaie alors le même code avant cette fonction netcdf.
S'il marche c'est effectivement que cette fonction est boggué
Sinon, pk est égale à combien quand ça plante?.
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
guiltyspark
Messages postés29Date d'inscriptionmardi 24 février 2009StatutMembreDernière intervention10 juillet 20091 26 juin 2009 à 14:59
Non mais le code marche très bien, j'arrive même à afficher les 4000 valeurs de data_values mais je viens de découvrir un problème, c'est que quand je remplis data_values2, bizarrement, data_values1 n'est plus lisible. Le soucis c'est que je voudrais faire un tableau de sauvegarde pour pouvoir sauvegarder data_values mais je ne peux pas car, quand je l'alloue, j'ai droit à une belle erreur de segmentation...