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 :

convertir integer en string


Sujet :

C

  1. #101
    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 : 67
    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
    PS2 : Ici, je ne me suis pas amusé avec les const, une chose compliquée à la fois s'il vous plait!
    Pas de Wi-Fi à la maison : CPL

  2. #102
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Bof
    Il y a des utilisateurs vicieux...
    Je suppose que vous voulez dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #undef N
    #define N 100
    En effet, mais l'utilisateur étourdi (qui pourrait très bien être moi ) n'a qu'à faire attention. Le C laisse beaucoup de libertés au programmeur et suppose que ce dernier sait ce qu'il fait.

  3. #103
    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 : 67
    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 stephl
    Je suppose que vous voulez dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #undef N
    #define N 100
    Oui, déjà corrigé.
    Pas de Wi-Fi à la maison : CPL

  4. #104
    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 souviron34
    Peux-tu expliciter ?? je ne suis pas là...
    Dans une union, on ne peut acceder qu'au dernier membre ecrit, ici b. Donc lire a est normalement interdit mais il y a une exception: quand l'union est une union de struct qui commencent par les memes champs, on peut acceder aux champs communs.

    Modifions legerement le code pour voir facilement comment du code incorrect peut etre genere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct a { char c; };
    struct b {char c; char d; };
    union u { struct a a; struct b b };
    int getCFromA(struct a) {
       return a.c;
    }
     
    int getCFromU(union u) {
       return u.a.c;
    }
    union uu;
    ...
    uu.b.c = 'a';
    Prenons une architecture little endian avec un char non signe. Le compilateur peut decider que sizeof(struct a) va valoir 4 comme un int pour des raisons de perf. Il peut aussi decider de maintenir le padding a 0. De meme sizeof(struct b) va valoir 4 et il va y avoir un peu moins de padding.

    Lire a.c et le transformer en int consiste donc a ajouter des 0.

    getCFromA peut considerer que le padding est toujours present et valant 0. Donc lire simplement l'int qui se trouve a l'addresse.

    Dans getCFromU, le compilateur ne peut pas generer un code aussi simple et se fier au padding. Il doit lire le char tout seul et l'etendre avec des 0 pour masquer la valeur eventuelle de u.b.d.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #105
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    D'abord une remarque ..

    J'ai compilé ton code, Jean-Marc, sur mon Linux (redhat 7.3) (la fonction f) et voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    .//test1.c: In function `f':
    .//test1.c:5: warning: initialization from incompatible pointer type
    .//test1.c:6: warning: unused variable `p2'
    .//test1.c:5: warning: unused variable `p1'
    Pour rappel, la ligne 5 est la ligne de définition de p1 (compilé avec -Wall -pedantic)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #106
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Quant à l'autre problème, je comprend ce que tu veux dire, mais il me semblait que la définition même d'une union était que l'adresse physique de départ était la même. Et que, réservant la place la plus grande (en l'occurence ici pour la structure b), si le(s) premier(s) élément(s) a(ont) la même taille, quelque soit ce qu'il y a derrière, physiquement c'est écrit au même endroit...

    Et que dans ce cas (et uniquement dans ce cas) accèder l'un ou l'autre est rigoureusement identique...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #107
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Dans une union, on ne peut acceder qu'au dernier membre ecrit, ici b. Donc lire a est normalement interdit mais il y a une exception: quand l'union est une union de struct qui commencent par les memes champs, on peut acceder aux champs communs.
    Les structures a et b commençant par les même champs, je ne comprends pas pourquoi getCFromA(uu.a) n'est pas conforme?

    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++

    +

  8. #108
    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 souviron34
    Quant à l'autre problème, je comprend ce que tu veux dire, mais il me semblait que la définition même d'une union était que l'adresse physique de départ était la même. Et que, réservant la place la plus grande (en l'occurence ici pour la structure b), si le(s) premier(s) élément(s) a(ont) la même taille, quelque soit ce qu'il y a derrière, physiquement c'est écrit au même endroit...
    Les deux structs peuvent avoir la meme taille a cause du padding. Le compilateur peut faire des suppositions sur le padding (par exemple qu'il est toujours a 0) dans getCFromA et s'arranger pour que toutes les modifications d'une struct a respectent ces hypotheses et donc generer du code comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    getCFromA:
    	ret
    getCFromU:
            and P0,P0,#0x000000FF
    	ret
    en supposant une convention telle que les struct tenant dans un registre sont passees dans le registre P0 qui en sortie de fonction contient un resultat entier.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #109
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Les deux structs peuvent avoir la meme taille a cause du padding. Le compilateur peut faire des suppositions sur le padding (par exemple qu'il est toujours a 0) dans getCFromA et s'arranger pour que toutes les modifications d'une struct a respectent ces hypotheses et donc generer du code comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    getCFromA:
    	ret
    getCFromU:
            and P0,P0,#0x000000FF
    	ret
    en supposant une convention telle que les struct tenant dans un registre sont passees dans le registre P0 qui en sortie de fonction contient un resultat entier.
    Je veux bien qu'elles puissent avoir la même taille, mais le début est forcément physiquement à la même adresse, non ??
    Donc si j'écris un char et que les 2 structures commencent par un char, le char commence et se termine au même endroit dans les 2 structures, non ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #110
    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 souviron34
    Je veux bien qu'elles puissent avoir la même taille, mais le début est forcément physiquement à la même adresse, non ??
    Donc si j'écris un char et que les 2 structures commencent par un char, le char commence et se termine au même endroit dans les 2 structures, non ??
    Oui. Mais quand on accede au char par un struct a, le compilateur peut faire ce qu'il veut sur le padding. Supposer qu'il est toujours mis a 0 par exemple. Ou supposer qu'il peut l'ecraser. Ces suppositions ne sont pas valides quand il fait acces a un struct b. Elles ne sont pas non plus valides quand il fait acces a un struct a qui se trouve dans une union contenant un struct b. (D'ou le masquage du dernier octet dans mon exemple).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #111
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Oui, c'est ce que j'ai mis, mais je passe l'adresse d'un tableau non const et gcc rale. Pour moi, c'est pas logique et je soupçonne un bug de gcc (ce cas étant quand même hyper rare, je ne serais pas étonné).
    J'ai déjà lu quelqu'un gueuler sur ce sujet ici.

    Essaie ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char ** ppCh1 = NULL;
    	char const * const * pcpcCh2 = ppCh1;
    Ceci marche sous Visual 2005 en C comme en C++, et il me semble avoir lu ici que ça ne marche pas en C sous gcc.
    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.

  12. #112
    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
    J'ai déjà lu quelqu'un gueuler sur ce sujet ici.

    Essaie ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char ** ppCh1 = NULL;
    	char const * const * pcpcCh2 = ppCh1;
    Ceci marche sous Visual 2005 en C comme en C++, et il me semble avoir lu ici que ça ne marche pas en C sous gcc.
    Ce qui est normal, gcc a raison. Les règles du C et du C++ sont différentes. En C, on ne peut ajouter const qu'au niveau le plus extérieur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char* const* ppcCh3 = ppCh1;
    Et à regarder rapidement, c'est ce qui bloque Emmanuel aussi.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 6 sur 6 PremièrePremière ... 23456

Discussions similaires

  1. Convertir un type String en Integer VB-A
    Par sebeni dans le forum Général VBA
    Réponses: 1
    Dernier message: 09/05/2007, 16h18
  2. [VBScript] Convertir date en string
    Par rabi dans le forum VBScript
    Réponses: 4
    Dernier message: 26/12/2005, 11h26
  3. [jar] convertir URL en String
    Par c-top dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/11/2004, 11h19
  4. Integer ou string dans une DBGRID
    Par Yepazix dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/08/2004, 13h42
  5. Réponses: 6
    Dernier message: 14/02/2004, 14h01

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