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 :

Allocation de structure dynamique


Sujet :

C

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    (Edit: Sal***rie d'IE7 qui remplace les espaces insécables par des astérisques...)
    Firefox powa...

  2. #22
    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
    hegros : On ne reproche pas au prof de ne pas lui apprendre, mais de le basher pour avoir fait les choses comme elles doivent l'être...
    Il y a une marge entre ne pas dire la vérité et apprendre des choses fausses.

    Je sais, mais j'ai coupé l'accès de FF à Dvp.net pour réduire la dose au boulot...
    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.

  3. #23
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    [HS]
    C'est au professeur de prendre en compte le niveau de ses éléves et de suivre le programme qu'il s'est fixé donc dire qu'il ne fait pas ce qui convient de faire ne me paraît pas raisonnable dans la mesure ou on ne connait et cela d'aucune façon le programme qu'il a établi pour cette formation.D'autant plus si il a déja distribué des polycops qui traite de ce sujet et que se sont les éléves qui ne les ont pas lu!

    moralité : Ce n'est pas toujours de la faute des profs quand les éléves ne font pas ce qu'il faut faire
    [/HS]

  4. #24
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    En castant la valeur retournée par malloc, on se prive de possibilités de vérification automatique réalisées par le compilateur. Je ne trouve pas si grave de le conseiller aux étudients, même si cela témoigne d'une certaine méconnaissance des enjeux. Je trouve toutefois regrettable de "jeter la pierre" à une élève alors que tous les spécialistes sur comp.lang.c ou sur dvp.net s'accordent à déconseiller l'utilisation de ce cast qui n'est utile qu'en C++ (et encore là, il vaut mieux utiliser les opérateurs new et delete).

    Personnellement, je trouve plus préoccupant la façon dont on enseigne l'usage de scanf (très souvent mal maitrisé par les débutants, ce qui entraîne des comportement autrement plus dangereux que de caster le retour d'un malloc), ou même gets. Même si c'est au programme, et que c'est dans les polycopiés...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #25
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    J'ai envoyé un mail parlant de ce problème à mon prof qui m'a répondu ceci, sans rien d'autre dans son mail (pas d'explication) et j'ai du mal à comprendre ce qu'il veux me faire comprendre, auriez vous une idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main()
    {
           char *plop = (char *) malloc(10);
    }
    A part qu'il alloue délibérément trop d'espace pour son pointeur je ne vois pas en quoi cela illustre la necessité d'un cast .

  6. #26
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Tu lui as dis que le cast ne servait pas ?

  7. #27
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Je l'ai renvoyé sur ce topic, simplement.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Clad3
    J'ai envoyé un mail parlant de ce problème à mon prof qui m'a répondu ceci, sans rien d'autre dans son mail (pas d'explication) et j'ai du mal à comprendre ce qu'il veux me faire comprendre, auriez vous une idée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main()
    {
           char *plop = (char *) malloc(10);
    }
    Tel quel ce code n'est pas portable, car malloc() est appelé sans prototype (pas de <stdlib.h> en vue). Il retourne donc un int, et celui-ci est casté en (char *), ce qui invoque un comportement dépendant de l'implémentation.
    A part qu'il alloue délibérément trop d'espace pour son pointeur je ne vois pas en quoi cela illustre la nécessité d'un cast .
    Là, par contre, tu fais des confusions. Ce code alloue un bloc de 10 char consécutifs, ce qui est tout à fait possible (tableau de 10 char). L'adresse du bloc est retournée par malloc() et celle-ci est stockée dans le pointeur pour un usage ultérieur.

    Ceci est correct et portable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdlib.h>
     
    int main (void)
    {
       char *plop = malloc (10);
     
       /* test, utilisation, liberation... */
       return 0;
    }

  9. #29
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Ce code alloue un bloc de 10 char consécutifs
    Pour moi ce code alloue 10 octect consécutif et non 10 char, hum sauf bien sur si un char fait 1 octect quelles que soit la machine / le compilateur utilisé.

    En admettant que l'on ai 10 char [ 10*szeof(char) ou 10*sizeof( *plop ) ], en quoi cela illustre-t-il la nécessité d'un cast ( car je supose que c'est un exemple visant à me montrer cela que mon prof m'a envoyé .... ) .


    edit: A mon avis il n'a pas inclu stdlib.h juste car il a du écrire un exemple a la va vite, donc on va suposer que la lib est incluse .

  10. #30
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    La confusion du cast tient son origine peut être aussi parce que le prototype de malloc spécfie que cette fonction renvoi un void*.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Clad3
    Pour moi ce code alloue 10 octect consécutif
    Non. C'est bien 10 char. L'unité de compte de la taile d'un objet est le char (ou byte) quelque soit la machine, et elle vaut 1 (comme toutes les unités). La taille d'un char en bits est d'au moins 8. Ca peut être plus. Voir CHAR_BIT dans <limits.h>
    En admettant que l'on ai 10 char [ 10*szeof(char) ou 10*sizeof( *plop ) ], en quoi cela illustre-t-il la nécessité d'un cast ( car je supose que c'est un exemple visant à me montrer cela que mon prof m'a envoyé .... ) .
    Je n'en ai aucune idée, il faut lui demander. On est pas dans la tête de ton prof... J'ai juste relevé que le code était non portable. Peut être a-t-il voulu masquer l'incohérence int/char* signalée par son compilateur avec un cast...
    edit: A mon avis il n'a pas inclu stdlib.h juste car il a du écrire un exemple a la va vite, donc on va suposer que la lib est incluse .
    Quelle 'lib' ? Tu parles du fichier d'en-tête ? La moité des problèmes d'incompréhension du langage C sont dus à une mauvaise utilisation du vocabulaire. Il faut apprendre à être précis dans le choix de ses mots.

    Dans ce cas, le cast est totalement inutile. Je ne sais pas ce que ton prof a voulu prouver.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par hegros
    La confusion du cast tient son origine peut être aussi parce que le prototype de malloc spécfie que cette fonction renvoi un void*.
    Le cast avait un sens en C pré-Ansi, avant l'invention du mot 'void'. malloc() retournait alors un char*, et oui, il fallait caster. Mais bon, c'était avant 89. J'ai commencé le C en 88 (TC 2.0)... BC 3.0 (ANSI) est sorti en 90.

  13. #33
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Je viens de voir que en effet sizeof(char) est bien de 1 et ca semble assuré.

    Quelle 'lib' ? Tu parles du fichier d'en-tête ? La moité des problèmes d'incompréhension du langage C sont dus à une mauvaise utilisation du vocabulaire. Il faut apprendre à être précis dans le choix de ses mots.
    Mea culpa, j'ai régidé ce message trop vite, (dans ma tête "stdLIB" donc j'ai écrit lib ...) Bref je parlais du fichier d'entête stdlib.h .

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/01/2008, 14h02
  2. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  3. [débutant][Conception] Structure dynamique avec Java
    Par blaiseac dans le forum Général Java
    Réponses: 5
    Dernier message: 18/11/2004, 23h00
  4. [C++ .NET] Structure dynamique
    Par tidou dans le forum VC++ .NET
    Réponses: 17
    Dernier message: 29/10/2004, 20h08
  5. Réponses: 12
    Dernier message: 26/04/2004, 08h32

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