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. #61
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    On peut utiliser &a quand on veut un pointeur sur tableau.
    Utile dans la déclaration d'une fonction pour s'assurer que le tableau a une taille donnée:
    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
    void EcritDansTableau(int (*pTab)[10])
    {
       int *pVal = *pTab; /*conversion implicite int[10] -> int* */
       size_t i;
       for(i=0 ; i<10 ; i++)
          pVal[i] = (int)(i*2);
    }
     
    int main(void)
    {
       int tab1[8];
       int tab2[10];
       int tab3[12];
     
       EcritDansTableau(&tab1); /* Echec, trop petit */
       EcritDansTableau(&tab2); /* OK */
       EcritDansTableau(&tab3); /* Echec, trop grand */
     
       return 0;
    }
    Edit: Bizarre, sous Visual 2005, je n'ai droit qu'à des warnings:
    1>c:\<snip>\testarrayc.c(132) : warning C4048: different array subscripts : 'int (*)[10]' and 'int (*__w64 )[8]'
    1>c:\<snip>\testarrayc.c(134) : warning C4048: different array subscripts : 'int (*)[10]' and 'int (*__w64 )[12]'
    Edit2: Jean-Marc : Parfait
    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.

  2. #62
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par http://www.comeaucomputing.com/tryitout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "ComeauTest.c", line 15: error: argument of type "int (*)[8]" is incompatible with
              parameter of type "int (*)[10]"
         EcritDansTableau(&tab1); /* Echec, trop petit */
                          ^
     
    "ComeauTest.c", line 17: error: argument of type "int (*)[12]" is incompatible with
              parameter of type "int (*)[10]"
         EcritDansTableau(&tab3); /* Echec, trop grand */
                          ^

  3. #63
    Membre émérite 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
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    La valeur de la variable a ... la valeur de l'expression a
    Selon moi, c'est la même chose.

  4. #64
    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
    Citation Envoyé par stephl
    Selon moi, c'est la même chose.
    Libre à toi... Mais ce n'est pas le cas.

    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. #65
    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
    Citation Envoyé par Jean-Marc.Bourguet
    Je n'en suis pas sur. On risque d'entrer dans un debat tres technique sur la notion de valeur dans la norme. Si j'ai bonne memoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert((void*)a == (void*)&a);
    peut echouer.
    Là, je ne vois pas pourquoi, mais si tu trouve le temps de détailler un peu plus, ça m'intéresse. Merci pour ces remarques intéressantes.

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

    +

  6. #66
    Membre émérite 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
    Par défaut
    Citation Envoyé par mujigka
    Libre à toi... Mais ce n'est pas le cas.

    Thierry
    Et quelle différence faites-vous entre valeur d'une variable et valeur d'une expression? C'est la première fois que j'entends cette distinction et je ne crois pas qu'elle figure dans le K&R.

  7. #67
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par stephl
    Et quelle différence faites-vous entre valeur d'une variable et valeur d'une expression? C'est la première fois que j'entends cette distinction et je ne crois pas qu'elle figure dans le K&R.
    Le point est qu'il y a une conversion implicite qui entre en jeu. J'aurais pu ecrire de meme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double d= 5.1;
    f(int);
     
    f(d)
    La valeur de la variable d est 5.1 mais la valeur de l'expression d dans f(d) est de 5 mais ca semble moins naturel (peut-etre parce que la conversion implicite flottant->int n'est pas aussi souvent presente que la conversion T[] vers T*).

  8. #68
    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
    Citation Envoyé par stephl
    Et quelle différence faites-vous entre valeur d'une variable et valeur d'une expression? C'est la première fois que j'entends cette distinction et je ne crois pas qu'elle figure dans le K&R.
    Pour moi, la valeur est toujours associée à un type. Or c'est un fait qu'en C, et là K&R2 et la norme convergent, le type de a n'est pas le même que le type de l'expression a, car une convertion implicite a lieu dans ce dernier cas. C'est peut-être pédant, mais on est sur un forum technique, et il convient d'être précis.

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

    +

  9. #69
    Membre émérite 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
    Par défaut
    La valeur de l'expression "d" est indépendante de l'expression (plus large) dans laquelle elle intervient. La valeur de l'expression "d" est toujours 5.1; le cast implicite intervient seulement après. Je crois que je ne saisis pas la différence que vous faites entre valeur de variable et valeur d'expression. C'est trop abstrait pour moi.

  10. #70
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mujigka
    Là, je ne vois pas pourquoi, mais si tu trouve le temps de détailler un peu plus, ça m'intéresse. Merci pour ces remarques intéressantes.
    C'est le meme genre de raisonnement qui fait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char a[10][65536];
    char* ptr=&a[5][65535];
    ++ptr;
    *ptr='x';
    est du comportement indefini parce qu'on accede a l'element qui suit le dernier dans un tableau (donc avec une architecture segmentee et des segments de tailles 65536, le compilateur peut supposer tout en etant conforme que l'incrementation ne peut pas changer de segment).

    Les pointeurs en C sont en fait des paires objet tableau de quelque chose, indice dans un tel objet. a a pour valeur le tableau a (de type char[10]), indice 0; &a a pour valeur le table de type char[1][10] dont le premier element est a, indice 0.

  11. #71
    Membre émérite 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
    Par défaut
    Citation Envoyé par mujigka
    Pour moi, la valeur est toujours associée à un type. Or c'est un fait qu'en C, et là K&R2 et la norme convergent, le type de a n'est pas le même que le type de l'expression a, car une convertion implicite a lieu dans ce dernier cas. C'est peut-être pédant, mais on est sur un forum technique, et il convient d'être précis.

    Thierry
    D'accord pour le type, j'ai bien compris avec vos différentes explications, mais ici il s'agit de la valeur: valeur de variable et valeur d'expression.

  12. #72
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par stephl
    La valeur de l'expression "d" est indépendante de l'expression (plus large) dans laquelle elle intervient. La valeur de l'expression "d" est toujours 5.1; le cast implicite intervient seulement après. Je crois que je ne saisis pas la différence que vous faites entre valeur de variable et valeur d'expression.
    Comme je l'ai ecrit, pour d ca passe plus difficilement. On peut sans probleme -- c'est meme plus rigoureux -- considerer que la valeur de a n'est jamais le pointeur vers son premier element. C'est toujours le tableau complet.

    C'est trop abstrait pour moi.
    Ce n'est pas de l'abstraction, c'est une concession a la pratique observee.

  13. #73
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mujigka
    Pour moi, la valeur est toujours associée à un type.
    La valeur de 0 et la valeur de 0.0 est bien la meme, meme si les types sont differents, meme si les representations sont differentes.

    La valeur de (void*)&x et de &x sont bien les memes, meme si les types sont differents, meme si les representations sont differentes.

    Sans parler du fait que les valeurs ayant plusieurs types, c'est la definition meme du polymorphismes d'inclusion qui une des composantes indispensables de l'OO.

  14. #74
    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 Jean-Marc.Bourguet
    Le type de &a est char (*)[N]. Essaie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f() {
       char a[10];
       char** p1 = &a;
       char (*p2)[10] = &a;
    }
    dans un compilateur. Moi j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `main':
    main.c:4: warning: initialization from incompatible pointer type

  15. #75
    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
    Citation Envoyé par Jean-Marc.Bourguet
    C'est le meme genre de raisonnement qui fait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char a[10][65536];
    char* ptr=&a[5][65535];
    ++ptr;
    *ptr='x';
    est du comportement indefini parce qu'on accede a l'element qui suit le dernier dans un tableau (donc avec une architecture segmentee et des segments de tailles 65536, le compilateur peut supposer tout en etant conforme que l'incrementation ne peut pas changer de segment).

    Les pointeurs en C sont en fait des paires objet tableau de quelque chose, indice dans un tel objet. a a pour valeur le tableau a (de type char[10]), indice 0; &a a pour valeur le table de type char[1][10] dont le premier element est a, indice 0.
    Merci! C'est vrai que là, c'est un peu trop technique pour moi et j'ai du mal à saisir le mécanisme que tu décris.

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

    +

  16. #76
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `main':
    main.c:4: warning: initialization from incompatible pointer type
    Ajoute -pedantic-errors a tes options de gcc.

  17. #77
    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
    Mais il me semble que a et &a[0] ne sont pas réellement équivalents: &a[0] doit être de type T*, contrairement à a qui est de type T[N] implicitement convertible en T*

    Ce qui explique que a est un tableau et possède une adresse, alors que &a[0] n'est pas une lvalue...
    Bon, ben voilà, cette fois je crois j'ai compris...

    Merci.

  18. #78
    Membre émérite 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
    Par défaut
    Merci pour toutes ces explications. J'aurai au moins appris que l'on peut utiliser & devant un nom de tableau, même si je continuerai à éviter de le faire (chacun ses goûts).

  19. #79
    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
    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
    void EcritDansTableau(int (*pTab)[10])
    {
       int *pVal = *pTab; /*conversion implicite int[10] -> int* */
       size_t i;
       for(i=0 ; i<10 ; i++)
          pVal[i] = (int)(i*2);
    }
     
    int main(void)
    {
       int tab1[8];
       int tab2[10];
       int tab3[12];
     
       EcritDansTableau(&tab1); /* Echec, trop petit */
       EcritDansTableau(&tab2); /* OK */
       EcritDansTableau(&tab3); /* Echec, trop grand */
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    main.c: In function `main':
    main.c:17: warning: passing arg 1 of `EcritDansTableau' from incompatible pointer type
    main.c:19: warning: passing arg 1 of `EcritDansTableau' from incompatible pointer type
    Je n'aurait pas osé ne faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *pVal = *pTab; /*conversion implicite int[10] -> int* */
    mais c'est correct et logique.

    Au fait, on peut utiliser es propriétés du type tableau pour déterminer la taille de l'objet pointé :
    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
     
    #include <stdio.h>
     
    void EcritDansTableau (int (*pTab)[10])
    {
       int *pVal = *pTab;           /*conversion implicite int[10] -> int* */
       size_t i;
       for (i = 0; i < sizeof *pTab / sizeof **pTab; i++)
          pVal[i] = (int) (i * 2);
    }
     
    void AfficherTableau (int const (*pTab)[10])
    {
       int const *pVal = *pTab;     /*conversion implicite int[10] -> int* */
       size_t i;
       for (i = 0; i < sizeof *pTab / sizeof **pTab; i++)
          printf ("%4d", pVal[i]);
       printf ("\n");
    }
     
    int main (void)
    {
       int tab2[10];
     
       EcritDansTableau (&tab2);
       AfficherTableau (&tab2);
     
       return 0;
    }
    Par contre j'ai un problème avec le const. Il doit être mal placé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.c: In function `main':
    main.c:25: warning: passing arg 1 of `AfficherTableau' from incompatible pointer type
    et la maintenance est cauchemardesque, à moins d'utiliser un type tableau...
    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
     
    #include <stdio.h>
     
    typedef int int_a [10];
     
    void EcritDansTableau (int_a *pTab)
    {
       int *pVal = *pTab;           /*conversion implicite int[10] -> int* */
       size_t i;
       for (i = 0; i < sizeof *pTab / sizeof **pTab; i++)
          pVal[i] = (int) (i * 2);
    }
     
    void AfficherTableau (int_a const *pTab)
    {
       int const *pVal = *pTab;     /*conversion implicite int[10] -> int* */
       size_t i;
       for (i = 0; i < sizeof *pTab / sizeof **pTab; i++)
          printf ("%4d", pVal[i]);
       printf ("\n");
    }
     
    int main (void)
    {
       int tab2[10];
     
       EcritDansTableau (&tab2);
       AfficherTableau (&tab2);
     
       return 0;
    }
    mais j'ai le même problème de constantness...

  20. #80
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mujigka
    Merci! C'est vrai que là, c'est un peu trop technique pour moi et j'ai du mal à saisir le mécanisme que tu décris.
    Comme je l'ai ecrit, je ne suis pas sur a 100% de moi sur ca.

    Dans le meme genre de chose (mais la je suis beaucoup plus sur)
    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 };
    char getCFromA(struct a) {
       return a.c;
    }
     
    char getCFromU(union u) {
       return u.a.c;
    }
    union uu;
    ...
    uu.b.c = 'a';
    Alors getCFromA(uu.a) n'est pas conforme tandis que getCFromU(uu) l'est.

+ Répondre à la discussion
Cette discussion est résolue.

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