Problèle d'allocation mémoire sur un tableau

Résolu
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 - 25 juin 2009 à 14:13
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 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;

data_values = (double*)calloc((size_t)i,sizeof(double));

// Je ne pense pas avoir fait d'erreur jusque la, mais apres, quand je fais un

printf("taille : %d",sizeof(data_values));

// Ca m'affiche taille : 4

Pourriez-vous m'aider svp ?

Merci d'avance !

20 réponses

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
26 juin 2009 à 00:39
sous Visual C++ il y a:
#include <malloc.h>
size_t _msize(void*);  // renvoie le nombre de byte et non le nombre d'élément

size_t num_of_elems = _msize(data_values) / sizeof(double);

mais sinon, le mieux serait probablement de garder la taille dans une variable ou encore une structure

struct array
{
    double* data;
    size_t num_of_elems;
};

  struct array a;
  a.num_of_elems = 4000;
  a.data = calloc(a.num_of_elems, sizeof(double));

  for (i = 0; i < a.num_of_elems; ++i)
  {
      a.data[i] = x;
  }

tu as le choix ...

~(.:: NitRic ::.)~
3
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
30 juin 2009 à 14:13
C'est bon, solution trouvée : Il suffisait de préciser que data_values1 et 2 étaient en static pour une raison de capacité de la pile je crois...

Merci à vous en tout cas ;)
3
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
25 juin 2009 à 14:42
OK mais alors comment je fais pour bien vérifier que mon tableau a une taille correcte ?...

Quand je fais printf("taille : %d",sizeof(*data_values));

Ca me renvoie "taille : 8"...

Merci
0

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

Posez votre question
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
25 juin 2009 à 22:54
oui mais je voudrais savoir quelle est la taille du tableau sur lequel pointe data_values... Et non pas la taille d'un double...

Un moyen, une idée, un dogue allemand ? ^^
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
26 juin 2009 à 09:17
Merci mais il y a un petit problème : je ne peux pas coder sous VC++, je suis sous C::B...
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
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)
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
26 juin 2009 à 10:43
Le code deNitRic marche sans problème, voila mon programme de test:
#include <malloc.h>

typedef struct TAG_ARRAY
{
    double* data;
    size_t num_of_elems;
}ARRAY,*PARRAY;

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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
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 ?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
26 juin 2009 à 10:57
On pourra rien te dire sans ton code. Met le ici si tu veut que l'on t'aide. Met aussi en rouge la ligne où ton debugger s'arrète.






____________________________________________________________________________
Mon site internet :  

http://ImAnalyse.free.fr
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
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 ^^
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
26 juin 2009 à 11:12
Précision, data_values2 est alloué exactement de la même manière que data_values
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
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 :/
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
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 ) qui sert à les remplir.

Apparemment il bug à la lecture de c'te foutue condition... Mais je sais pas pourquoi...
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
0
guiltyspark Messages postés 29 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 10 juillet 2009 1
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...
0
Rejoignez-nous