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. #1
    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 probleme d' allocation
    Bonjour, je cherche a stoquer un fichier dans un tableau pour pouvoir l'utiliser comme un entier (FF FF 00 dans le fichier correspond au nombre 255255000
    ), seulement des que le nombre est un peu grand ca deborde et ca me donne du -....

    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
     
    int main()
    {
    	int c,*file_n,taille;
    	FILE *fin = fopen("exe1","rb");
            taille=taillef("exe1");                    //taille du fichier
            file_n=(int*)malloc(taille*3);         //la var sera 3 fois plus grande
    while(1)
        {
            c=fgetc(fin);
            if(c==EOF) break ;
            file_n=c+((int)file_n)*1000;
            printf("%d\n",file_n);
            system("pause");
        }
    une idée?

  2. #2
    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
    on peut avoir le code de taillef() ?
    et pourquoi tu l'ouvre pas en mode texte ton fichier ?et je comprend pas du tout ce que tu cherche a faire ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_n=c+((int)file_n)*1000;
    file_n est un pointeur sur int ! c est un int !
    pourquoi tu cast file_n ?? tu cherche a faire quoi ????


    dois je te rappeler que file_n contient une adresse ! c'est ce que signifie pointeur !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  3. #3
    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
    generalement un entier a une taille de 4 octet.
    si tu est sur que ton entier lu est toujours positif, utilise: unsigned int
    tu pourra avoir des nombre entier positifs plus grands.

    pourrait tu expliquer plus precisement ce que tu chereche à faire ?
    cette ligne de code (horrible ^^) m'embrouille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_n=c+((int)file_n)*1000
    tu cherche peut etre a stocker ton texte dans un tableau d'entiers ?c'est ca que tu voulais dire (tout les 4 octet a ce moment la...) ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  4. #4
    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
    cette ligne prend le char lu dans le fichier et le multipli par 1000 pur faire ca
    si le fichier contient 255 255 000 en ascii
    ca fait:
    1) file_n=255+(file_n*1000)
    donc file_n=255+ 0*1000
    2)file_n = 255 +255 *1000
    donc file_n=255 255
    3)file_n = 000 +255 255 *1000
    donc file_n=255 255 000

    j'aurais donc file_n qui sera a la fin egal a une suite de valeur de caractere ascii, donc en gros convertir mon fichier en nombre (pour travailler sur ce nombre plus tard)

    taillef est une fonction qui renvoi la taille du fichier en octet

  5. #5
    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 alors pourquoi tu declare file_n comme un ponteur ? pourquoi tu alloue dinamiquement file_n ? si au final ca ne te sert a rien !
    tu alloue un espace memoire que tu n'utilise jamais !


    ton probleme avec les nombre negatifs qui apparaissent se reglera si tu defini file_n comme ca:

    unsigned int file_n;
    c'est du au fait que un int est codé en complement à 2 ! si le dernier bit est un 1 alors le nombre sera negatif ! et F=(1111)b
    en utilisant unsigned il sera lu en binaire pur.

    pas besoin d'allouer dynamiquement !

    mais il ne faut pas depasser cette valeure: (2^32)-1
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  6. #6
    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
    code à revoir de A à Z ...
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  7. #7
    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
    code à revoir de A à Z ...

    j'en ai bien peur...
    peut etre meme revoir tes cours de C...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  8. #8
    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 Envoyé par kamouminator
    mais alors pourquoi tu declare file_n comme un ponteur ? pourquoi tu alloue dinamiquement file_n ? si au final ca ne te sert a rien !
    tu alloue un espace memoire que tu n'utilise jamais !
    si justement je vais allouer un espace de la taille*3 de mon fichier c'est a dire que ca peux prendre beaucoup de place (~1mo pour le fichier actuelle)

    donc quelqu'un pourrais me dire comment creer une var contenant un entier de taille*3 octet dynamiquement?

  9. #9
    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 tu ne l'utilise jamais cet espace memoire !!!!!!
    tu l'alloue....et pouf ! tu remplace son adresse par tes 255 ou je sais pas trop quoi ! et tu perd toute trace de ton espace alloué !

    file_n contient une adresse !! l'adresse du premier bloc de ton espace memoire !!
    tu ne peut pas allouer un entier de taille*3 octets !
    un entier c'est 4 octets POINT !
    tu peut creer un tableau d'entiers !(c'est ce que tu as fais d'ailleurs)
    revoi tes cours !!!
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  10. #10
    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
    oubli ce prog, en general
    comment creer une var contenant un entier de taille*3 octet dynamiquement d'apres ce schema:

    declaration de la var et du fichier
    calcul de la taille du fichier (taillef)
    allocation de 3fois la taille du fichier d'espace pour ma variable qui sera un tableau contenant un chiffre par case (ou taille*case de 3 chiffres)

  11. #11
    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
    comment creer une var contenant un entier de taille*3 octet
    mais un entier ne peut pas depasser 4 octets !!!
    un entier mesure 4 octets !

    ce que tu peux faire c'est un tableau de char a ce moment la !
    sachant qu'un char mesure 1octet, tu crée un tableau de taille*3 blocs

    mais tu ne pourra JAMAIS afficher ce nombre...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  12. #12
    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 veux dire quoi par:

    allocation de 3fois la taille du fichier d'espace pour ma variable qui sera un tableau contenant un chiffre par case (ou taille*case de 3 chiffres)


    explique moi en Francais ce que tu veux ! ou je sais pas....fais un dessin...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  13. #13
    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
    si mon fichier fait 5Mo je veux un tableau de 15million de case de char (ou de int mais 1 chiffre par case)

  14. #14
    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
    deja , 5mo = 5*1024*1024 octets

    ensuite c'est simple:
    si tu definie:
    pour l'allouer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var=malloc(5*1024*1024*sizeof(char)*3);
    a noter qu'il n'est pas necessaire de multiplier par sizeof(char) (mais pour la relecture c'est mieux..

    ensuite pour y acceder (ce que tu n'a pas compris apperement):

    var[i] correspond au bloc i !
    var correspond a l'adresse de var[0]

    compris ?
    EDIT: si tu ne compte mettre q'un chiffre par case, un tableau de unsigned short suffis amplement !

    ca reviens donc a faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned short *var;
    var=malloc(5*1024*1024*sizeof(short)*3);
    et là, sizeof(short) est necessaire
    mais ca m'etonnerai qu'il y ai 5*1024*1024 chiffres a lire....si tu expliquais ce que doit faire ton programme ca serai bien mieux...

    mais bon, si tu n'as pas deja compris tout ca, je te conceil vivement de rouvrire ton livre de C...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  15. #15
    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
    oui, mais le probleme que je veux l'utiliser ce nombre:

    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
     
    int main()
    {
    	char *file_n;
    	int n,c,taille;
    	FILE *fin = fopen("exe1","rb");
        taille=taillef("exe1");
        file_n=malloc(taille*sizeof(char)*3);
        n=0;
        file_n=0;
    while(1)
        {
            c=fgetc(fin);
            if(c==EOF) break ;
            file_n=c+file_n;
            printf("%d\n",file_n);
            system("pause");
        }
    je peux faire ca "file_n=c+file_n;" pour ajouter le code ascii du caratere a file_n, mais est ce qu'il est possible de faire un truc comma ca "file_n=c+file_n*1000;" car la multiplication il veux pas.
    est ce qu'il est possible de faire des comparaison genre if(file_n>1545) directement

  16. #16
    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


    c'est normal qu'il ne veux pas multipler...file_n contient une ADRESSE !!! file_n est un pointeur !


    t'as toujours pas compris....

    tu veux mettre chaque caracete lu dans un bloc ?
    premier bloc contien premier caractere
    deuieme bloc contient deuxieme caractere...etc...

    c'est ca que tu voulais faire ??
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  17. #17
    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
    pas exactement : le 1er caractere (de 3 chiffres en ascii) le mettre dans 3 cases

    si je veux faire des multiplication, ou des comparaison,je suis obliger de faire des test sur les cases ou il y a un moyen direct?

  18. #18
    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 veux multiplier quoi ?
    tu veux faire quoi exactement ?
    ton programme il doit faire quoi exactement ?
    tu entend quoi par:
    le 1er caractere (de 3 chiffres en ascii) le mettre dans 3 cases
    si tu as 127 par ex:
    tu veux var[0]=127, var[1]=127, var[2]=127 ?
    ou var[0]=1, var[1]=2, var[2]=7 ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  19. #19
    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
    var[0]=1, var[1]=2, var[2]=7

    ce que je veux faire est simple, considerer un fichier comme un nombre composé d'une suite de code ascii et faire de operation avec lui

  20. #20
    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


    bon, on reprend calmement:

    -tu as un fichier contenant des entrées du genre:
    255 255 000
    codée:
    1: ascii
    2: binaire

    -tu veux donc un tableau qui contiens ?
    1: des caracteres: var[0]='2' puis var[1]='5' puis var[2]='5'...
    2: des chiffres: var[0]=2 var[1]=5 var[2]=5
    3: des nombres: var[0]=255 var[1]=255 var[2]=000
    4: luke Skywalker

    partant de là, on pourras peut etre t'aider a revoir ton code.

    ---
    edit: grillé

    donc ce que tu dois faire:

    ouvrir le fichier
    calculer la taille du fichier
    declarer un tableau de la taille necessaire (pas 3* la taille du fichier)

    pour i variant de 0 a la taille du fichier
    {
    lire un caractere dans ton fichier
    le convertir en entier
    le mettre dans ton tableau au bon endroit
    }

    fermer le fichier
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

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