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 :

SDL, scanf, chaine, marche mais warning


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Par défaut SDL, scanf, chaine, marche mais warning
    Bonjour a tous et à toutes.

    J'utilise code BLOCKS comme compilateur, seulement mon compilo m'indique un warning que je ne sais pas corriger.

    warning: array subscript has type 'char'

    Et voici la ligne ou il y a dit bug.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else if(event.key.keysym.unicode >= 'A' && event.key.keysym.unicode <= 'z')
                            {
                                perso.pseudo[i] = (char)event.key.keysym.unicode;/*ICI*/
                                i++;
                            }
    Cordialement qnop

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par qnop Voir le message
    Bonjour a tous et à toutes.

    J'utilise code BLOCKS comme compilateur, seulement mon compilo m'indique un warning que je ne sais pas corriger.

    warning: array subscript has type 'char'
    Ça veut dire « attention : l'indice du tableau a le type "char" ».

    Tu as probablement déclaré « i » comme étant un char plutôt qu'un int. Ce n'est pas interdit, parce qu'un char est en soi un nombre entier et que le transtypage se fait tout seul, mais tu risques d'arriver assez vite à court de place pour tes pseudos (après le 128ème).

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ça veut dire « attention : l'indice du tableau a le type "char" ».
    C'est la traduction google ça...
    Je pense plutôt à attention, le tableau contient des char !

    Si je défini mon tableau comme des unsigned char, pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(action_name,"_3D6")
    j'ai comme avertissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : pointer targets in passing argument 1 of ‘strcmp’ differ in signedness
    et je n'ai pas les avertissement de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : array subscript has type ‘char’|
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action_name[pl_num]>'0'
    Par contre, si je transforme le tableau en char (ou gchar), c'est l'inverse.

    Pour ne plus avoir d'erreur, je dois mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *(action_name+pl_num)>'0'
    et initialiser mon pointeur en (g)char * .

    Pourquoi ces manipulations sont-elles nécessaire pour éviter les warnings ? Je n'en sais rien !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par troumad Voir le message
    C'est la traduction google ça...
    Je pense plutôt à attention, le tableau contient des char !
    Absolument pas. Relis bien.

    « Array subscript » : l'indice du tableau ;
    « has type 'char' » : a le type 'char' ;

    Si je défini mon tableau comme des unsigned char, pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(action_name,"_3D6")
    j'ai comme avertissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : pointer targets in passing argument 1 of ‘strcmp’ differ in signedness
    Ce qui signifie littéralement « Les cibles des pointeurs au passage de l'argument 1 de "strcmp" diffèrent en signe. ». C'est parce que tu passes des « unsigned char » là où le compilo attend des « char », qu'il considère implicitement comme signés.

    et je n'ai pas les avertissement de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attention : array subscript has type ‘char’|
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action_name[pl_num]>'0'
    C'est parce que ce n'est pas la même erreur et qu'elle ne concerne pas la même chose. Là encore, c'est la variable passée en indice de son tableau qui est concernée. Pas le contenu du tableau proprement dit. Le compilo se plaint parce qu'un « numéro de case » (l'indice du tableau) doit être de type int (sans préciser si c'est signé ou non) et que l'indice en question est un char.

    De toutes façons, c'est très facile à reproduire :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main (void)
    {
        char i = 2;
        char tab[50];
     
        tab[i] = 'a';
        return 0;
    }

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ gcc tableau.c -o tableau -Wall
    tableau.c: In function ‘main’:
    tableau.c:6: attention : array subscript has type ‘char’

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Gagné !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action_name[(int)pl_num]>'0'
    ne sort pas d'erreur !



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action_name[(unsigned short)pl_num]>'0'
    non plus. Je ne pensais pas le type de l'indice était si important ! Un char me convient tout à fait d'un point de vu logique.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action_name[(unsigned short)pl_num]>'0'
    non plus. Je ne pensais pas le type de l'indice était si important ! Un char me convient tout à fait d'un point de vu logique.
    Tout dépend de ce que tu entends par « d'un point de vue logique », bien sûr, mais peut-être fais-tu le raccourci « char = entier de 8 bits de large ».

    D'abord, cette dernière hypothèse n'est pas du tout garantie pas la norme qui, elle, précise qu'un char est un entier suffisamment large pour recevoir un caractère du jeu de base sur la plate-forme cible. Certaines architectures (les PIC 12xxxx, par exemple) ne manipulent pas forcément des mots de 8 bits.

    Ensuite, d'un point de vue sémantique, un « char » est un caractère et un « int » est un nombre entier. Et le numéro de rang d'un élément dans un tableau est forcément — en lui-même — un nombre entier. C'est pour des raisons techniques qu'un caractère en langage C est lui-même représenté par son rang dans une table et que sa représentation est donc un nombre entier.

    On peut mettre tout cela en évidence assez facilement. Si l'indice d'un tableau peut légalement être un char, on doit pouvoir écrire des choses de ce genre :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char tab[256];
     
        tab['A'] = 1;

    Cela n'est légitime que si tu gères une table de traduction dans laquelle la donnée à lire ou à mettre à jour est bien en rapport avec le caractère « A ». Sinon, l'expression en elle-même n'est pas déterministe, car elle dépend du jeu de caractères de la plate-forme cible.

    En plus, si int est fait pour gérer les entiers « ordinaires », bien souvent, un char sera trop petit pour indexer le tableau entier.

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

Discussions similaires

  1. [Débutant][conv2] Le programme marche mais avec un warning
    Par Alucard9800XT dans le forum Images
    Réponses: 4
    Dernier message: 23/04/2007, 00h10
  2. Code qui marche, mais pas la mise à jour
    Par Cablan dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 17h09
  3. Script qui marche mais pas elegant[newbie]
    Par billybob2006 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 12h25
  4. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21
  5. [Servlet - MySQL] Ca marche mais message d'erreur quand même
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/11/2004, 15h15

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