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 :

Array subscript has type 'char'


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Points : 42
    Points
    42
    Par défaut Array subscript has type 'char'
    Bonjour je voudrais comprendre ceci !

    Cet doc explique tres bien : http://name.raphael.poss.name/epita/gcc_warnings

    mais dans ce cas...

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

    la 1er ligne tab['='] = -1; indique l'erreur "Array subscript has type 'char'" alors que l'on sait tres bien que le char de '=' est positif. si je cast (unsigned)'=' cela fonctionne !

    la 2eme ligne tab[5] = -1; fonctionne, normal

    la 3eme lignetab[-5] = -1; fonctionne ! alors que je tente d'acceder au tab avec un indice negatif

    une explication SVP !

    merci de votre aide

  2. #2
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Points : 95
    Points
    95
    Par défaut
    pour le '=' je pense que ça depend des compilateur... le cast implicite n'est pa fait avec le tien a priori

    pour le -5 je pense que le pogramme calcul le modulo avec 256. fais une fonction qui vérifie la valeur de chak case de ton tableau et tu auras la réponse
    Qui dit buzz??!!!!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 44
    Points
    44
    Par défaut
    verifi les adresse des pointeur pour les cases 5 et -5 je dit peut etre des betises (surment meme) mais ton compilo ne doit pas prendre en compte les signe negatif dans les tableaux.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Points : 42
    Points
    42
    Par défaut
    ok je te remercie pour ces indications... je vais voir ca !

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Les compilateurs ne font aucune vérification à ce niveau. tab[-5] est syntaxiquement correct, mais c'est une faute de programmation.

    De même, si tu as le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* ... */
    int tab[15];
     
    /* ... */
    printf ("%d", tab[3627]);
    C'est syntaxiquement correct, dan le sens ou le compilateur ne te préviendras pas.
    En revanche, c'est clairement un bug dans ton code.

    Il est toutefois possible que les dernières options de compilation de compilateurs comme GCC (Werror je crois ?) fassent attention à ce genre de chose, mais même si ces options le permettent, il vaut mieux écrire du code correct.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Points : 42
    Points
    42
    Par défaut
    oui je suis completement d'accord avec toi...

    Terminé le temps ou on faisait vraiment attention avant d'ecrire... maintenant avec les compilateurs, EDI modernes ont fait moins attention....



    Point de vue personel n'engageant que moi et non sujet aux trolls divers !

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    Citation Envoyé par gangsoleil
    Les compilateurs ne font aucune vérification à ce niveau. tab[-5] est syntaxiquement correct, mais c'est une faute de programmation.
    Pas forcement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tab[9]; /* indice de 0 a 8 */
    int *p_tab = &tab[4]; /* Indice de -4 à 4 */
    Trés pratique lorsque le tableau représente un graphique !

  8. #8
    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 Re: Array subscript has type 'char'
    Citation Envoyé par obelix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static char tab[256];
    tab['='] = -1;
    tab[5]   = -1;
    tab[-5]  = -1;
    la 1er ligne tab['='] = -1; indique l'erreur "Array subscript has type 'char'" alors que l'on sait tres bien que le char de '=' est positif. si je cast (unsigned)'=' cela fonctionne !

    la 2eme ligne tab[5] = -1; fonctionne, normal

    la 3eme lignetab[-5] = -1; fonctionne ! alors que je tente d'acceder au tab avec un indice negatif
    1. Ton compilateur n'est pas un compilateur C. En C, une constante caractère est de type int.
    2. RAS
    3. Rien de s'oppose à ce qu'un indice soit négatif. Que ça ait du sens est un problème qui ne dépend pas du langage mais du codeur. Se souvenir quand même qu'adresser en dehors des limites constitue un Comportement Indéfini (UB).
    Pas de Wi-Fi à la maison : CPL

  9. #9
    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 OjBarbare
    pour le '=' je pense que ça depend des compilateur... le cast implicite n'est pas fait avec le tien a priori
    En fait t'en sais rien, quoi...
    pour le -5 je pense que le programme calcul le modulo avec 256. fais une fonction qui vérifie la valeur de chaque case de ton tableau et tu auras la réponse
    A oui, comme ça, comme par magie ? Ben non. Dans tes rêves uniquement...

    Tu penses trop, tu devrais apprendre le C, c'est plus utile pour prétendre donner des réponses...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    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 leptityugi
    verifi les adresse des pointeur pour les cases 5 et -5 je dit peut etre des betises (surment meme) mais ton compilo ne doit pas prendre en compte les signe negatif dans les tableaux.
    N'importe quoi. C'est la foire aux aneries ou quoi ?
    Pas de Wi-Fi à la maison : CPL

  11. #11
    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 gangsoleil
    Les compilateurs ne font aucune vérification à ce niveau. tab[-5] est syntaxiquement correct, mais c'est une faute de programmation.

    De même, si tu as le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* ... */
    int tab[15];
     
    /* ... */
    printf ("%d", tab[3627]);
    C'est syntaxiquement correct, dan le sens ou le compilateur ne te préviendras pas.
    En revanche, c'est clairement un bug dans ton code.

    Il est toutefois possible que les dernières options de compilation de compilateurs comme GCC (Werror je crois ?) fassent attention à ce genre de chose, mais même si ces options le permettent, il vaut mieux écrire du code correct.
    Non, ce n'est pas possible. si on a un pointeur (an array decays to a pointer when passed to a function), on perd la taille et le compilateur ne peut rien vérifier du tout.

    D'autre part il est des cas (assez tordus, il est vrai) où un indice négatif a un sens.

    Néanmoins, en général, je préconise le type size_t pour les indices...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut Re: Array subscript has type 'char'
    Citation Envoyé par obelix
    on sait tres bien que le char de '=' est positif. si je cast (unsigned)'=' cela fonctionne !
    Il ne faut pas confondre positif et non signé.
    Un entier signé peut être positif, un entier positif peut être signé, un entier non signé ne peut être positif.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

Discussions similaires

  1. erreur :invalid types ‘bool[int]’ for array subscript
    Par ferhat.adel dans le forum Débuter
    Réponses: 1
    Dernier message: 10/06/2013, 18h56
  2. Prb types array subscript
    Par Jérém08 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/12/2011, 17h03
  3. erreur : subscript requires array or pointer type
    Par GabrielD dans le forum C++
    Réponses: 1
    Dernier message: 18/04/2011, 07h51
  4. Réponses: 4
    Dernier message: 30/11/2010, 17h42
  5. Erreur : invalid types «int[int]» for array subscript
    Par fabrice91 dans le forum Débuter
    Réponses: 9
    Dernier message: 01/10/2010, 16h00

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