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 :

Pb de compilation (newbie)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Par défaut Pb de compilation (newbie)
    Bonsoir à tous !
    Voilà mon pb : lorsque je compile le prg ci dessous, DevC++ me retourne l'erreur :
    invalid conversion from 'char' to 'const char'.

    Mon but étant de faire entrer 2 nombres (à 3 chiffres max.) dans 2 variables, pourquoi me renvoie-t-il cete erreur ?

    Merci d'avance !

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
        char c,d;
        char e[3];
        printf("Entrez 2 nombres :");
        strcpy(e,0);
        while ((c=getchar())!=32 && c!='\n' )
        strcat(e,c);
        d=getchar();
        if (d=='\n') 
        d=getchar();
        printf("%c et %c\n",c,d);
        system("pause");
        return 0;
    }

  2. #2
    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
    y'aurait pas des fois des étoiles dans le message d'erreur, étoiles que tu aurais par hasard oublié de recopier?

    Car tu utilise de bêtes caractères (char) sur des fonctions qui demandent une chaîne de caractères en paramètre (const char *)
    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. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Par défaut
    ok, mais comment je dois faire pour déclarer une chaine ( je croyais que * était pour les pointeurs)?

  4. #4
    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
    Une chaîne, c'est un tableau de caractères. On y réfère par l'adresse du premier d'entre eux.

    en déclarant char e[3], tu déclares un tableau de trois caractères.
    En passant e à une fonction, tu passe l'adresse du premier caractère ( &e[0] ). Comme tu peux le voir dans le prototype, strcat() prend deux paramètres, un char * et un const char * (deux pointeurs, l'un deux n'autorisant pas la modification).

    Au passage, sache que e a une taille limitée (3) donc le while est mauvais. Nous allons tenter ensemble de produire un code débuggué.

    Aussi, tu demandes l'entrée de deux nombres, mais tu saisis deux caractères (et non des nombres) que tu affiches également sous forme de caractères. que cherches-tu à faire exactement?
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Par défaut
    J'aimerais que ce programme, où l'on entre 2 nombres, donne des résultats après diverses opérations mathématiques...
    Le problème c'est que si je met mes variables en int, avec getchar, il ne me prends qu'1 chiffre par variable ( ex si je rentre 12 puis entrée le résulata me met 1 et 2), d'où le fait que j'essaie de passer en chaine de caracteres que je reconvertirer après...
    C'est un peu le foullis

  6. #6
    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
    OK.

    Alors pour commencer, il va falloir saisir les nombres, sous forme de chaînes (ex: on va taper "23"[entrée], ce sera une chaîne de caractères contenant les caractères '2', '3' '\n' et '\0' (caractère de fin de chaîne).

    Pour cela, il nous faut la place suffisante pour trois chiffres, le caractère de nouvelle ligne et le caractère nul pour terminer. Il nous faut donc de la place pour cinq caractères (et on initialise le tableau pour qu'il contienne une chaîne vide)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chnClavier[5] = "";
    Ensuite, pour lire la chaîne, nous allons utiliser une fonction standard plutot que le faire nous-mêmes: la fonction fgets(char *, int, FILE *) qui prend en paramètre le plux d'entrée (stdin), le buffer et la taille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(chnClavier, 5, stdin);
    À présent, pour convertir la chaîne en nombre, il faut utiliser la fonction strtol(), comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre = strtol(chnClavier, NULL, 10);
    À présent, tu as en main les clefs pour saisir un nombre et faire ensuite des calculs dessus (nous verrons plus tard la façon de s'assurer que l'utilisateur a bien tapé moins de trois chiffres, mais pour l'instant le plus simple est de s'assurer qu'il est compris entre -999 et 999 (ou entre 0 et 999 si tu veux également qu'ils soient positifs)).

    Essaie de remodeler ton programme avec ces fonctions pour saisir les nombres, et poste le résultat. S'il y a des erreurs, nous les corrigerons ensemble...
    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.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Par défaut
    OK merci

  8. #8
    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
    À présent, tu as en main les clefs pour saisir un nombre et faire ensuite des calculs dessus (nous verrons plus tard la façon de s'assurer que l'utilisateur a bien tapé moins de trois chiffres, mais pour l'instant le plus simple est de s'assurer qu'il est compris entre -999 et 999 (ou entre 0 et 999 si tu veux également qu'ils soient positifs)).
    Pour {'-','9','9','9','\n',0} il faut 6 char...

    Pour des saisies de nombres, je mets 16 ou 32 char, et surtout, je teste la présence du '\n', ce qui permet de savoir si on a dépassé et d'agir en conséquence (vidage du buffer d'entrée).

    Je pense qu'il serait plus pédagogique de commencer un cours de C en batissant sa fonction de saisie à coup de fgetc()... On verrait tout de suite où se trouvent les problèmes...

  9. #9
    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
    Citation Envoyé par Emmanuel Delahaye
    Pour {'-','9','9','9','\n',0} il faut 6 char...
    Tu as raison, je n'avais pas réfléchis qu'ils pouvaient être négatifs avant. J'attends la réponse de lolo406 sur le sujet avant d'éditer...

    Pour des saisies de nombres, je mets 16 ou 32 char, et surtout, je teste la présence du '\n', ce qui permet de savoir si on a dépassé et d'agir en conséquence (vidage du buffer d'entrée).
    Oui, c'est un peu à cela que je pensais quand je parlais de vérifier qu'on n'avait entré que trois chiffres...

    Je pense qu'il serait plus pédagogique de commencer un cours de C en batissant sa fonction de saisie à coup de fgetc()... On verrait tout de suite où se trouvent les problèmes...
    Ah, c'est intéressant en effet, je n'y avais pas pensé.
    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.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Par défaut
    Voilà ce que j'ai réussi à produire (grâce à vous !) :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int Nombre(void);
     
    int main(void)
    {
        int c,d;
        printf("Entrez 2 nombres :");
        c=Nombre();
        d=Nombre();
        printf("%d et %d\n",c,d);
        system("pause");
        return 0;
    } 
    int Nombre(void)
    {
        char chnClavier[5]=" ";
        fgets(chnClavier,5,stdin);
        return strtol(chnClavier,NULL,10);
    }

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 128
    Par défaut
    Citation Envoyé par lolo406
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        return strtol(chnClavier,NULL,10);
    Il vaut mieux tester la valeur de retour de strtol avant de l'afficher (au cas où la conversion aurait echoué).

  12. #12
    Ojy
    Ojy est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Par défaut
    Je dis peut-etre une betise, mais un scanf("%d %d",var1,var2); serait peut etre plus facile??

  13. #13
    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 Marcin
    Citation Envoyé par lolo406
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        return strtol(chnClavier,NULL,10);
    Il vaut mieux tester la valeur de retour de strtol avant de l'afficher (au cas où la conversion aurait echoué).
    Et ça va te donner quoi la valeur de retour en cas d'echec ?

  14. #14
    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
    En effet, pour tester strtol, on utilisera le second paramètre (Qui est NULL pour l'instant).

    lolo406: Finalement, tes nombres, ils ont le droit d'êtres négatifs ou pas?
    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.

  15. #15
    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 lolo406
    Voilà ce que j'ai réussi à produire (grâce à vous !) :
    C'est pas mal. Voici quelques commentaires et améliorations :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
     
    #include <stdio.h>
    #include <stdlib.h>
     
    /* -ed- ajoutes... */
    #include <string.h>
    #include <errno.h>
    #include <limits.h>
     
    /* -ed-
    int Nombre(void);
     
       Il est rarement utile de definir un prototype
       separe quand la fonction est privee (non exportee)
     
       Il suffit generalement de respecter le principe
       'definir avant d'utiliser'
     
       Le mot cle 'static' affirme le caractere non exportable de la fonction.
     
       Ajout d'un parametre 'err'
    */
    static int Nombre(int *p_err)
    {
    /* -ed- valeur retournee par defaut... */
       int n = 0;
     
    /* -ed-
       char chnClavier[5]=" ";
     
       Il n'est pas utile d'initialiser la chaine
       (et puis pourquoi un espace ?)
     
       La taille est ridiculement petite.
       Un int peut faire au minimum de -32767..32767
       soit un minimum de 6+1+1 = 8 char.
     
       Je mets de 16 a 32 pour etre tranquille. Disons 16.
    */
       char chnClavier[16];
     
    /* -ed-
       fgets(chnClavier,5,stdin);
     
       l'operateur sizeof facilite la maintenance...
    */
       fgets (chnClavier, sizeof chnClavier, stdin);
     
    /* -ed-
       verifier que l'on a pas deborde...
       Si c'est le cas, vider stdin.
    */
       {
          /* search ... */
          char *p = strchr (chnClavier, '\n');
     
          if (p != NULL)
          {
             /* ... and kill */
             *p = 0;
          }
          else
          {
              /* flush stdin the proper way */
              int c;
              while ((c = getchar()) != '\n' && c != EOF)
              {
              }
          }
       }
     
    /* -ed-
       return strtol(chnClavier,NULL,10);
       Pa si vite. il se peut que la conversion ait echouee.
       Il faut le verifier.
    */
     
       {
          int err = 1;
     
          /* -ed- as-t-on saisi quelque chose ? */
          if (*chnClavier != 0)
          {
             char *p_end;
             long ln = strtol (chnClavier, &p_end, 10);
     
             /* -ed- la conversion a-t-elle reussie ? */
             if (p_end != NULL && *p_end == 0)
             {
                /* y'a-t-il eu debordement ? */
                if (errno != ERANGE)
                {
                   /* Les limites sont-elles acceptables ? */
                   if (ln >= INT_MIN && ln <= INT_MAX)
                   {
                      n = (int) ln;
                      err = 0;
                   }
                }
             }
          }
     
          /* -ed- mettre a jour l'etat err chez l'appelant. */
          if (p_err != NULL)
          {
             *p_err = err;
          }
       }
       return n;
    }
     
    int main (void)
    {
       int c, d, err;
     
    /* -ed-
       printf("Entrez 2 nombres :");
     
       La chaine n'etant pas une ligne (manque '\n'),
       ajout d'un .
     
       fflush (stdout);
     
       Presentation deplorable. Amelioration...
    */
     
       printf("Entrez 2 nombres :\n");
     
       printf ("Nombre 1 : ");
       fflush (stdout);
       c = Nombre (&err);
     
       /* -ed- ce traitement de l'erreur est un choix parmi d'autres. */
       if (!err)
       {
          printf ("Nombre 2 : ");
          fflush (stdout);
          d = Nombre(&err);
     
          if (!err)
          {
             printf("%d et %d\n", c, d);
          }
          else
          {
             puts("saisie nombre 2 erronee");
          }
       }
       else
       {
          puts("saisie nombre 1 erronee");
       }
     
    /* -ed-
       system("pause");
     
       particularisme du a l'utilisation de Dev-C++...
     */
     
       return 0;
    }

Discussions similaires

  1. [Newbie] probleme a la compilation
    Par benratti dans le forum C++
    Réponses: 3
    Dernier message: 02/02/2006, 11h38
  2. Réponses: 4
    Dernier message: 29/08/2005, 08h57
  3. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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