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 :

Problème d'allocation d'un tableau (matrice) passé en paramètre


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Problème d'allocation d'un tableau (matrice) passé en paramètre
    Bonjour,

    J'ai un programme dans lequel je déclare des matrices que je passe ensuite en paramètres à une fonction.
    La matrice est allouée dans la fonction.
    Mais le problème est que je ne récupère pas les valeurs mises dans la matrice dans le main.

    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
     
    int main(int argc, char* argv[])
    {
        unsigned short int** matrice;
        unsigned short int* tab;
        unsigned short int taille;
     
        init(&matrice, &tab, &taille);
     
        for(int i = 0; i < taille; i ++)
        {
            for(int j = 0; j < taille; j ++)
            {
                printf("[%d][%d]", matrice[i][j]);
            }
            printf("(%d)\n", tab[i]);
        }
    }
    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
     
     
    // int nbElement = est récupéré par lecture d'un fichier
     
    int init(unsigned short int** *mat,
             unsigned short int* *tab,
             unsigned short int *taille)
    {
       *mat = malloc(nbElement * sizeof(unsigned short int*));
        for(int i = 0; i < nbElement; i ++)
        {
            mat[i] = calloc(nbElement, sizeof(unsigned short int));
            for(int j = 0; j < nbElement; j ++)
            {
                mat[i][j] = 999;
            }
        }
     
        *tab = calloc(nbElement, sizeof(unsigned short int));
     
        *taille = nbElement;
     
        // lecture d'un fichier
        while(fgets(chaine, TAILLE_MAX, fichier) != NULL)
        {
            if(atoi(chaine) > 50) tab[atoi(chaine)] = 1;
            mat[atoi(chaine)][atoi(chaine)] = 15;
        }
    }
    J'ai simplifier le code, ainsi ce que fait le programme ne veut rien dire ...

    Pourriez-vous m'aider ?
    Merci :)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonsoir,

    À vue de nez (je regarderai en profondeur plus tard, si c'est nécessaire), dans le premier code, plutôt que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(int argc, char* argv[])
    {
        …
        unsigned short int *taille;
        
        init(&matrice, &tab, taille);
    je pense que tu voulais en fait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(int argc, char* argv[])
    {
        …
        unsigned short int taille;
        
        init(&matrice, &tab, &taille);

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Euh oui oui désolé, j'ai mal recopié mon code.

    J'ai vérifier le reste et c'est bon, c'est bien les pointeurs que je fais.
    Le problème concerne la matrice et le tableau.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Citation Envoyé par biyoann Voir le message
    Euh oui oui désolé, j'ai mal recopié mon code.

    J'ai vérifier le reste et c'est bon, c'est bien les pointeurs que je fais.
    Le problème concerne la matrice et le tableau.
    Fais un copier-coller de ton code plutôt que le recopier à la main. Tu seras sûr de ne pas te tromper et on verra s'il y a d'autres fautes de frappe…

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Fais un copier-coller de ton code plutôt que le recopier à la main. Tu seras sûr de ne pas te tromper et on verra s'il y a d'autres fautes de frappe…
    Voilà :

    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>
     
    #include "lecteur.h"
     
    int main(int argc, char* argv[])
    {
        unsigned short int* ouvertureEntrepot;
        unsigned short int** entrepotDessertCentrale;
        unsigned short int coutOuvertureEntrepot;
        unsigned short int** entrepotCoutLivraisonCentrale;
     
        lectureDonnees("../instances/Jouet2.txt", &ouvertureEntrepot, &entrepotDessertCentrale, &coutOuvertureEntrepot, &entrepotCoutLivraisonCentrale);
     
        printf("Cout : %d\n", coutOuvertureEntrepot);
     
        for(int i = 0; i < 10; i ++)
        {
            for(int j = 0; j < 10; j ++)
            {
                printf("[%d][%d] : (%d | %d)\n", i+1, j+1, entrepotDessertCentrale[i][j], entrepotCoutLivraisonCentrale[i][j]);
            }
        }
     
        return 0;
    }
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
     
    #define TAILLE_MAX 100
     
    int lectureDonnees(char* emplacementFichier,
        unsigned short int* *ouvertureEntrepot,
        unsigned short int** *entrepotDessertCentrale,
        unsigned short int *coutOuvertureEntrepot,
        unsigned short int** *entrepotCoutLivraisonCentrale)
    {
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX];
        char* sousChaine;
        unsigned short int nombreEntrepotCentrale;
        unsigned short int entrepotLu;
        unsigned short int centraleLue;
        unsigned short int coutLivraisonLu;
     
        fichier = fopen(emplacementFichier, "r");
     
        if(fichier == NULL)
        {
            printf(">> Erreur lors de l'ouverture de '%s'", emplacementFichier);
            return 1;
        } else {
     
            // lecture de la premier ligne
            if(fgets(chaine, TAILLE_MAX, fichier) == NULL)
            {
                printf(">> Le format des données du fichier sont incorrectes");
                return 1;
            } else {
                sousChaine = strtok(chaine, " ");
                if(sousChaine != NULL)
                {
                    nombreEntrepotCentrale = atoi(sousChaine);
     
                    *ouvertureEntrepot = calloc(nombreEntrepotCentrale, sizeof(unsigned short int));
     
                    *entrepotDessertCentrale = malloc(nombreEntrepotCentrale * sizeof(unsigned short int*));
                    for(int i = 0; i < nombreEntrepotCentrale; i ++)
                    {
                        entrepotDessertCentrale[i] = calloc(nombreEntrepotCentrale, sizeof(unsigned short int));
                    }
     
                    *entrepotCoutLivraisonCentrale = malloc(nombreEntrepotCentrale * sizeof(unsigned short int*));
                    for(int i = 0; i < nombreEntrepotCentrale; i ++)
                    {
                        entrepotCoutLivraisonCentrale[i] = malloc(nombreEntrepotCentrale * sizeof(unsigned short int));
                        for(int j = 0; j < nombreEntrepotCentrale; j ++)
                        {
                            entrepotCoutLivraisonCentrale[i][j] = USHRT_MAX;
                        }
                    }
                }
                sousChaine = strtok(NULL, " ");
                if(sousChaine != NULL)
                {
                    *coutOuvertureEntrepot = atoi(sousChaine);
                }
            }
     
            // lecture des autres lignes
            while(fgets(chaine, TAILLE_MAX, fichier) != NULL)
            {
                sousChaine = strtok(chaine, " ");
                if(sousChaine != NULL)
                {
                    entrepotLu = atoi(sousChaine);
                }
                sousChaine = strtok(NULL, " ");
                if(sousChaine != NULL)
                {
                    centraleLue = atoi(sousChaine);
                }
                sousChaine = strtok(NULL, " ");
                if(sousChaine != NULL)
                {
                    coutLivraisonLu = atoi(sousChaine);
                }
     
                entrepotDessertCentrale[entrepotLu - 1][centraleLue - 1] = 1;
                entrepotCoutLivraisonCentrale[entrepotLu - 1][centraleLue - 1] = coutLivraisonLu;
            }
            fclose(fichier);
        }
     
        return 0;
    }

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

Discussions similaires

  1. [Débutant][Win32] Problème d'allocation de tableau de FILE
    Par Patchanka dans le forum Visual C++
    Réponses: 8
    Dernier message: 06/04/2009, 10h49
  2. Réponses: 7
    Dernier message: 16/01/2009, 21h41
  3. problème avec un tableau passé en paramètre
    Par curley dans le forum Débuter
    Réponses: 1
    Dernier message: 28/10/2007, 02h54
  4. Réponses: 10
    Dernier message: 24/05/2007, 09h27
  5. Réponses: 5
    Dernier message: 06/02/2007, 09h26

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