IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme d' allocation


Sujet :

C

  1. #21
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    il faut utiliser la fonction itoa()
    mais je crois qu'elle decompose en caracteres,donc il faudra soustraire '0' a ces caracteres pour les convertir en chiffres

    127

    donnera var[0]='1' ce qui signifie code ascii de 1
    var[1]='2'
    var[2]='7'

    pour les convertir en chiffre, il faudra soustraire '0':

    '1'-'0'=1
    '2'-'0'=2
    ...

    il y a peut etre un autre moyen, mais je ne le connais pas...


    et c'est quoi ces operation dont tu parle ??
    c'est pas evident de faire des operation sur un nombre tres grand !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  2. #22
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par kamouminator
    il faut utiliser la fonction itoa()


    c'est pas standard !
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #23
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    --

  4. #24
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par Dark_Ebola


    c'est pas standard !
    oui dsl lol...je sais, mais je n'en connais pas d'autre qui fasse le meme travail !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  5. #25
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par mhackgyver
    itoa() ca fait l'inverse, d'un int en string
    ca convertie un int en une chaine de caractere oui !
    ca fais (en partie) le travail que tu demande,
    MAIS comme l'a fais remarqué dark ebola, c'est pas standard...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  6. #26
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    Citation:
    mhackgyver a écrit :
    itoa() ca fait l'inverse, d'un int en string

    ca convertie un int en une chaine de caractere oui !
    ca fais (en partie) le travail que tu demande,
    MAIS comme l'a fais remarqué dark ebola, c'est pas standard...
    oui j'ai compris apres

    bon je vais faire des operations par bloc de int, ca sera plus facile.


    ---------------

    nouveau probleme: toujours d'allocation

    j'ai la compression d'huffman a faire, ca marche sur les petit texte, mais sur les gros non:

    quand j'affiche la liste des carateres et leur occurences avant la fonction creer_dico, c'est bon, mais quand j'affiche apres, la valeur des occurence des caractere plus grand que 128 en ascii. j'ai mon arbre qui a completement changer les caracteres on des code -xx les occcurences sont vers 400254554,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
    unsigned char code[100];
     
    struct NOEUD
    {
    	int poids;
    	char c;
    	struct NOEUD *fg,*fd;
    };
     
    struct NOEUD *creernoeud(int poids,char c,struct NOEUD *fg,struct NOEUD *fd)
    {
    	struct NOEUD *noeud;
    	noeud=(struct NOEUD*)malloc(sizeof(struct NOEUD));
    	noeud->poids=poids;
    	noeud->c=c;
    	noeud->fg=fg;
    	noeud->fd=fd;
    	return noeud;
    }
     
    struct NOEUD *fusionner(struct NOEUD *fg,struct NOEUD *fd)
    {
    	return creernoeud(fg->poids+fd->poids,0,fg,fd);
    }
     
    unsigned char conv(char *txt,int ibit)
          {
            unsigned char c=0;      // l'octet qui sera renvoyé
            unsigned char bit=0x1;  // bit de poids le plus faible ; par la suite, 'bit' contiendra le bit de poids courant
            int i;
            for( i=ibit+7 ; i>=ibit ; --i )
             {
               if( txt[i]=='1')   // on suppose que txt ne contient que des '0' ou des '1'
                c |= bit;           // on ajoute le bit courant
               bit = bit<<1;       // on décale d'un cran
    //affichage du calcul:
               //printf("txt[i]=%c i=%d  bit=%d c=%d\n",txt[i],i,bit,c);
               //system("pause");
    //
             }
             //printf("\nc defin=%d",c);
           return c;
          }
     
    void analyser(char fichier[],int Occ[])
    {
    	FILE *f;
    	int i,c;
    	for(i=0;i<256;i++)	Occ[i]=0;
    	f=fopen(fichier,"rb");
    	while(1)
    	{
    		c=fgetc(f);
    		if (c==EOF)	break;
    		Occ[c]++;
    		//if(c==128) printf("c=%d\tocc=%d",c,Occ[c]);
    	}
    	fclose(f);
    }
     
    struct NOEUD *extrairemin(struct NOEUD *T[],int n)
    {
    	int k,i;
    	struct NOEUD *tmp;
    	k=-1;
    	for(i=0;i<n;i++)
    		if (T[i]!=NULL)
    		{
    			if (k==-1) k=i;
    			if (T[i]->poids<T[k]->poids) k=i;
    		}
    	if (k==-1)	return NULL;
    	tmp=T[k];
    	T[k]=T[n-1];
    	return tmp;
    }
     
    // fabrication du code binaire
    struct NOEUD *codage(int Occ[])
    {
    	int n,i,j;
    	struct NOEUD *tmp1,*tmp2,*T[256];
    	j=0;
    	for(i=0;i<256;i++)
    		if (Occ[i]!=0)
    		{
    			T[j]=creernoeud(Occ[i],i,NULL,NULL);
    			j++;
    		}
    	n=j;
    	for(i=0;i<n-1;i++)
    	{
    		tmp1=extrairemin(T,n-i);
    		tmp2=extrairemin(T,n-i-1);
    		T[n-i-2]=fusionner(tmp1,tmp2);
    	}
    	return T[0];
    }
     
    void afficher(struct NOEUD *arbre,int n)
    {
    	int i;
    	for(i=0;i<n;i++) printf("-");
    	if (arbre->fg==NULL && arbre->fd==NULL)
    	{
    		code[n]='\0';
    		printf("> \'%d\' (poids=%d) (code=%s)\n",arbre->c,arbre->poids,code);
    	} else
    	{
    		printf("> pere (poids=%d)\n",arbre->poids);
    		code[n]='0';
    		afficher(arbre->fg,n+1);
    		code[n]='1';
    		afficher(arbre->fd,n+1);
    	}
    }
     
    int creerdico(struct NOEUD *arbre,char *dico[256],int n)
    {
    	if (arbre->fg==NULL && arbre->fd==NULL)
    	{
    		code[n]='\0';
    		dico[arbre->c]=malloc(3000);
    		strcpy(dico[arbre->c],code);
    		printf("c=%d code=%s\n",arbre->c,dico[arbre->c]);
    	} else
    	{
    		code[n]='0';
    		creerdico(arbre->fg,dico,n+1);
    		code[n]='1';
    		creerdico(arbre->fd,dico,n+1);
    	}
    }
     
    void creerfilebin(char *dico[256],char filein[],char fileout[],int Occ[],int taille)
    {
    	FILE *fin,*fout;
    	int i,j,c_out,aux;
    	char t[50];
    	j=0;
    	char c;
        fin=fopen(filein,"rb");
    	fout=fopen(fileout,"wb");
    	while(1)
    	{
            c=fgetc(fin);
            if (c==EOF && taille!=0) break;
            if (c==EOF && taille>0)
            {
                    for(i=8;i>8-taille;i--) t[i]=0;
                    j=8;
                    taille=0;
            }
            if(j<8)
            {
                for(i=0;i<strlen(dico[c]);i++)
                {
                    t[j]=dico[c][i];
    //code inseré dans la tableau:
    //printf("%c",dico[c][i]);
                    j++;
                }
            }
            else
            {
                c_out=conv(t,0);
                printf("%d",c_out);
                //system("pause");
                fprintf(fout,"%c",c_out);
                for(i=0;i<j-8;i++) t[i]=t[i]+8;
                j=j-8;
            }
        }
        fclose(fin);
    	fclose(fout);
    }
     
    int taillef(const char *file)
    {
    	int taille;
    	FILE *f = fopen(file,"rb");
    	if(!f) return(-1);
    	fseek(f, 0, 2);
    	taille = (int)ftell(f);
    	fclose(f);
    	return(taille);
    }
     
    int main()
    {
    	char filein[200],fileout[200],*dico[256];
    	unsigned int Occ[256],t,taille_out_bin,taille_out_bin_add,i;
    	struct NOEUD *arbre;
    	taille_out_bin=0;
    	printf("Fichier a compresser :");
    	scanf("%s",filein);
    	printf("Compresser dans :");
    	scanf("%s",fileout);
    	t=time(0);
    	analyser(filein,Occ);
    	arbre=codage(Occ);
    		for(i=0;i<256;i++)
    	{
    	    if(Occ[i]!=0)
    	    {
                printf("%d\t%d\t\n",i,Occ[i]);
            }
    	}
            system("pause");
        creerdico(arbre,dico,0);
            printf("%c\t%d\tn",128,Occ[128]);
            		for(i=0;i<256;i++)
    	{
    	    if(Occ[i]!=0)
    	    {
                printf("%d\t%d\t\n",i,Occ[i]);
            }
    	}
            system("pause");
            system("cls");
    	afficher(arbre,0);
        printf("carac\toccur\tcode bin\n");
     
    //affichage des caractere + occurrences et
    //calcule la taille du fichier de sortie sans arrondie a l'octet suivant(en bit)
    	for(i=0;i<256;i++)
    	{
    	    if(Occ[i]!=0)
    	    {
                printf("%d\t%d\t%s\n",i,Occ[i],dico[i]);
                taille_out_bin+=Occ[i]*strlen(dico[i]);
            }
    	}
     
    //bit a ajouter aux fichier pour faire un arrondi a l'octet
    	taille_out_bin_add=8-(taille_out_bin%8);
     
    //cree le fichier binaire compressé
        creerfilebin(dico,filein,fileout,Occ,taille_out_bin_add);
     
    	printf("\n Duree : %ds\n",time(0)-t);
     
     
    	return 0;
    }

  7. #27
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    tu pourrais faire l'effort de commenter ton code...

    toute facon, je peux plus reflechir (et je connais po ce huffman) ! je vais me pieuter moi...
    bon courage a toi...

    mais y'a un truc qui me turlupine...y'a quelques messages tu savais meme pas te servir d'un ponteur...et là...tu me pond un arbre...
    c'est la camera cachée ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  8. #28
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Comprend que toute valeur est codée en binaire dans l'ordinateur... Quil s'agisse d'un caractere, d'un entier ou de n'importe quoi d'autre...

    Si on part du principe qu'un caractère fait 8 bits, tu peux "visualiser" les valeurs sous forme de
    1111 1111 ce qui, comme par hasard (c'est pas le hasard, c'est pour cela que l'hexadécimal a été créé ) peut aussi etre affiché sous la forme de
    F F

    Si l'on considère que le 1 le plus à gauche est le bit de poids fort (celui qui correspond à la valeur la plus élevée), il faut savoir qu'il peut avoir deux significations:

    Soit il signifie simplement que c'est (ici pour 8 bits) "une valeur correspondant à 128" (2^7), mais il ne vaudra effectivement 12 que pour les caracteres (selon l'exemple) déclarés en "non signés" (unsigned )

    une valeur de 1001 0101 correspondra alors à 128+16+4+1=153

    Soit, dans tous les cas des types "signés", qui arrivent par défaut quand on ne précise pas "unsigned", un 0 indiquera que ce qui suit est une valeur positive alors qu'un 1 indiquera une valeur negative...

    Cela signifie que l'on aura des valeurs positives entre 0000 0000 (0x00) et 0111 1111(0x7F ou... 127) et des valeurs négatives entre 1000 000 (0x80) et 1111 1111 (0xFF)

    Un des problèmes, mais, comme ca sort de ce que je veux expliquer, je ferai l'impasse sur les explications permettant de le contourner, c'est que 1000 0001 ne vaut pas ... -1... (si quelqu'un tient à ces explications, elles se feront par MP)

    Par contre, le problème qui se pose réellement à toi, c'est que tu ne veux pas des valeurs négatives...

    La solution est donc toute simple: tu dois choisir de travailler en valeurs non signées (tu ne dois pas utiliser un char, mais un unsigned char...)

    Les explications que j'ai données ici pour un octet restent tout à fait valables, évidemment, si tu décide de travailler avec un entier... à la différence que l'on travaillera (*peut etre*, mais pas forcément, et en considérant que c'est le cas ) avec des valeurs utilisant 4 octets (32 bits) et que les valeurs négatives s'étaleront à 0x80 00 00 00 et 0xFF FF FF FF (les espaces ici n'étant rajoutés que pour montrer que l'on a 4 octets) si tu ne précise par qu'il s'agit d'un entier non signé (unsigned int)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #29
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par koala01
    "une valeur correspondant à 124" (2^7)
    t'as bu quoi ce soir?
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  10. #30
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Dark_Ebola
    t'as bu quoi ce soir?
    Pas assez, on dirait...

    Je modifies mon message
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #31
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par kamouminator
    mais un entier ne peut pas depasser 4 octets !!!
    un entier mesure 4 octets !
    La norme dit qu'un int doit au minimum garantir la plage -32767 à 32767 (0 à 65535 pour un unsigned int). D'apres la norme, un int fait donc au minimum 2 octets et il n'y a pas de limite maximale.
    Apres la taille des type dans les implementations dependent de l'implementation (il faut lire la doc correspondante) mais rien empeche d'avoir des int de 8 ou 16 octets (voir 18 ou 24 bits).

    Citation Envoyé par kamouminator
    oui dsl lol...je sais, mais je n'en connais pas d'autre qui fasse le meme travail !
    sprintf (ou snprintf en C99).

  12. #32
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 1
    Points
    1
    Par défaut
    merci, pour le unsigned je l'avais mis au variable ou je pensais que ca fesait ce probleme, mais apparement c'etait pas elles, donc j'ai mis des unsigned partout (sauf 2 negative), et ca marche
    maintenant c'est la compression qui marche plus, je vais voir le probleme

  13. #33
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par gl
    La norme dit qu'un int doit au minimum garantir la plage -32767 à 32767 (0 à 65535 pour un unsigned int).
    autant pour mo, j'ai confondu avec les float...
    mais j'ai pas compris... tu parle de int de 8 ou 16 octets...tu voulais dire bits ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  14. #34
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    snprintf() ...
    Oups!!! Corrige

  15. #35
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par kamouminator
    autant pour mo, j'ai confondu avec les float...
    Non, de meme que pour les int, une implementation est libre de faire mieux que le minimum requis.

    Citation Envoyé par kamouminator
    mais j'ai pas compris... tu parle de int de 8 ou 16 octets...tu voulais dire bits ?
    Non, je parlais bien d'octet : d'ailleurs un int de 8bits ne serait pas conforme car pas suffisant pour contenir la plage minimale garantie.
    16 bits par contre est suffisant et une inplementation avec des int de 16bits est conforme (et d'ailleurs existe).

  16. #36
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    mais je comprend pas là...quand je defini une variable a de type unsigned int, et que je lui attribue un nombre de 8 octet, et quand je fais printf("%d",a)
    je n'ai pas du tout le nombre attendu...
    il faudrait utiliser autre chose que int alors ? pour moi entier = int !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  17. #37
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kamouminator
    mais je comprend pas là...quand je defini une variable a de type unsigned int, et que je lui attribue un nombre de 8 octet, et quand je fais printf("%d",a)
    je n'ai pas du tout le nombre attendu...
    Montre le code.

    Au fait en C, les entiers peuvent avoir plusieurs types :
    • char
    • signed char
    • unsigned char
    • short
    • unsigned
    • int
    • unsigned int
    • long
    • unsigned long
    et en C99 on a en plus
    • long long
    • unsigned long long

    On choisi le bon type en fonction des besoins réels ou supposés.
    (langue de bois detected)
    Pas de Wi-Fi à la maison : CPL

  18. #38
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    On choisi le bon type en fonction des besoins réels ou supposés.
    bah un si j'ai bien compris(en fait je ne pense pas avoir compris du tout...), il voulais convertir tout un fichier de 5mo en un entier de 5mo...

    sinon, pour un code exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include<stdio.h>
     
    int main(void)
    {
        unsigned int a = 18446744073709551615; /* equivaut a (2^64)-1 (8 octets remplies de 1)*/
     
        printf("%d",a);
        return 0;
    }
    ca n'affiche pas le nombre attendu ! donc il y a une limite...non ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  19. #39
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kamouminator
    ca n'affiche pas le nombre attendu ! donc il y a une limite...non ?
    Ben oui (ici, "%d" donc int : INT_MAX) et elle est indiquée dans le fichier <limits.h> de ton implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    #include <limits.h>
     
    int main (void)
    {
       printf ("INT_MAX = %d\n", INT_MAX);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INT_MAX = 2147483647
     
    Press ENTER to continue.
    Pour être portable, il faut utiliser les valeurs minimales garanties par le langage C :
    http://emmanuel-delahaye.developpez.com/init_c.htm#type

    J'ai dit.
    Pas de Wi-Fi à la maison : CPL

  20. #40
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    ah ok, je ne savais pas qu'il était possible de changer cette limite !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

Discussions similaires

  1. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  2. Probleme d'allocation dynamique
    Par Xav987 dans le forum C++
    Réponses: 6
    Dernier message: 04/03/2007, 13h43
  3. Probleme d'allocation avec un malloc
    Par theshark85 dans le forum C
    Réponses: 11
    Dernier message: 25/04/2006, 17h30
  4. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42
  5. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo