Probleme allocation memoire dynamique

cs_neutrix Messages postés 10 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 4 mai 2005 - 27 avril 2005 à 11:56
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 - 27 avril 2005 à 15:59
salut

voila

j'ai besoin d'aide

je dois convertir un nombre en tableau de chiffres
123456 = > [1,2,3,4,5,6]
jusque la tout va bien ... le probleme est : la reservation memoire dynamique avec les machin calloc malloc ou autres ....

mon nombre peut changer donc le nombre d'element dans le tableau créé varie.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>



//------------------------------------------------------------------------------
// Fonction calculant le nombre de décimales d'un entier -> marche seulement
// avec un nombre inférieur à 1 milliard (long int)
// remarque: int s'arrète à 32 000.
//------------------------------------------------------------------------------


int calc_nbr_dec(long int nbr1)
{
int i;
i=0;
long int q;
q=1;


while (q != 0)
{
q=nbr1/10;
nbr1=q;
i=i+1;
}


return i;
}


//------------------------------------------------------------------------------
// Fonction qui extrait les décimales d'un entier et les stocke dans un tableau
// 127 -> a[2]=1; a[1]=2; a[0]=7;
//------------------------------------------------------------------------------


void extraire_dec(long int nbr2, long int a[])
{
int j; //indice du tableau qui débute à 0
long int b;
b=nbr2;
long int d;
d=calc_nbr_dec(nbr2);





for (j = 0 ; j < d ; j++)
{
a[d-j-1]= b / (pow(10,d-j-1));
b = b - (pow(10,d-j-1)) * ((a[d-j-1]));
}


}


void main()


{
long int c[2]; < ===== le probleme est ici si je veux le nombre 2459 (4 decimale cela ne va pas)
long int nombre;
nombre=999;
extraire_dec(nombre , c );
printf("le nombre est:%ld\n",nombre);
printf("le nbre de decimale est:%ld \n",calc_nbr_dec(nombre));
//printf("la premiere decimale est:%i\n",c[3]);
printf("la seconde decimale est:%i\n",c[2]);
printf("la troisieme decimale est:%i\n",c[1]);
printf("la quatrieme decimale est:%i\n",c[0]);



system("pause");


}

Il est important de comprendre que par des souci de memoire je ne paeux me permettre de fixer le nombre decimale a 10 par exemple, je dois imperativement faire le truc de la memoire dynamique pour gagner de la place

Ce que je dis est peut etre faux, si vous voyez un autre moyen .....

merci beaucoup

5 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 avril 2005 à 12:18
Pour utiliser de la mémoire dynamiquement allouée, il faut passer par les pointeurs :



long* c = malloc(sizeof(long) * nb_elements);



// et pour réallouer de la mémoire :

c = realloc(c, sizeof(long) * nb_elements);

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
27 avril 2005 à 12:29
long int ou int c'est pareil. Et int ne s'arrete pas a 32768 mais a +- 2 milliard sur nos pc 32 bit.

Pour allouer ton tableau tu dois faire:



int * c = new int[Nombre de décimal];





et surtout oublie pas après system("PAUSE");

delete[] int;



Pour ta fonction qui retourne le nombre de décimal, tu peux utiliser le logarithme.


int calc_nbr_dec(int nbr1)
{
if (nbr1==0) return 1;

else

{

nbr1 = (nb1>0)?nbr1:-nbr1; // simplement la valeur absolue

return (int)logf(nbr1) + 1;

}

}



Ca évite les bricoles de boucles :)
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
27 avril 2005 à 12:30
Oups pardon c'est pas logf(nbr1) mais log10(nbr1) :)



DarkSidious: pourquoi utiliser malloc alors que new existe ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 avril 2005 à 12:40
ben à la vue du printf, je pensais que c'était du C, mais s'il fait du C++, en effet, il vaux mieux utiliser new !

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0

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

Posez votre question
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
27 avril 2005 à 15:59
et surtout ne pas oublier a la fin :

free(c); pour liberer la memoire
Ici c'est pas trop grave mais pour de gros tableaux c'est important
Enfin ca c'est du C il y a peut etre autre chose en C++
0
Rejoignez-nous