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 :

Trouver un caractère dans un tableau 2D


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut Trouver un caractère dans un tableau 2D
    Bonjour, je souhaiterais faire un code qui permette de trouver un caractère bien précis dans un tableau de caractères à deux dimensions.
    J'ai effectué une première tentative où j'ai tout d'abord rempli mon tableau avec de multiples boucles for (remplir mon tableau dès sa déclaration aurait été beaucoup plus rapide mais tant pis). Puis j'ai crée une fonction qui, j'espérais, allait me donner l'indice (ou numéro) de la ligne où se trouve le caractère en sachant que je recherche le caractère 'R' qui signifie pion Rouge. A terme, le but de ce programme sera de trouver l'indice de la ligne où se trouvent différents pions sur un plateau de jeu.
    Lorsque j'exécute le programme, il m'affiche le tableau (jusqu'ici, rien d'anormal) mais il m'affiche ensuite "erreur de segmentation (core dumped)".
    Je ne sais pas comment résoudre ce problème.
    Je remercie toute personne qui pourrait m'éclairer.
    h.c
    Code c : 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
    #include <stdio.h>
     
    int Recuperation_indice_ligne_pion_rouge(char ligne[][8], int nligne, int ncolonne);
     
    int main(void) {
     
        char tableau[3][8];
        int i, j;
     
        /* Remplissage du tableau */
        tableau[0][0] = '|';
        for (j = 1; j <= 2; j++) {
            tableau[0][j] = '.';
        }
        tableau[0][3] = 'p';
        tableau[0][4] = '.';
        tableau[0][5] = '|';
        tableau[0][6] = '.';
        tableau[0][7] = '|';
     
        for (j = 0; j <= 1; j++) {
            tableau[1][j] = '|';
        }
        for (j = 2; j <= 3; j++) {
            tableau[1][j] = '.';
        }
        tableau[1][4] = 'R';
        for (j = 5; j <= 6; j++) {
            tableau[1][j] = '.';
        }
        tableau[1][7] = '|';
     
        tableau[2][0] = '|';
        tableau[2][1] = '.';
        tableau[2][2] = 'p';
        for (j = 3; j <= 5; j++) {
            tableau[2][j] = '.';
        }
        for (j = 6; j <= 7; j++) {
            tableau[2][j] = '|';
        }
        /* ----------------------------------------- */
     
        /* Affichage du tableau */
        for (i = 0; i <= 2; i++) {
            for (j = 0; j <= 7; j++) {
                printf("%c", tableau[i][j]);
            }
            printf("\n");
        }
        /* ----------------------------------------- */
     
        printf("%d", Recuperation_indice_ligne_pion_rouge(tableau, 3, 8));
        printf("\n");
     
        return 0;
    }
     
     
    int Recuperation_indice_ligne_pion_rouge(char ligne[][8], int nligne, int ncolonne) {
     
        int indice_ligne;
        int indice_colonne;
     
        for (indice_colonne = 0; indice_colonne < ncolonne; indice_colonne++) {
            while ( ** (ligne + (indice_ligne * 8) + indice_colonne) != 'R') {
                indice_ligne++;
            }
        }
        return indice_ligne;
    }

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Hello,

    Dans ta fonction de recherche,
    1) indice_ligne n'est pas initialisé,
    2) dans le while, tu ne limites pas la recherche à nligne, ce qui fait que tant que 'R' n'a pas été trouvé, tu incrémentes indice_ligne

    Et pourquoi une écriture aussi tarabiscotée dans le while ? Restons simples: ligne[....][....]

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 581
    Par défaut
    Bonjour,

    La variable indice_ligne n'est pas initialisée. De plus son incrémentation n'est pas contrôlée.

    Par ailleurs, on passe le nombre de colonnes en argument mais on retrouve 8 en dur dans le corps de la fonction Recuperation_indice_ligne_pion_rouge.

    Il me semble que pourrait tomber en marche un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int Recuperation_indice_ligne_pion_rouge(char *tab, int nligne, int ncolonne) {
       int n = nligne * ncolonne;
       for(int i = 0; i < n; i++)
          if(tab[i] == 'R') return i / ncolonne;
       return -1;                // Si pas trouvé
    }
    Un test sur la valeur des arguments pourrait être utile. Par ailleurs, les dimensions du tableau devraient être en constantes globales ou #define.

    Salutations

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci à vous deux pour vos réponses rapides.
    Concernant ce que vous m'avez dit Guesset, j'ai testé votre fonction et j'obtiens l'avertissement suivant suivi d'une note:

    warning: passing argument 1 of ‘Recuperation_indice_ligne_pion_rouge’ from incompatible pointer type [-Wincompatible-pointer-types]
    54 | printf("%d",Recuperation_indice_ligne_pion_rouge(tableau,3,8));
    | ^~~~~~~
    | |
    | char (*)[8]
    h.c:3:48: note: expected ‘char *’ but argument is of type ‘char (*)[8]’
    3 | int Recuperation_indice_ligne_pion_rouge(char *tab, int nligne, int ncolonne);

    Cependant, votre fonction fonctionne car elle me donne le bonne indice. J'ai bougé R dans mon tableau et elle me donne a chaque fois le bonne indice.
    Comme la fonction marche, je ne comprends pas pourquoi j'ai cet avertissement.
    Auriez-vous une idée s'il vous plaît ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Au passage, j'ai aussi essayé d'obtenir l'indice de la colonne du pion 'R' en suivant un raisonnement similaire mais je n'obtiens pas le bon indice. Par exemple, lorsque R est dans la colonne n°7, la fonction trouve 5 et lorsque R est en 0, la fonction donne 1. J'obtiens également le même message d'avertissement que pour la fonction précédente qui donnait l'indice de la ligne.colonne.c

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 747
    Par défaut
    Citation Envoyé par labo1 Voir le message
    Comme la fonction marche, je ne comprends pas pourquoi j'ai cet avertissement.
    Auriez-vous une idée s'il vous plaît ?
    Je ne connais pas trop l'histoire et en + cela dépend de ton compilateur

    Mais en gros 1 tableau multidimensionnel n'existe pas en C. Pour 1 tableau 2D, c'est 1 tableau 1D où toutes les lignes sont mises bout à bout.
    Par exemple char array[3][8]; équivaut à char array[24]; et array[2][6] = 0; équivaut à array[2 * 8 + 6] = 0; (<- [A][B] == [A * nb_columms + B]

    Et donc, le type char ligne[][8] pour le paramètre est vite dégradé en char* sauf si on reste dans le même fichier source.

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Comme l'écrit Guesset, le prototype de la fonction devrait plutôt être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int FindRedPawnLine(int nlines, int ncols, char array[nlines][ncols]);
    avec un compilateur qui compile en c99 (ou plus récent).
    Sinon, si tu compiles toujours en c89, alors fais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define NLINES   3
    #define NCOLS    8
    int FindRedPawnLine(int nlines, int ncols, char array[NLINES][NCOLS]);
    Pour ton problème, il suffit d'avoir deux boucles for imbriquées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int FindRedPawnLine(int nlines, int ncols, char array[nlines][ncols]) {
         for(int i=0; i<....; i++)
    	  for(int j=0; j<....; j++)
    		if(array[....][....]=='R')
    		    return(....);
     
        return(-1);
    }
    A noter que cette fonction, avec quelques (simples) modifications, pourrait fournir l'indication de ligne et de la colonne (connais-tu déjà les pointeurs ?)

    (edit: présentation)

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci pour vos réponses.

    Concernant ce que vous m'avez dit edgarjacobs, oui j'ai vu les pointeurs mais je ne suis pas très à l'aise avec. Je les ai d'ailleurs utilisé (dans mon code tout en haut de la page) sans grand succès... Cependant, je pense que mon code ne marche pas car certes j'utilise deux boucles imbriquées, la première étant une boucle for, mais la deuxième est une boucle while donc ça ne doit pas pouvoir marcher.
    Je me suis donc rabattu sur le code proposé par Guesset. Son code me donne le bon indice de la ligne mais il y a cependant un warning comme quoi le paramètre d'entré (de type char*) n'a pas le même type que l'argument (de type char[*][8]) et je ne sais pas comment résoudre ce problème même s'il ne nuit pas au bon fonctionnement du code.
    De plus, j'ai tenté de faire la même chose pour trouver cette fois-ci l'indice de la colonne mais comme je l'ai dit dans un précédent message, je n'obtiens pas le bon indice et j'ai à nouveau le même warning.
    Concernant le prototype de la fonction que vous avez écrit, je n'avais pas pensé à inclure les paramètres d'entré nlines et ncols dans le tableau[nlines][ncols] qui est lui même un paramètre d'entré.

    Voici ma fonction pour trouver l'indice de la colonne : colonne.c

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 747
    Par défaut
    parce que ta conception est mauvaise : il faut faire 1 structure

    En gros
    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
    typedef struct s_array {
        char* data;
        size_t nb_columns;
        size_t nb_lines;
    } t_array;
     
     
    void array_create(t_array* array, size_t nb_columns, size_t nb_lines) {
        if (array != NULL) {
    //   malloc data with size nb_columns * nb_lines
        }
    }
     
    #define array_is_not_empty(X) ((X->data != NULL) && (X->nb_columns != 0) && (X->nb_lines != 0))
     
    void array_init(t_array* array) {
        if (array != NULL) {
            array-> data       = NULL;
            array-> nb_columns = 0;
            array-> nb_lines   = 0;
        }
    }
     
    void array_free(t_array* array) {
        if (array != NULL) {
            free(array-> data);
            array-> nb_columns = 0;
            array-> nb_lines   = 0;
        }
    }
     
    void array_search_character(t_array* array) {
        if ((array != NULL) && ( array_is_not_empty(array) )) {
    //      ...
        }
    }

  10. #10
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 581
    Par défaut
    Bonjour,

    Le warning est normal car je fais un transtypage implicite entre un tableau à deux dimensions et un tableau à une dimension. Comme l'a expliqué foetus, cela marche parce que les tableaux multidimensionnels en C sont en fait des tableaux unidimensionnels accolés les uns aux autres. On peux donc les considérer comme un grand tableau unidimensionnel.

    Si on veut éviter les pleurs du compilateur, il y a la solution de edgarjacobs qui respecte exactement le format des données, mais il est aussi possible d'expliciter le type à l'appel de la fonction.

    J'ai certainement eu le tort de faire court en négligeant la forme, ce qui suppose d'avoir une petite idée des fonctionnements internes des compilos et n'est donc pas sans risque.

    La fonction peut également fournir la position en ligne, c'est juste le modulo (le reste de la division qui donne le n° de ligne).

    Salutations

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Comme l'a indiqué foetus, les tableaux 2D n'existent pas nativement en C. Il y a au moins 4 moyens de gérer cela:
    1. Utiliser un tableau de tableaux où au moins la seconde dimension est fixée. labo1, c'est ce que tu as appliqué. C'est souvent un bon moyen.
    2. Utiliser un tableau de type VLA, nécessite un C d'au moins C99. C'est l'exemple donné par edgarjacobs, intéressant si les dimensions ne sont pas fixes.
    3. Utiliser un tableau de pointeurs sur des tableaux. Dans ce modèle, on a besoin d'utiliser des pointeurs de pointeurs donc avec l'utilisation de **. Lui aussi peut gérer le cas où les dimensions sont choisies au moment de l'exécution. labo1, l'utilisation de ** fait penser à un mélange de modèles, ça n'est pas compatible avec le moyen n°1.
    4. Linéariser le tableau, pour le gérer comme s'il n'avait qu'une dimension. Correspond aux exemples donnés par foetus et Guesset. Pas forcément plus simple, mais intéressant pour de l'optimisation et supporte aussi des dimensions non fixées.
    Il faut commencer par choisir un modèle et s'y tenir, sinon ça n'a aucun sens. Le compilateur devrait de prévenir de ces non sens par des Warnings.

    Je te propose de revenir au modèle initial que tu as choisi (pas complexe, et le seul qui impose une seconde dimension fixée mais c'est la cas ici), et donc d'oublier pour le moment les exemples qui t'ont été donnés.

    As-tu commencé par bien prendre entièrement en compte la toute première réponse d'edgarjacobs? Ca devrait donner un nouveau code avec des variables correctement initialisées et la disparition des **, quelque chose comme:
    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
    int Recuperation_indice_ligne_pion_rouge( char ligne[][8], int nligne ); // inutile de transmettre ncolonne c'est OBLIGATOIREMENT 8
     
    int  main(void) {
        char  tableau[3][8];
        ... ... ...
        printf("%d", Recuperation_indice_ligne_pion_rouge(tableau, 3));
        printf("\n");
    }
     
    int  Recuperation_indice_ligne_pion_rouge( char ligne[][8], int nligne ) {
        for ( int indice_colonne = 0 ; indice_colonne < 8 ; indice_colonne++ )
            for ( int indice_ligne = 0 ; indice_ligne < nligne ; indice_ligne++ )
                if ( ligne[indice_ligne][indice_colonne] == 'R' )
                    return  indice_ligne;
        return  -1; // 'R' n'a pas été trouvé!
    }
    Tu peux nous fournir ton nouveau code, et indiquer ce qui pose problème?

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci beaucoup, la fonction marche parfaitement.
    Imaginons maintenant que l'on veuille trouver un caractère qui se trouve une certaine ligne mais on sait laquelle. Admettons, le caractère se trouve sur la ligne 1, mais on ne sait pas dans quelle colonne.
    Pour trouver l'indice de la colonne dans laquelle il se trouve, je ferais cette fonction. Est-ce bon ? J'ai donc enlevé la boucle qui faisait varier l'indice de la ligne vu que celle-ci est maintenant fixe.


    int Recuperation_indice_colonne_pion_rouge( char tab[][8], int ncolonne ) {
    for ( int indice_colonne = 0 ; indice_colonne < ncolonne ; indice_colonne++ )
    if ( tab[1][indice_colonne] == 'R' )
    return indice_colonne;
    return -1; // 'R' n'a pas été trouvé!
    }

  13. #13
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 747
    Par défaut
    Tu te prends le chou pour rien tu peux mettre 1 booléen dans ta boucle.

    En gros:
    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
        size_t c, l, c_ok, l_ok;
        char not_found;
     
        not_found = 1; // 0 false, otherwise is true
     
        for(l=0, c_ok=0, l_ok=0; (not_found  && (l < nb_lines)); ++l) {
            for(c=0; (not_found  && (c < nb_columns)); ++c) {
                if (array[l][c] == 'R') {
                    l_ok = l;
                    c_ok = c;
                    not_found = 0;
                }
       }
     
    //  if (!not_found) {
    //      printf("found character at [%lu][%lu]\n", l_ok, c_ok);
    //  } else {
    //      printf("not found character\n");
    //  }

  14. #14
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    @dalfab: je n'avais pas envisagé le tableau en tant que vla. Si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(void) {
        char array[3][8];
        fct(3, 8, array);
    alors dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fct(int nlines, int ncols, char array[nlines][ncols]) {
    array n'est pas une vla. C'est une écriture vla, mais le tableau n'est pas une vla.

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    @dalfab: je n'avais pas envisagé le tableau en tant que vla. Si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void) {
        char array[3][8];
        int nlines=3;
        int ncols=8;
        fct(nlines, ncols, array);
    alors dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fct(int nlines, int ncols, char array[nlines][ncols]) {
    array n'est pas une vla. C'est une écriture vla, mais le tableau n'est pas une vla.
    A ma connaissance fct(int nlines, int ncols, char array[nlines][ncols]) n'est pas valide sans VLA, une des dimensions autre que la première n'est pas une constante de compilation.

  16. #16
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Ceci
    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
    #include <stdio.h>
     
    int FindRedPawnLine(int nlines, int ncols, char array[nlines][ncols]);
     
    int main(void) {
        char array[3][8]={{'R'}};
     
    	printf("%d\n", FindRedPawnLine(3, 8, array));
     
        return(0);
    }
     
     
    int FindRedPawnLine(int nlines, int ncols, char array[nlines][ncols]) {
         for(int i=0; i<ncols; i++)
    		for(int j=0; j<nlines; j++)
    			if(array[j][i]=='R')
    				return(j);
     
    	return(-1);
    }
    compile sans warning (-std=c11 -Wall -Wextra -Wunused -Wswitch-default -fno-diagnostics-color) et donne la bonne réponse: 0 (zéro).
    Mais j'ai peut-être mal interprété ta réponse.

  17. #17
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci à tous pour vos explications.
    Je n'avais pas vu qu'il y avait autant de manières de faire mais je pense que c'est plus clair maintenant.
    Où passe-t-on la discussion en résolu ?

  18. #18
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Ha non en fait c'est bon j'ai trouvé.

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    int FindRedPawnLine(int nlines, int ncols, char array[nlines][ncols]);
    ...
    compile sans warning (-std=c11 -Wall -Wextra -Wunused -Wswitch-default -fno-diagnostics-color) et donne la bonne réponse: 0 (zéro).
    Mais j'ai peut-être mal interprété ta réponse.
    En ajoutant l'option -Werror=vla, ne compile plus. La tableau est de taille constante mais est reçu par la fonction en utilisant le VLA.
    Et le code ne compile pas avec MSVC, même en C17 car Microsoft n'a jamais implémenté les VLA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1>C:\Users\...\main.c(3,55): error C2057: expression constante attendue

  20. #20
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    @Dalfab: merci de la précision. C'est bien ce que j'avais écrit, j'ai mal interprété ta réponse.

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

Discussions similaires

  1. Trouver un nombre dans un tableau avec une fonction
    Par neufrdb dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 27/03/2011, 16h33
  2. [find] Trouver des valeurs dans un tableau de cellules
    Par Pierre845 dans le forum MATLAB
    Réponses: 5
    Dernier message: 22/01/2009, 10h52
  3. Comment trouver une valeur dans un tableau ?
    Par wizou44 dans le forum Excel
    Réponses: 20
    Dernier message: 29/08/2008, 10h57
  4. trouver un élément dans un tableau
    Par jcaspar dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 21/09/2007, 14h57
  5. Trouver un champ dans un tableau
    Par snaxisnake dans le forum Delphi
    Réponses: 6
    Dernier message: 30/05/2006, 16h37

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