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 :

concaténation de char*


Sujet :

C

  1. #41
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    alors si je reprend bien en c je peut faire une fonction de type void* et faire return UnString et le recuperer!

  2. #42
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Trap D
    Oui, mais il faut partir du principe qu'en C on n'a pas de garde-fou, le programmeur est sensé savoir ce qu'il fait. J'ai l'impression que tu raisonnes avec l'optique C++ où je pense, (je n'y connais rien en C++) qu'on est plus guidé et surveillé.
    Ma vision n'etait pas celle d'un programmeur C++, mais celle de la theorie des types: j'etais en train d'expliquer pourquoi c'etait un trou dans le systeme de type. Le but d'un systeme de type c'est de ne pas permettre ce genre d'erreur, quite a interdire des operations valides (c'est pourquoi il y a generalement moyen de contourner le systeme de type, avec des casts par exemple).

  3. #43
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par jerem2000
    alors si je reprend bien en c je peut faire une fonction de type void*
    Ce n'est pas un type de fonction. Tu peux faire une fonction qui retourne un void*,

    et faire return UnString et le recuperer!
    dans un double*. Oui... maintenant, l'effet est potentiellement desastreux. Si tu recuperes dans un char*, ca ira mieux.

  4. #44
    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 : 68
    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 jerem2000
    hmmm il y a un petit probleme la dans ton code dit moi si jme trompe mais malloc renvoi un void*!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *malloc(size_t size);
    Et ?

    http://emmanuel-delahaye.developpez....tes.htm#malloc

  5. #45
    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 : 68
    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 jerem2000
    en effet je compile en c++ mais je ne trouve pas ca logique en c!
    Pourquoi tu compiles en C++ ? Tu écris en C ou en C++ ? Parce que ici, c'est le forum C. Alors décide toi.

    Le C et le C++ sont des langages différents.

    http://david.tribble.com/text/cdiffs.htm

  6. #46
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    je compile en c++ et jecrit en c++ et jai besoin de cette fonction malloc!

  7. #47
    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 : 68
    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 Jean-Marc.Bourguet
    La conversion implicite de void* en un autre type de pointeur continue a me sembler bizarre.
    En tout cas, c'est pratique et simple. Evidemment, il faut être réveillé, car le C, c'est pas le Pascal... C'est un vrai langage de geeks... On travaille sans filets... Si on aime pas le C, les alternatives ne manquent pas...

  8. #48
    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 : 68
    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 Jean-Marc.Bourguet
    C'est une conversion implicite qui n'est pas garantie de donner un resultat sense.
    Ah ? De mémoire, en C, la conversion T* <-> void* est garantie par la norme. Faut que je vérifie ?

  9. #49
    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 : 68
    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 Jean-Marc.Bourguet
    Il ne faut pas réécrire l'histoire. void* provient du C++, a été repris en C où on a ajouté la conversion implicite vers les autres pointeurs (contre l'avis de D. Ritchie d'ailleurs si je ne me trompe pas).
    Tu ne confonds pas avec const ?

    void, je ne sais même pas si ça existe en C++. Alors void * ...

  10. #50
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    En tout cas, c'est pratique et simple. Evidemment, il faut être réveillé, car le C, c'est pas le Pascal... C'est un vrai langage de geeks... On travaille sans filets... Si on aime pas le C, les alternatives ne manquent pas...
    "C'est un langage pour les hommes, les vrais ceux qui ne font pas d'erreurs... "

    C'est un genre de discours qui ne m'interpelle pas. Je suis faillible, je fais des erreurs. Les gens autour de moi en font aussi. On travaille plus efficacement quand le compilateur les signale avant qu'elles ne se signalent elles-même par des erreurs de fonctionnement.

    Etre limite et ne pas pouvoir contourner le système de type quand c'est nécessaire m'embête tout comme avec des trous dans le systeme de type.

  11. #51
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ah ? De mémoire, en C, la conversion T* <-> void* est garantie par la norme. Faut que je vérifie ?
    T* -> void* -> T* est garanti. Mais U* -> void* -> T* pas. Donc void* -> T* n'est pas garanti en general.

  12. #52
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu ne confonds pas avec const ?
    Non, mais je me trompais. Apres vérifications, void a bien ete introduit en C avant que C++ ne commence. Et void* a ete introduit dans les deux langages a peu pres en même temps.

  13. #53
    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 : 68
    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 Jean-Marc.Bourguet
    T* -> void* -> T* est garanti. Mais U* -> void* -> T* pas. Donc void* -> T* n'est pas garanti en general.
    Ben oui, c'est ce que je dis, il faut savoir ce qu'on fait...

  14. #54
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ben oui, c'est ce que je dis, il faut savoir ce qu'on fait...
    Heureux es-tu de ne jamais te tromper et d'avoir des collegues aussi infaillibles que toi... mes collegues et moi sommes plus humains et nous constatons regulierement que nous ne savons pas toujours ce que nous faisons. Nous nous demandons aussi -- parfois a tord, parfois a raison -- si nos predecesseurs savaient ce qu'ils faisaient.

    Ca ne me derange pas de signaler que je pense avoir bien considere la situation quand je tape dans des choses potentiellement dangereuses... A peu pres le seul endroit ou devoir caster un void* serait genant, c'est en tant que retour de malloc et realloc, et ca ne m'embeterait pas plus que cela.

    Je ne suis pas pour changer la situation en C -- je ne suis pas tres loin de la position de B. Stroustrup qui trouve que l'augmentation de la compatibilite en C et C++ est une raison suffisante pour changer la regle en C++ -- mais on ne me fera pas dire qu'elle est une bonne chose en soi.

  15. #55
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Je ne comprends pas ce que tu veux dire.
    Avec conversion implicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void *pv = NULL;
    const void *pcv = NULL;
    int *pi;
    const int *pci;
     
    pi = pv; //OK
    pci = pv; //OK
    pci = pv; //Signale une erreur de compil
    pci = pcv; //OK
    Avec conversion explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void *pv = NULL;
    const void *pcv = NULL;
    int *pi;
    const int *pci;
     
    pi = (int *)pv; //OK
    pci = (const int *)pv; //OK
    pci = (int *)pv; //Ça compile, mais c'est pas OK! Perte du const sans warning!
    pci = (const int *)pcv; //OK
    Tu comprends maintenant l'intéret de la conversion implicite de void* ? Moins de risque de perte de const

  16. #56
    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 : 68
    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 Médinoc
    Tu comprends maintenant l'intéret de la conversion implicite de void* ? Moins de risque de perte de const
    cast et typecast sont des démons...

  17. #57
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Ben oui.
    Heureusement qu'en C on peut s'en passer plus facilement qu'en C++...

  18. #58
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc
    Tu comprends maintenant l'intéret de la conversion implicite de void* ? Moins de risque de perte de const
    Ah... tu veux dire que le trou introduit par la conversion implicite void* vers T* n'est pas aussi gros qu'il aurait pu l'être, même s'il n'est pas sûr quant au type, il l'est quant à la quantification.

    Il faut admettre que le C accorde une grande importance à const. Il permet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char const* p1;
    char p2;
     
    p2 = strchr(p1, 'x');
    *p2 = 'y';
    et interdit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char const* const* const* p1;
    char const*** p2;
     
    p1 = p2;

  19. #59
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    strchr() est un problème connu, corrigé par le C++ sous forme de surcharge de la fonction.
    Personnellement, quand j'ai affaire à une fonction de ce style, j'en déclare deux versions avec des noms différents et puis basta...

    Une autre chose que le C refuse (pourquoi??) et que le C++ accepte, c'est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char ** pps;
    char const * const * pcpcs = pps;
    Par contre, les deux refusent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const ** ppcs = pps;
    Pour des raisons que j'avais mis du temps à comprendre. En fait, en modifiant *ppcs, on pourrait mettre des const char * dedans, qui seraient alors accessibles en écriture par pps...


    Enfin, justement, ce n'est pas parce que le C a des bugs de const-correctness qu'il faut pinailler sur quelque chose qui est enfin bien fait dans ce sens!

Discussions similaires

  1. concaténer deux char*
    Par ikuzar dans le forum C++
    Réponses: 6
    Dernier message: 28/03/2011, 19h31
  2. Opérateur de concaténation pour char *
    Par yves042 dans le forum C++
    Réponses: 2
    Dernier message: 06/05/2010, 11h12
  3. Réponses: 5
    Dernier message: 20/03/2009, 19h16
  4. [C++] Concaténer un char[50] avec un int
    Par Invité4 dans le forum C++
    Réponses: 10
    Dernier message: 07/04/2006, 15h54
  5. concaténation de char et float
    Par gup dans le forum C
    Réponses: 11
    Dernier message: 31/12/2005, 01h15

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