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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut Problème d'allocation mémoire d'un tableau de tableaux (tableau de 2dimensions) et passage de paramètre.
    Bonjour,

    Comme le précise le titre je veux faire une allocation mémoire de int* mat[3] et non pas int** mat puis je dois passer la matrice comme paramètre à la fonction (Assign_V1()).

    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
    void Assign_V1(int* mat[3], int N, int M)    
    {
    	for(int i=0; i<N; i++)
    		for(int j=0; j<M; j++) mat[i][j]=i+j;		
    }
     
     
    int main()
    {
    	const int N=4;
    	const int M=3;
    	//je dois avoir une matrice mat[4][3]
    	int (*mat)[3] = malloc(N * sizeof(*mat));   //***Mon problème
     
    	Assign_V1(mat, N, M);
     
            for (int i = 0; i < N; i++)
           {
                for (int j = 0; j < M; j++) {
                         printf("%3d", mat[i][j]);
                   }
            printf("\n");
           }
      return 0;	
     
    }

    Par avance merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    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 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Ouais je passe mon tour ton code est foireux (le gros problème est : tu inverses les lignes et les colonnes parce que tu nommes mal tes variables)

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define G_NB_COLUMNS 4
    #define G_NB_LINES   3
     
     
    void Assign_V1(int *mat[3], size_t nb_lines, size_t nb_columns) {
        size_t line, column;
     
        for(line=0; line < nb_lines; ++line) {
            for(column=0; column < nb_columns; ++column) {
                mat[line][column] = (line + column);
            }
        }
    }
     
     
    int main()
    {
        int* mat[G_NB_LINES] = { NULL };
        size_t line, column;
        char is_ok;
     
        for(line=0, is_ok=1; (is_ok && (line < G_NB_LINES)); ++line) {
            mat[line] = malloc(sizeof(int) * G_NB_COLUMNS);
            if (mat[line] == NULL) { is_ok = 0; }
        }
     
        if (is_ok) {
            Assign_V1 (mat, G_NB_LINES, G_NB_COLUMNS);
     
            for(line=0; line < G_NB_LINES; ++line) {
                for(column=0; column < G_NB_COLUMNS; ++column) {
                    printf("%3d ", mat[line][column]);
                }
     
                printf("\n");
            }
        } else {
            printf("main - error: allocation failed\n");
        }
     
        for(line=0; line < G_NB_LINES; ++line) {
            if (mat[line] != NULL) { free(mat[line]); }
        }
     
     
        return EXIT_SUCCESS;
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre réponse.

    En revanche, je n'ai pas compris le test if (mat[line] == NULL) { is_ok = 0; } est-il necéssaire ? est ce qu'il y a risque d'avoir une adresse NULL quand on passe par la fonction malloc().

    Merci.

  4. #4
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    sur votre code originel, peut-être plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Assign_V1(int(*mat)[3], int N, int M){
        for(int i=0; i<N; i++)
            for(int j=0; j<M; j++) mat[i][j] = i+j;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void Assign_V1(int* mat[3], int N, int M)
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Assign_V1(int* mat[], int N, int M)
    soit mat est un pointeur sur pointeur sur int

    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Assign_V1(int(*mat)[3], int N, int M)
    ici mat est un pointeur sur tableaux de trois entiers.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Donc, pour le paramètre ce qu'on met entre crochets [3] représente le nombre de lignes et non de colonnes !

  6. #6
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    le 3 est facultatif, ce n'est qu'une indication pour le lecteur. du point de vue du code il n'a aucun effet. mat est un pointeur sur pointeur sur entier on aurait pu écrire aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Assign_V1(int **mat, int N, int M)
    c'est aussi équivalent.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Oui dans mon cas il s'agit d'un pointeur sur tableaux de trois entiers (*mat)[3]. Y a t'il une différence dans l'allocation mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(line=0, is_ok=1; (is_ok && (line < G_NB_LINES)); ++line) 
    	{
            mat[line] = malloc(sizeof(int) * G_NB_COLUMNS);
            if (mat[line] == NULL) { is_ok = 0; }
        }
    c'est toujours valable !

    Merci.

  8. #8
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Je parlais de ton code originel
    Dans le code de foetus l'allocation est faite différemment puisqu'il y a un tableau de pointeur sur la pile et des tableaux d'entier sur le tas.
    Les deux solutions sont viables.

    Dans ton code originel, tu avais juste a changer le prototype de la fonction en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Assign_V1(int(*mat)[3], int N, int M)
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Mais en changeant le prototype, j'ai eu ces erreurs :


    main.c: In function ‘main’:
    main.c:35:20: warning: passing argument 1 of ‘Assign_V1’ from incompatible pointer type [-Wincompatible-pointer-types]
    35 | Assign_V1 (mat, G_NB_LINES, G_NB_COLUMNS);
    | ^~~
    | |
    | int **
    main.c:8:22: note: expected ‘int (*)[]’ but argument is of type ‘int **’
    8 | void Assign_V1(int (*mat)[], size_t nb_lines, size_t nb_columns) {
    | ~~~~~~^~~~~~


    En mettant les constantes en local dans main(), une erreur supplémentaire :
    main.c: In function ‘Assign_V1’:
    main.c:13:16: error: invalid use of array with unspecified bounds
    13 | mat[line][column] = (line + column);
    | ^

  10. #10
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Avec ce code ? :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void Assign_V1(int(*mat)[3], int N, int M)
    {
        for(int i=0; i<N; i++)
            for(int j=0; j<M; j++) mat[i][j] = i+j;
    }
     
    int main(void)
    {
        const int N=4;
        const int M=3;
        //je dois avoir une matrice mat[4][3]
        int(*mat)[3] = malloc(N * sizeof(*mat));   //***Mon problème
     
        Assign_V1(mat, N, M);
     
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                printf("%3d", mat[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Voici le code :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void Assign_V1(int (*mat)[3], size_t nb_lines, size_t nb_columns) 
    {
     
        size_t line, column;
     
        for(line=0; line < nb_lines; ++line) {
            for(column=0; column < nb_columns; ++column) {
                mat[line][column] = (line + column);
            }
        }
    }
     
     
    int main()
    {
    	#define G_NB_LINES   3
    	#define G_NB_COLUMNS 4
     
        int* mat[G_NB_LINES] = { NULL };
        size_t line, column;
        char is_ok;
     
        for(line=0, is_ok=1; (is_ok && (line < G_NB_LINES)); ++line) 
    	{
            mat[line] = malloc(sizeof(int) * G_NB_COLUMNS);
            if (mat[line] == NULL) { is_ok = 0; }
        }
     
        if (is_ok) {
            Assign_V1 (mat, G_NB_LINES, G_NB_COLUMNS);
     
            for(line=0; line < G_NB_LINES; ++line) {
                for(column=0; column < G_NB_COLUMNS; ++column) {
                    printf("%3d ", mat[line][column]);
                }
     
                printf("\n");
            }
        }
     
        for(line=0; line < G_NB_LINES; ++line) {
            if (mat[line] != NULL) { free(mat[line]); }
        }
     
     
        return EXIT_SUCCESS;
    }

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    oui CGI, c'est mon code initial.

  13. #13
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Je t'avait dit avec ton code originel !!!
    La du mélange les deux codes, le tien et celui de foetus.
    Je l'ai posté juste au dessus de ton dernier post.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Autant pour moi, effectivement çà marche avec le changement du prototype dans le code initial.

    Honnêtement, je suis perdu, je n'arrive pas à faire la différence (en termes de conception) :

    int (*mat) [3] : (*mat) est un pointeur sur un tableau de tableau de 3 entiers. Et

    int* mat[3] : ? (est ce qu'il y a la notion de tableau)

    int** mat : ?

    Merci.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Si j'ai bien compris :

    int* mat[3] (ou int* mat[]) est équivalente à int** mat : un tableau de pointeurs où chaque pointeur pointe sur un tableau d'entiers.

    A confirmer ? Si oui donc l'allocation mémoire à suivre est celle de Foetus.

    Par avance merci.

  16. #16
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    int* mat[3]
    int* mat[]
    int** mat
    En tant que paramètre de fonction les trois sont équivalent :
    pointeur sur pointeur sur entier
    pointeur(1) sur pointeur(2) sur entier
    ou pointeur(2) peut être le premier pointeur d'un tableau de pointeurs.
    et ou entier peut être le premier entier d'un tableau d'entier.

    Citation Envoyé par hogar Voir le message
    int (*mat) [3] : (*mat) est un pointeur sur un tableau de tableau de 3 entiers.
    ici mat est un pointeur sur tableau de 3 entiers (déjà dit plus haut).
    (il peut pointer sur le premier tableau d'un tableau de tableau de 3 entiers).
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    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 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Citation Envoyé par hogar Voir le message
    int* mat[3] (ou int* mat[]) est équivalente à int** mat
    Pour être tatillon/ précis non ce n'est pas équivalent

    *) int* mat[3] est 1 définition d'1 tableau de 3 ""cases"", chaque case contient 1 pointeur sur 1 int (**). C'est au même titre qu'1 autre tableau short tab[15] ou float tab[2].
    *) int* mat[] est aussi 1 tableau mais pour 1 passage de paramètre et non pour 1 définition. Le passage de paramètre dégrade les tableaux en pointeur (sauf si c'est dans la même source, à vérifier)
    *) int** mat est 1 pointeur sur 1 pointeur d'entier. 1 double pointeur est le signe de l'adresse d'1 pointeur sur 1 int (**)

    Édit: Après recherche, int* mat[] peut-être aussi 1 définition mais il faut obligatoirement l'initialiser (c'est le compilateur qui calcule la taille) par exemple : char tab[] = {'H', 'e', 'l', 'l', 'o', '!'};.


    **: int* peut être, avec int* mat[3] et int* ptr:
    *) 1 adresse : int a; mat[1] = &a; ptr = &a;.
    *) 1 autre tableau : int a[4]; mat[0] = a; /* or mat[0] = &a[0]; */ ptr = a; /* or ptr = &a[0]; */.
    *) 1 allocation : mat[2]= malloc(XXX * sizeof(int)); ptr = malloc(XXX * sizeof(int));.

    Et int (*mat) [3] est la définition d'1 pointeur sur 1 tableau de 3 ""cases"" puisque tu mets les parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        int mat[3] = {15, 26, 37};
        int (*ptr_mat)[3];
     
        ptr_mat = &mat;
     
        printf("%d, %d, %d\n", (*ptr_mat)[0], (*ptr_mat)[1], (*ptr_mat)[2]);
    avec int**
    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
        int mat[3] = {15, 26, 37};
        int (*ptr_mat)[3];
        int** dptr_mat;
     
        ptr_mat = &mat;
     
    //  version 1: get the adress of int*
    //  dptr_mat = (int**) &ptr_mat; // <- cast, warning: assignment to ‘int **’ from incompatible pointer type ‘int (**)[3]’
     
    //  version 2: allocate the pointer and copy an int*
        dptr_mat    = malloc( sizeof(int**) ); // test is NULL
        (*dptr_mat) = (int*) ptr_mat; // <- cast, warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[3]’
     
        printf("%d, %d, %d\n", (*ptr_mat)[0], (*ptr_mat)[1], (*ptr_mat)[2]);
        printf("%d, %d, %d\n", (*dptr_mat)[0], (*dptr_mat)[1], (*dptr_mat)[2]);
    //  printf("%d, %d, %d\n", (**dptr_mat + 0), (**dptr_mat + 1), (**dptr_mat + 2));
     
    //  version 2: free
        free(dptr_mat);

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bonsoir,
    merci pour toutes les explications mais je reprends le code de foetus (mon besoin actuel):
    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void Assign_V1(int *mat[4], size_t nb_lines, size_t nb_columns)     
    {
     
        size_t line, column;
     
        for(line=0; line < nb_lines; ++line) {
            for(column=0; column < nb_columns; ++column) {
                mat[line][column] = (line + column);
            }
        }
    }
     
     
    int main()
    {
    	#define G_NB_LINES   4
    	#define G_NB_COLUMNS 3
     
        int* mat[G_NB_LINES] = { NULL };
        size_t line, column;
        char is_ok;
        //int *ptr_mat[4];
        int *ptr_mat[G_NB_LINES];
        //ptr_mat=&mat;   //error: assignment to expression with array type
     
        for(line=0, is_ok=1; (is_ok && (line < G_NB_LINES)); ++line) 
    	{
            mat[line] = malloc(sizeof(int) * G_NB_COLUMNS);
            if (mat[line] == NULL) { is_ok = 0; }
        }
     
        if (is_ok) {
            Assign_V1 (mat, G_NB_LINES, G_NB_COLUMNS);
     
            for(line=0; line < G_NB_LINES; ++line) {
                for(column=0; column < G_NB_COLUMNS; ++column) {
                    //printf("%3d ", mat[line][column]); //affichage classique
                    printf("%3d", *(ptr_mat+(line*G_NB_LINES+column)));  //warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
                }
     
                printf("\n");
            }
        }
     
        for(line=0; line < G_NB_LINES; ++line) {
            if (mat[line] != NULL) { free(mat[line]); }
        }
     
     
        return EXIT_SUCCESS;
    }
    Je n'arrive pas à afficher ma matrice en utilisant pointeurs (adresse des élements et leur valeur).

    Merci d'avance.

  19. #19
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonsoir,

    J'ai pas suivi la discussion, mais il semble que vous n'ayez pas besoin de ptr_mat du tout, car mat est déjà un tableau de pointeurs vers les lignes de votre matrice. Vous pouvez directement accéder à chaque élément de la matrice avec mat[line][column] pour l'initialisation et l'affichage.

    Un simple printf("%3d ", mat[line][column]); ne suffirait pas ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  20. #20
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Citation Envoyé par hogar Voir le message
    Je n'arrive pas à afficher ma matrice en utilisant pointeurs (adresse des élements et leur valeur).
    Ça ne peut pas fonctionner, tes tableaux ne sont pas contiguës !

    Ça pourrait fonctionner avec ton code initial, puisque les tableaux sont contiguës :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define N 4
    #define M 3
     
    void Assign_V1(int(*mat)[M], int n) // n tableaux de M int
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<M; j++) mat[i][j] = i+j;
    }
     
    int main(void)
    {
        int(*mat)[M] = malloc(N * sizeof(*mat));
     
        Assign_V1(mat, N);
     
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)  printf("%3d", mat[i][j]); // avec les indices
            printf("\n");
        }
     
        printf("\n");
     
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)  printf("%3d", *(*mat+i*M+j)); // avec les pointeurs
            printf("\n");
        }
     
        free(mat);
        return 0;
    }
    Mais dans ce cas on peux faire un peu plus simple en faisant une allocation d'un tableau d'entiers que l'on utilise comme s'il avait 2 dimensions :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define N 4
    #define M 3
     
    void Assign_V1(int *mat, int n, int m)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++) *(mat+i*M+j) = i+j;
    }
     
    int main(void)
    {
        int* mat = malloc(N*M*sizeof(*mat));
     
        Assign_V1(mat, N, M);
     
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)  printf("%3d", *(mat+i*M+j)); 
            printf("\n");
        }
     
        free(mat);
        return 0;
    }
    Mais là, on ne peut plus utiliser les crochets simplement.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. allocation progressive d'un tableau
    Par youp_db dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 24/10/2006, 11h23
  2. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  3. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  4. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02
  5. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29

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