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 :

problème avec malloc


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut problème avec malloc
    Bonjour tout le monde,

    Je suis en train d'écrire un programme qui ouvre un fichier qui contient du texte.
    Ensuite je met chaque caractere du texte dans un tableau pour apres recuperer les valeurs hexadecimales de chaque caractere car j'en ai besoin pour faire des opérations apres.

    On m'a conseillé d'utiliser malloc() pour allouer la bonne taille. Le probleme est que cette ligne me cause un "Project.exe a renconreé un probleme et doit fermer."

    Je vous donne mon code et donnez moi votre avis, svp!

    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
     
    unsigned long n ;
     char *p;
     
     FILE *fp = fopen ("plaintext.txt", "r");
       if (fp != NULL)
       {
          fseek (fp, 0, SEEK_END);
          {
             n = ftell (fp);
             rewind (fp);
             printf("n\%d",(size_t)-1);
     
             if (n < (size_t) - 1)
             { 
                *p = (char) malloc (n);
     
                if (p != NULL)
                {
                   fread (p, n, 1, fp);
     
                   {
                      size_t i;
                      for (i = 0; i < n; i++)
                      {
                         putchar (p[i]);
                      }
                   }
                   free (p);             
                 }
             }
             fclose (fp); 
          }
       }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Ton malloc va te renvoyer un pointeur vers une zone mémoire contenant des char.
    Donc c'est (char*) et pas (char)
    Et il vaut mieux ne rien mettre du tout de toute façon devant le malloc

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Si je met rien devant malloc il me dit : "invalid conversion from 'void*' to 'char'".
    et si je met (char *) il me dit :" invalid conversion from 'char *' to 'char'" ...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    oui pardon j'avais pas vu, c'est p = malloc ...
    et pas *p

    p permet d'accéder à l'adresse, et *p à la valeur
    Or le malloc t'alloue une adresse.

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Ah oui en effet, ca parait plus logique.
    Par contre j'ai toujours une erreur : "invalid conversion from 'void*' to 'char*'

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par oeil de lynx Voir le message
    Par contre j'ai toujours une erreur : "invalid conversion from 'void*' to 'char*'
    Ca veut dire que l'extension de ton fichier est .cpp (C++) ou que tu compiles en C++. L'extension d'un fichier C est .c.

  7. #7
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Ohlala exact.... j'avais pas fait attention
    du coup, apres avoir fait un nouveau projet en C (et non en c++ comme j'avais du le faire), une autre erreur m'est indiquée:
    iostream:no such file or directory, c'est aussi du C++?je suis perdue !

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    D'autre part, ftell retourne long et non unsigned long et le printf après le rewind est mal écrit. \n et non n\ et %d attend un int et non un size_t (pour afficher un size_t, C99 uniquement, c'est %z si je me souviens bien). Si tu veux convertir en non signé, unsigned int ou unsigned long par exemple, c'est respectivement %u et %lu qu'il faut utiliser.

  9. #9
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par oeil de lynx Voir le message
    Ohlala exact.... j'avais pas fait attention
    du coup, apres avoir fait un nouveau projet en C (et non en c++ comme j'avais du le faire), une autre erreur m'est indiquée:
    iostream:no such file or directory, c'est aussi du C++?je suis perdue !
    Oui iostream c'est du C++ et même en C++ tu n'en as pas besoin ici. Le fichier d'en-tête qui déclare printf, fopen, fread, etc. est stdio.h (C), pas iostream (C++).

  10. #10
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    non en effet, ce n'est pas du C
    donc mes bibliotheques sont :
    #include<stdio.h>
    #include <stdlib.h>

    Le probleme maintenant est que la fenetre du compilateur s'ouvre et se ferme directement...

  11. #11
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Merci pour les erreurs trouvées c'est corrigé !!

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce ne sont pas des bibliothèques mais des fichiers d'en-tête.

    Que veux-tu dire par "fenêtre du compilateur" ? La boîte de dialogue de Dev-C++ ou la fenêtre console du programme?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    La console de Devc++, c'est à dire quand je clique sur 'run' ! Je m'exprime pas tres bien, dslee...

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est dû à un bug de Dev-C++ qui n'empêche pas la console de se fermer naturellement quand on clique sur Run.

    Durant la phase de développement, tu peux contourner le bug en ajoutant system("pause"); à la fin du programme. Il sera sans doute approprié de retirer cette ligne de la version définitive.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Oui si je met des system("PAUSE"); la du coup ca ouvre la console. merci

    J'ai encore une question ! Par rapport a mon code, je rentre donc les caracteres dans p[i] et imaginons que je veuille afficher ce que contient p[i], est ce que je peux faire :

    printf("resultat :\n");
    for(i=0;i<n;i++)
    {
    printf("%O2x ",p[i]);
    }

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Oui, mais il faut mettre un zéro à la place du O.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    C'est bon, tout marche ! Je vous remercie !!

Discussions similaires

  1. problème avec malloc
    Par cyril_sy dans le forum C
    Réponses: 13
    Dernier message: 12/05/2007, 13h49
  2. Problème avec malloc et autre
    Par ego dans le forum C
    Réponses: 5
    Dernier message: 02/05/2007, 18h29
  3. probléme avec malloc
    Par tomasi dans le forum C
    Réponses: 18
    Dernier message: 15/11/2006, 15h15
  4. Problème avec malloc
    Par f56bre dans le forum C
    Réponses: 11
    Dernier message: 13/11/2006, 14h36
  5. Problème avec malloc.
    Par kmitz dans le forum C
    Réponses: 2
    Dernier message: 25/03/2006, 18h05

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