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 :

Probleme test if avec tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Par défaut Probleme test if avec tableau
    Bonjour,
    Je voudrais faire un test if sur des valeurs d'un tableau
    Le programme doit remplacer les valeurs voisines identiques par des espaces (pour faire des "trous" dans le tableau)
    J'ai codé comme cela et j'ai une erreur qui dit "error : subscripted value is neither array nor pointer nor vector"

    Merci de votre aide

    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
    void figures(char* tableau)
    {
        int i=0;
        int j=0;
     
        for (i=0; i<10; i++)
        {
            for(j=0; j<15; j++)
            {
                   if((tableau[i][j]==tableau[i+1][j]) && (tableau[i][j]==tableau[i+2][j]))
                   {
                       tableau[i][j]=' ';
                       tableau[i+1][j]=' ';
                       tableau[i+2][j]=' ';
                   }
     
                printf("%c", tableau[i][j]);
            }
             printf("\n");
        }
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    tableau est du type char*. Donc tableau[i] est du type char (et n'est donc pas une adresse). Alors que signifie tableau[i][j] ?
    C'est comme si tu écrivais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     char c;
     ... c[j] ... // ???
    Pour savoir quelle doit être la déclaration correcte de tableau comme paramètre de la fonction pour pouvoir écrire tableau[i][j] et avoir le résultat correct, il faut en savoir plus sur la nature de l'argument lors de l'appel à cette fonction.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Par défaut
    Mais je l'ai déclaré dans mon main() là c'est un sous prog qui l'utilise !
    Ca c'est mon programme complet !

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void figures(char* tableau);
     
    int main()
    {
    //---------------------------------------------------
    // Initialisation horloge pour nombre aléatoire
    //---------------------------------------------------
     
       srand(time(NULL));
     
    //---------------------------------------------------
    // Initialisation variables
    //---------------------------------------------------
     
        int tmp=0;
        char caractere='0';
        char tableau[10][15];
        int i=0;
        int j=0;
     
    //------------------------------------------------------------------------------------------------------------------------------------
    // Affectation des valeurs pour le tableau :
    // Une variable temporaire prend une valeur aléatoire entre 0 et 4 (5 valeurs possibles).
    // Pour chaque valeur de la variable temporaire, le caractère affiché dans le tableau prend une valeur différente selon ce code :
    //
    // S = Soleil
    // F = Fraise
    // P = Pomme
    // O = Oignon
    // M = Mandarine
    //------------------------------------------------------------------------------------------------------------------------------------
     
        /* Pour chaque ligne */
        for(i=0; i<10; i++)
        {
            /* Pour chaque colonne */
            for(j=0; j<15; j++)
            {
                tmp=rand()%5; // Variable temporaire prenant une valeur entre 0 et 4 (5 valeurs possibles)
     
                 if(tmp==0) {caractere='S';} // Si la variable temporaire est égale à 0, le caractèe affiché est S
                 if(tmp==1) {caractere='F';} // etc.
                 if(tmp==2) {caractere='P';} // etc.
                 if(tmp==3) {caractere='O';} // etc.
                 if(tmp==4) {caractere='M';} // etc.
     
                tableau[i][j]=caractere; // On stocke le caractère dans la case du tableau correspondante
                printf("%c ", tableau[i][j]); // Affichage de la case du tableau
            }
            printf("\n"); // Saut de ligne a la fin du remplissage de la ligne pour mettre en forme le tableau
            system("pause");
            figures(tableau); // Appel du ss prog
        }
        return 0;
    }
     
    void figures(char* tableau)
    {
        int i=0;
        int j=0;
     
        for (i=0; i<10; i++)
        {
            for(j=0; j<15; j++)
            {
                   if((tableau[i][j]==tableau[i+1][j]) && (tableau[i][j]==tableau[i+2][j]))
                   {
                       tableau[i][j]=' ';
                       tableau[i+1][j]=' ';
                       tableau[i+2][j]=' ';
                   }
     
                printf("%c", tableau[i][j]);
            }
             printf("\n");
        }
    }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    Le problème vient de la déclaration de la fonction. Il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void figures(char *tableau[]);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void figures(char *tableau);

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adicarbo Voir le message
    Mais je l'ai déclaré dans mon main() là c'est un sous prog qui l'utilise !
    Bonjour
    Si on te dit que tu fais mal quelque chose, ce n'est pas la peine de dire "mais c'est moi qui l'ai fait ainsi". On le sait bien que c'est toi, mais ça reste mal fait !!!

    Citation Envoyé par adicarbo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void figures(char* tableau);
     
    int main()
    {
         ...
        char tableau[10][15];
     
        ...
        figures(tableau); // Appel du ss prog
        return 0;
    }
    C'est bien ce que Diogène et esired t'ont dit. Si tu déclares char tableau[10][15] alors chaque tableau[i][j] est un char donc chaque tableau[i] est un char[15] (on peut aussi le voir comme un char * si on schématise) et donc tableau est alors un char[10][15] (on peut se le représenter aussi comme un char ** mais c'est juste pour donner une illustration du niveau d'indirection et non une équivalence réelle).

    Donc si tu envoies tableau à ta fonction, celle-ci ne peut pas le stocker dans un char *. Mais si tu lui demandes quand-même de le faire (au fait, ton compilo t'a rien dit ???), elle n'a alors aucun moyen de pouvoir aller taper dans tableau[i][j]. Si on te donnais une grille sans te dire combien il y a de lignes et de colonnes, et qu'on te demande la case F4, tu pourrais la trouver toi ???

    Citation Envoyé par esired Voir le message
    Le problème vient de la déclaration de la fonction. Il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void figures(char *tableau[]);
    Attention, tu dois impérativement donner la taille sinon c'est comme pour la grille donnée dans l'exemple ci-dessus: le C est incapable de calculer l'index de la case à partir des indices.

    Seule la dernière dimension peut-être omise (parce qu'elle n'entre pas en ligne de compte dans le calcul)..
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Par défaut
    Donc il suffit que je mette void figures (char* tableau[]) pour que ça marche ? Comme ça on sait que tableau est un pointeur de tableau et non un autre type de pointeur c'est bien ça ? Même si je l'ai déclaré comme un tableau à la base ? Je ne comprend pas exactement la différence entre char char * et char ** dans ce cas là en fait...

    Désolé je ne voulais pas paraître comme tu l'a décrit .. j'essayais de bien expliquer ce que j'avais fait ...

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adicarbo Voir le message
    Donc il suffit que je mette void figures (char* tableau[]) pour que ça marche ? Comme ça on sait que tableau est un pointeur de tableau et non un autre type de pointeur c'est bien ça ? Même si je l'ai déclaré comme un tableau à la base ?
    Il faut d'abord comprendre que ta grille en 2D, pour le C, ce n'est qu'une seule et unique grosse suite de cases (donc un tableau en 1D). Et donc il est obligé de transformer tes indices en index.
    Ainsi case[i][j] correspond à la case mémoire i * nb_de_colonnes + j. Et ce principe s'étendra à n dimensions (sur un char tableau[10][15][20], alors tableau[i][j][k] donnera la case i * 15 + j * 20 + k.

    Seule en 1D il n'y a aucun soucis car 1D dans ton programme c'est 1D en mémoire.

    Si maintenant tu as un char tableau[10], alors tableau (le nom pur) c'est l'adresse de son premier élément. Et cette adresse, passée à une fonction, pourra être stockée soit dans un char pt[], soit un char pt[10], soit un char *pt au choix. A ce niveau, c'est pareil.

    Si maintenant tu as un char tableau[10][15], alors tableau (toujours le nom pur) c'est toujours l'adresse de son premier élément. Mais ce premier élément, lui, ne représente plus un char mais un tableau de char. Et comme le C aura toujours besoin de savoir qu'il y a 15 colonnes pour faire ses calculs, tu pourras stocker cette adresse soit dans un char pt[][15], soit un char pt[10][15], soit un char *pt[15]. Mais surtout pas un char **pt (même si l'analogie avec le premier exemple laisse penser que c'est possible).

    Citation Envoyé par adicarbo Voir le message
    Je ne comprend pas exactement la différence entre char char * et char ** dans ce cas là en fait...
    Un char * c'est l'adresse d'une case mémoire contenant un caractère, un char ** c'est l'adresse d'une case mémoire contenant l'adresse d'une autre case mémoire qui, elle, contient un caractère. Et si on met de coté ce besoin connaitre N-1 dimensions, on peut faire une analogie entre [] et *, [][] et ** et etc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    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
    Tu n'as pas déclaré le paramètre tableau avec le bon type. Tu devrais déclarer et définir la fonction ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void figures(char tableau[10][])

    Ou encore, en utilisant le formalisme pointeur au lieu du formalisme tableau, tu pourrais la déclarer
    void figures(char (*tableau)[10]), mais c'est imbitable pour un débutant.
    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.

  9. #9
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu n'as pas déclaré le paramètre tableau avec le bon type. Tu devrais déclarer et définir la fonction ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void figures(char tableau[10][])

    Ou encore, en utilisant le formalisme pointeur au lieu du formalisme tableau, tu pourrais la déclarer
    void figures(char (*tableau)[10]), mais c'est imbitable pour un débutant.
    C'est vrai que c'est chaud à biter j'ai cru voir un pointeur de fonction au début

  10. #10
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Déclares ce que tu veux où tu veux il reste le problème de pointeur/tableau qui à mes yeux est le coté le plus compliqué du C.
    Ton tableau déclaré statiquement dans le main est un tableau à deux dimensions qui est bien déclaré et à première vue, il est bien utilisé dans les boucles "for" qui suivent. Cependant, quand tu cherches à le passer par pointeur en argument de la fonction figures() il faut utiliser le bon type.
    Il faut que tu comprenne que les "array" du C ne sont pas des objets comme en java par exemple, ce sont des pointeurs (adresse mémoire) vers le début d'un bloc d'une série d'éléments les uns à la suite des autres dans la mémoire de la machine.
    En gros un "char tableau[]" c'est pareil que "char *tableau". Par contre "char tableau[8]" est bien un pointeur aussi mais vers 8 "chars" qui se suivent en mémoire.
    Donc tu ne peux pas faire passer ton tableau 2d pour un "char*" le compilateur t'as vu venir de loin . C'est un "char**" ou un "char[][]" si tu préfères.

  11. #11
    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
    @SkyZoThreaD: Attention, un vrai tableau 2D (comme celui qui est sujet ici) n'est pas implicitement convertible en type**.
    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. #12
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    @SkyZoThreaD: Attention, un vrai tableau 2D (comme celui qui est sujet ici) n'est pas implicitement convertible en type**.
    Ah bon?! pourquoi?

    edit: ok effectivement c'est carrément une grosse erreur de prog.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 12
    Par défaut
    Ah ok j'ai compris en fait quand j'ai tableau[i][j] c'est bien une valeur donc mon if n'est pas faux mais le problème c'est qu'avant j'ai mis en paramètre un char* donc un tableau[i] seulement qui représente non pas une valeur mais toute une ligne par exemple..

    Merci beaucoup !

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    Bonsoir. Ta variable
    représente un pointeur que tu peux utiliser comme un vecteur (tableau à une dimension).
    Mais dans ton code, tu l'utilises comme s'il s'agit d'un tableau à deux dimensions quand tu fais
    Ce qui ne peut pas marcher. Tu dois donc faire que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (tableau[i] == tableau[j])

Discussions similaires

  1. Probleme de DS avec tableau
    Par marcl1 dans le forum AS/400
    Réponses: 8
    Dernier message: 12/06/2008, 14h36
  2. [CSS&HTML]Problem de hauteur avec un tableau
    Par pierrot10 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 27/09/2006, 19h21
  3. [Tableaux] probleme avec tableau a recupere
    Par twixster dans le forum Langage
    Réponses: 14
    Dernier message: 16/02/2006, 17h50
  4. probleme test presence d'un fichier(avec fso)
    Par pagez dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/08/2005, 15h24
  5. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42

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