Problèle d'allocation mémoire sur un tableau [Résolu]

Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
- - Dernière réponse : 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 !
Afficher la suite 

20 réponses

Meilleure réponse
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
3
Merci
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 ::.)~

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NitRic
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
3
Merci
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 ;)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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 ? ^^
Commenter la réponse de guiltyspark
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
Merci mais il y a un petit problème : je ne peux pas coder sous VC++, je suis sous C::B...
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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)
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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 ?
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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 ^^
Commenter la réponse de guiltyspark
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
Précision, data_values2 est alloué exactement de la même manière que data_values
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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 :/
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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...
Commenter la réponse de guiltyspark
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
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
Commenter la réponse de Pistol_Pete
Messages postés
29
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
10 juillet 2009
1
0
Merci
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...
Commenter la réponse de guiltyspark