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 :

fonction qui rend le numero d'un caractére


Sujet :

C++

  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 8
    Points
    8
    Par défaut fonction qui rend le numero d'un caractére
    salut;
    je cherche la fonction qui donne le numero d'un caractére dans une chaine de caractéres. je la connais en pascal, c'est "ord" je la veux en c++ svp.
    j'attend vos réponces et merci d'avance.

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Un caractère en C/C++ peut être considéré comme un entier.

    je ne sais pas si cela répond à ton besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    #include <cstdlib>
     
    int main(void) {
     
       for (char c='a' ; c < 'z' ; c++) {
             std::cout << "caractere " << c << " --> " << int(c) << std::endl;
       }
      return EXIT_SUCCESS;
    }
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    C'est du C

    C'est du C++
    Homer J. Simpson


  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Par miracle, c'est aussi du C++

    Citation Envoyé par Astraya Voir le message
    C'est du C++
    Et c'est pas très beau

    Pour le coup, utiliser static_cast<>() est certes plus sûr, mais vu la complexité du code original, c'est vraiment exagéré. Il faut quand même se rappeler qu'en tant que programmeurs, on a l'obligation de programmer à destination des autres programmeurs, et non pas à destination de la machine, pour lui faire plaisir. Et au vu de la différence de lisibilité, le clou int(C) n'a pas besoin d'être déchiqueté par l'arme atomique static_cast<>()

    Sinon, il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char c = '$';
    int ic = c;
    Il n'y a pas besoin de cast, grâce aux règles de promotion vers les entiers.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Par miracle, c'est aussi du C++
    Tout comme les macros et autres héritages du C, c'est pas pour ça qu'il est recommandé de les utilisés.
    Et c'est pas très beau
    Certains designer outre atlantique ne dirais pas la même choses

    Il faut quand même se rappeler qu'en tant que programmeurs, on a l'obligation de programmer à destination des autres programmeurs, et non pas à destination de la machine, pour lui faire plaisir
    Je trouve justement (personnellement) que le "cast à la C++" est plus lisible qu'un cast C, dans un contexte simple et plus complexe. En posant les yeux sur le code, on observe directement qu'il y a un transtypage sans même lire en détail.

    Et au vu de la différence de lisibilité, le clou int(C) n'a pas besoin d'être déchiqueté par l'arme atomique static_cast<>()
    C'est juste une habitude, ça ne mange pas de pain, tout est fait à la compilation.
    Dans un petit programme comme celui là d'accord, mais si le code venais à évoluer dans un programme plus conséquent et complexe? Mais il vaut mieux prendre de bonne habitude plutôt que d'apprendre à utilisé des restes d'évolutions. Connaitre leurs existences et leurs utilisations oui, savoir pourquoi il existe et leurs limites encore mieux.
    Homer J. Simpson


  6. #6
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Citation Envoyé par Astraya Voir le message
    Par miracle, c'est aussi du C++
    Ah, j'ai toujours pensé que c'était plus du C++ que du C…
    C'est vrai, quoi, ça me fait penser à l'appel d'un constructeur…

  7. #7
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Ah, j'ai toujours pensé que c'était plus du C++ que du C…
    C'est vrai, quoi, ça me fait penser à l'appel d'un constructeur…
    Tu as raison.

    En C le cast aurait été écrit (int) c.
    La notation fonctionnelle int(c) pour le cast est du c++, pas du c.

    D'ailleurs il font bien la différence entre les deux cast (functional et c-like) dans
    http://www.cplusplus.com/doc/tutorial/typecasting/
    Explicit conversion
    C++ is a strong-typed language. Many conversions, specially those that imply a different interpretation of the value, require an explicit conversion. We have already seen two notations for explicit type conversion: functional and c-like casting:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    short a=2000;
    int b;
    b = (int) a;    // c-like cast notation
    b = int (a);    // functional notation
    pour s'en convaincre un peu plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char * argv[]) {
      char a = 'c';
      int  b = a;
      int  c;
      c = (int) a;
      int d;
      d = int(a);
     
      printf("%c %d %d %d\n",a,b,c,d);
      return EXIT_SUCCESS;
    }
    Ne compile tout simplement pas avec gcc (compilateur C), la ligne 10 correspond au cast fonctionnel.
    test.c: In function ‘main’:
    test.c:10: error: expected expression before ‘int’
    Par contre avec g++ (compilateur C++), ça passe comme une lettre à la poste.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  8. #8
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    C'est moi ou c'est une ressemblance, voir exactement, une construction par copie du int? Où bien c'est une choses différente au vu du compilateur?
    Cela voudrais dire, création de int puis affectation. Dans le cas d'un cast C++ static_cast<int> qu'elle aurait été la différence?

    Edit: En répondant par avance à ma question, le code machine n'a aucune différence, donc ne serais-ce que juste un différence syntaxique? Sans parler des check à la compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    b = (int) a;    // c-like cast notation
    01011034  movsx       ecx,word ptr [a] 
    01011038  mov         dword ptr [b],ecx 
    b = int (a);    // functional notation
    0101103B  movsx       edx,word ptr [a] 
    0101103F  mov         dword ptr [b],edx 
    c = static_cast<int>(a);
    01011042  movsx       eax,word ptr [a] 
    01011046  mov         dword ptr [c],eax
    Homer J. Simpson


  9. #9
    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 Astraya Voir le message
    C'est moi ou c'est une ressemblance, voir exactement, une construction par copie du int?
    C'est toi. Une construction par copie d'un int, c'est
    Dans le cas d'un cast C++ static_cast<int> qu'elle aurait été la différence?

    Edit: En répondant par avance à ma question, le code machine n'a aucune différence, donc ne serais-ce que juste un différence syntaxique? Sans parler des check à la compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    b = (int) a;    // c-like cast notation
    01011034  movsx       ecx,word ptr [a] 
    01011038  mov         dword ptr [b],ecx 
    b = int (a);    // functional notation
    0101103B  movsx       edx,word ptr [a] 
    0101103F  mov         dword ptr [b],edx 
    c = static_cast<int>(a);
    01011042  movsx       eax,word ptr [a] 
    01011046  mov         dword ptr [c],eax
    est simplement une autre expression syntaxique de
    et cette derniere forme est la premiere valide(*) d'une serie d'interpretations exprimables avec les casts C++ -- const_cast, static_cast, const_cast(static_cast), reinterpret_cast, const_cast (reinterpret_cast) -- dans le cas present, c'est un static_cast. Pas etonnant donc qu'au final tu te retrouves avec exactement le meme code.

    (*) Pour etre complet, il y a aussi des choses qui sont possibles avec cette forme qui ne le sont pas avec les casts C++.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Citation Envoyé par Astraya Voir le message
    C'est moi ou c'est une ressemblance, voir exactement, une construction par copie du int?
    C'est toi. Une construction par copie d'un int, c'est
    Personnellement, j'aurais tendance à penser qu'on appelle explicitement un constructeur par copie pour créer un int temporaire, qui est affecté à b ; ensuite, cet int temporaire est automatiquement détruit.

    Donc, en résumé, nous avons :
    • une construction par copie ;
    • une affectation ;
    • une destruction.

  11. #11
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    merci bcp pour vos aides

  12. #12
    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,

    Le fait est que les cast explicites de C++ ont, justement, l'énorme avantage... d'être explicite...

    Si tu sais que tu transtype la variable a, une recherche du texte sur le_cast_adapté<int>(a), même si elle s'effectue sur l'ensemble des fichiers d'un projet, te permettra de retrouver directement uniquement les transtypages recherchés, alors qu'une recherche sur (int) ou sur (a) rajoutera au résultat
    • les déclaration de fonction prenant un int en argument (dans le cas de (int) )
    • les appels de fonctions auxquelles on passe une variable a (dans le cas de (a) )

    Nous avons donc un double avantage pour les casts explicites: ils ne laissent planer aucun doute sur l'objectif poursuivi à la lecture ET il permettent d'obtenir un résultat plus correct lors de la recherche, le tout sans que cela ne prenne plus de temps à l'exécution (du moins pour static_cast et reinterpret_cast).

    Citation Envoyé par Steph_ng8 Voir le message
    Personnellement, j'aurais tendance à penser qu'on appelle explicitement un constructeur par copie pour créer un int temporaire, qui est affecté à b ; ensuite, cet int temporaire est automatiquement détruit.

    Donc, en résumé, nous avons :
    • une construction par copie ;
    • une affectation ;
    • une destruction.
    Je ne peux pas nier que c'est l'impression "naïve" qui peut ressortir de premier abord, mais il faut aussi prendre en compte le (N)RVO qui a de grandes chances d'entrer en jeu et de supprimer les créations / affectations surnuméraires par rapport au moyen le plus efficace de le faire.

    De plus, nous sommes beaucoup plus près d'un opérateur de conversion (template <typename T> int operator()(T t) ) que d'un (pesudo) constructeur qui serait utilisé sous la forme de int b(a).

    Enfin, si l'on retient l'idée qu'il s'agit d'un pseudo constructeur, et bien que je les utilise régulièrement dans mes listes d'initialisation, je dois reconnaitre que le pseudo constructeur est une possibilité de C++ certes très utile pour éviter la zéro initialisation mais qui me semble, de mon seul (et unique ) avis personnel conceptuellement absolument pas naturelle

    Autant je n'ai aucun problème à envisager l'idée de constructeur pour les trois sortes de types définis par l'utilisateur que sont les unions, les structures et les classes, autant j'ai vraiment énormément de mal à l'envisager pour les type primitifs, qui ne sont même pas à ranger dans le rayon des types définis par l'utilisateur
    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

  13. #13
    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
    Reprenons. Par définition le constructeur de copie est un constructeur qui prend en premier paramètre une référence (éventuellement qualifiée) vers objet de même type que celui construit et qui a des valeurs par défaut pour les éventuels autres arguments.

    La notation T(x) est généralement utilisée quand le type de x n'est pas le type de T, donc en général elle ne peut pas être considérée comme un appel au constructeur de copie. Et la norme défini cette notation comme étant l'équivalent de (T)x et non d'un appel à un constructeur, qu'il soit de copie ou non. (La norme défini T(x, y, z) comme étant la construction d'un objet temporaire). Si on poursuit la chaîne de définition plus en avant, dans certains cas (T)x est bien défini en fonction du constructeur de T prenant un objet du type de x en paramètre, mais d'autres cas sont possibles. Dans l'exemple suivant, les constructeurs de copie n'interviennent nulle part.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct Y {};
    struct X { operator Y() const; };
    ...
       X x;
       Y y;
       y = Y(x);
    Le fait qu'il soit parfois possible d'élider des constructeurs de copie (que ce soit avec la (N)RVO ou pour d'autres raisons) n'intervient pas.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Réponses: 12
    Dernier message: 03/08/2010, 18h54
  2. Fonction qui retourne le numero de colonne?
    Par alex830001 dans le forum Excel
    Réponses: 4
    Dernier message: 13/11/2008, 15h12
  3. fonction qui renvoie le code d'un caractère
    Par isac83 dans le forum Langage
    Réponses: 2
    Dernier message: 07/11/2008, 11h35
  4. Fonction qui rend un pointeur
    Par WaM dans le forum C
    Réponses: 6
    Dernier message: 20/05/2006, 19h31
  5. Fonction qui rend nul le bouton d'alimentation ?
    Par rpoulin dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2005, 05h03

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