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 :

Transmettre un tableau multi-dimensionnel de taille variable à une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 34
    Par défaut Transmettre un tableau multi-dimensionnel de taille variable à une fonction
    Bonjour,

    Je souhaiterais transmettre un tableau multi-dimensionnel de taille variable à une fonction.

    Sauriez-vous faire ceci (sans utiliser de bibliothèque) svp ?

    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
    void fonction(int tab[][], int xMax, int yMax)
    {
      tab = (int [xMax][yMax])tab; /* cast */
     
      tab1[1][2] = 5; /* au lieu de tab1[1*yMax+2] */
    }
     
    int main(int argc, char *argv[])
    {
      int xMax = 2; /* Variables et non constantes */
      int yMax = 3; /* Variables et non constantes */
      int tab[xMax][yMax];
      fonction(tab,xMax,yMax);
      return 0;
    }
    Merci d'avance.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Hello
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void f(int m, int n, int t[m][n]) {
    	t[0][0]=0;
    }

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    Par défaut
    Tu peux faire 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <stdio.h>
    #include <stdlib.h>
     
    #define NB_LINES   2
    #define NB_COLUMNS 3
     
    void fonction01(int* tab, size_t x, size_t y) {
        if ((x != 0) && (y != 0)) {
            int i, j;
     
            for(i=0; (i < x); ++i) {
                for(j=0; (j < y); ++j) {
                    *(tab + i*y + j) = (i + j);
                }
            }
        }
    }
     
     
    int main()
    {
        int tab[NB_LINES][NB_COLUMNS];
        size_t i, j;
     
        fonction01(tab[0], NB_LINES, NB_COLUMNS);
     
    //  Display
        for(i=0; (i < NB_LINES); ++i) {
            for(j=0; (j < NB_COLUMNS); ++j) {
                printf("%3d ", tab[i][j]);
            }
            printf("\n");
        }
     
        return EXIT_SUCCESS;
    }
    Je tiens à préciser que les tableaux VLA "Variable-length array" sont dépréciés depuis 2011 avec la norme C11 (<- lien Wikipédia en anglais)

    Sinon le mieux c'est de faire 1 structure
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define NB_LINES   2
    #define NB_COLUMNS 3
     
    typedef struct s_tab {
        size_t x, y;
        int* tab;
    } t_tab;
     
    void tab_create(t_tab* t, size_t x, size_t y) {
        if ((x != 0) && (y != 0)) {
            t->tab = malloc(sizeof(int) * x * y);
     
            if (t != NULL) {
                t->x = x; t->y = y;
            } else {
                t->x = 0; t->y = 0;
            }
        } else {
            t->tab = NULL;
            t->x = 0; t->y = 0;
        }
    }
     
    void tab_delete(t_tab* t) {
        if (t->tab != NULL) {
            free(t->tab);
            t->x = 0; t->y = 0;
        }
    }
     
    void tab_display(t_tab* t) {
        if (t->tab != NULL) {
            int i, j;
     
            for(i=0; (i < t->x); ++i) {
                for(j=0; (j < t->y); ++j) {
                    printf("%3d ", *(t->tab + i*t->y + j));
                }
                printf("\n");
            }
        }
    }
     
    void tab_fill(t_tab* t) {
        if (t->tab != NULL) {
            int i, j;
     
            for(i=0; (i < t->x); ++i) {
                for(j=0; (j < t->y); ++j) {
                    *(t->tab + i*t->y + j) = (i + j);
                }
            }
        }
    }
     
     
    int main()
    {
        t_tab t;
        tab_create(&t, NB_LINES, NB_COLUMNS);
        tab_fill(&t);
        tab_display(&t);
        tab_delete(&t);
     
        return EXIT_SUCCESS;
    }

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 34
    Par défaut
    Merci pour vos réponses rapides.

    Le premier code
    edgarjacobs
    ne marche pas. Je l'avais déjà essayé. Il affiche
    use of parameter outside function body before ']' token
    .

    Le deuxième code est correct, mais c'est justement ce que je voulais éviter car on est ensuite obligé d'écrire comme tu as fait ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define IDX(x,y) ((x)*yMAX+(x))
    tab[IDX(x,y)]
    #undef IDX
    , ce qui crée une écriture trop compliquée surtout lorsque les expressions contiennent beaucoup de code.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Ce code compile et s'exécute convenablement (win10):
    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
    #include <stdio.h>
     
    void Fill(int m, int n, int t[m][n]) {
        for(int i=0; i<m; ++i)
            for(int j=0; j<n; ++j)
                t[i][j]=(i+1)*10+j;
    }
     
     
    void Display(int m, int n, int t[m][n]) {
        for(int i=0; i<m; ++i, putchar('\n'))
            for(int j=0; j<n; ++j)
                printf("%4d",t[i][j]);
    }
     
     
    int main(void) {
        int m=4, n=6;
        int t[m][n];
        Fill(m, n, t);
        Display(m, n, t);
     
        return(0);
    }
    Resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      10  11  12  13  14  15
      20  21  22  23  24  25
      30  31  32  33  34  35
      40  41  42  43  44  45
    En ligne de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -std=c11 -o%1.exe -Wall -Wextra -Wunused -Wswitch-default -fno-diagnostics-color -O2 %1.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders) 12.2.0
    Copyright (C) 2022 Free Software Foundation, Inc.
    À noter que le compilateur de microsoft ne connait pas les vla.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 34
    Par défaut
    Merci beaucoup.

    Je travaille sous Qt Creator.
    Je ne sais pas trop où taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -std=c11 -o%1.exe -Wall -Wextra -Wunused -Wswitch-default -fno-diagnostics-color -O2 %1.c
    . J'ai essayé 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
     
    QT             += core
    QT             -= gui
     
    TARGET          = Test
     
    CONFIG         += console
    CONFIG         -= app_bundle
     
    TEMPLATE        = app
     
    HEADERS        += blabla...
     
    SOURCES        += blabla...\
                      main.cpp
     
    QMAKE_CXXFLAGS +=-std=c++11\
                     -o%1.exe -Wall -Wextra -Wunused -Wswitch-default -fno-diagnostics-color -O2 %1.c
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: %1.c: No such file or directory
    J'ai remplacé par %1.c par main.cpp, mais j'obtiens la même erreur.

    Et celui-ci, je ne sais pas où le taper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders) 12.2.0
    Copyright (C) 2022 Free Software Foundation, Inc.
    Je n'ai pas eu de cours sur la compilation. J'ai Windows 7 64 bits, QT Creator 3.3.1.
    Savez-vous où taper ces lignes svp ?

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

Discussions similaires

  1. [PHP 5.2] [Tableaux] Tableau multi-dimension en argument d'une fonction
    Par dkmatt dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2009, 16h54
  2. Réponses: 5
    Dernier message: 04/10/2006, 18h49
  3. [Tableaux] Tableau multi dimensionnel
    Par gids01 dans le forum Langage
    Réponses: 7
    Dernier message: 02/10/2006, 16h18
  4. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23
  5. Réponses: 4
    Dernier message: 24/08/2005, 14h09

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