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'affichage d'untableau à double entrée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut Problème d'affichage d'untableau à double entrée
    Bonjour,

    J'ai un petit problème lorsque que je veux afficher une matrice; la taille est reçue en paramètre de la fonction, fonction qui sert à créer puis à initialiser toutes les cases à zéro.
    Je fais appel à la fonction à partir du main et j'envoie des variables de type int contenues dans une structure.
    le fichier compile sans erreur mais m'affiche un "segmentation fault" lors de l'execution.
    j'ai fais plusieurs tests avec printf mais je n'arrive pas à trouver ou est mon erreur (qui est surement idiote)...



    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
    int     **creer_matrice(int col, int line)
     88 {
     89     int i;
     90     int j;
     91     int **tab = malloc(sizeof(int) * ((line + 1) * (col + 1)));
     92     printf("val de line : %d\n", line); 
     93     printf("val de col : %d\n", col);
     94         
     95     i = 0;
     96     j = 0;
     97     while(i < col)
     98     {
     99         while (j < line)
    100         {
    101             tab[i][j] = 0;
    102             printf("%d", tab[i][j]);
    103             j++;
    104         }   
    105         printf("\n");
    106         i++;  
                  j = 0;
    107     }   
    108     return (tab);
    109 }

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int **tab = malloc(sizeof(int) * ((line + 1) * (col + 1)));
    ceci déclare un double pointeur de int, mais ne lui donne qu'une adresse obtenue pour un pointeur simple.

    il faut choisir.
    et pourquoi avoir des +1?

    il te faudrait idéalement des fonctions telles que:
    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* matrix_create(int cols, int lines, int cols) {
        return malloc(sizeof(int) * lines * cols);
    }
     
    void matrix_create(int *m) {
        return free(m);
    }
     
    int matrix_get(int const* m, int cols, int line, int col) {
        return m[line*cols+col];
    }
     
    int* matrix_get_ref(int const* m, int cols, int line, int col) {
        return m+(line*cols+col); /* ou &m[line*cols+col] */
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Il faudrait donc que je cast mon malloc pour lui indiquer que c'est un double pointeur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int **tab;
    tab = (int**)malloc(sizeof(int) * ((line + 1) * (col + 1)));
    Les "+1" c'est juste pour créer une matrice avec une taille plus grande que celle qui mesure (line, col). Ce n'est pas clair en effet, je vais les retirer et les mettre directement lorsque j'appelle la fonction.


    J'aimerais une matrice à deux dimensions, les fonctions que tu me proposes me semble servir uniquement pour une seule dimension.




    Merci pour ton aide.

  4. #4
    Membre actif
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Points : 204
    Points
    204
    Par défaut
    Ça dépend comment tu vois ton tableau à 2 dimensions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Je décide de tout stocker dans une ligne ma matrice à deux dimension.
    //la case [x][y] aura comme indice [y*TAILLE_X+x]
     
    int* creerMatrice(int tailleX,int tailleY)
    {
     return calloc(tailleX*tailleY,sizeof(int));//un calloc remplit la zone alloué de 0, ou un malloc et une boucle de remplisage
    }
    Dans ce code, je n'ai pas fais de '+1' car ça n'a pas trop de sens dans cette fonction, autant incrémenter dans les paramètres de la fonction !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Je décide d'utiliser 2 dimensions
    int ** creerMatrice(int tailleX,int tailleY)
    {
     int i;
     //int** -> tableau de int* et int* ->tableau de int ==> int** tableau de int*int
     int ** mat=malloc(sizeof(int*)*tailleX);//tu peux echanger tailleX et tailleY si tu le souhaite ça reste une matrice :p, cependant il faut en tenir compte au moment de la lecture
     for(i=0;i<tailleX;i++)//si tu n'as pas le droit au boucle for, tu t'adapte ;)
     {
      mat[i]=calloc(tailleY,sizeof(int));
     }
     return mat;
    }
    EDIT:
    Tu peux même créer un type Matrice contenant la matrice et ses dimensions !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct
    {
     int tailleX,tailleY;
     int** mat;//pour le cas où on choisit de le faire à 2 dimensions ;)
    }Matrice;
     
    //et les fonction
    Matrice* creerMatrice(int tailleX,tailleY);
    void libererMatrice(Matrice* m);
    void afficherConsoleMatrice(const Matrice* m);

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Je comprends mieux. Disons que je vois un tableau à deux dimensions comme un tableau avec la première ligne contenant des pointeurs vers chaque colonnes, ça me permet de mieux visualiser (mentalement) le fonctionnement. Mais ce n'est peut être pas le cas pour tout le monde.

    Du coup ton second code me parait beaucoup plus clair que le premier (que j'essayerais de comprendre également) et me permet de comprendre beaucoup plus facilement.
    il faut donc malloc la ligne contenant les pointeurs vers les colonnes puis malloc chaque colonne. C'est génial comme idée.


    Edit : je n'ai besoin d'utiliser une seule matrice (une seule fois), donc je ne pense pas que ce soit nécessaire de faire une structure (je vais quand même y réflechir) mais merci pour l'idée.

    Merci encore pour votre aide, encore quelques mois et j'espère avoir le niveau nécessaire pour vous aider en cas de problème.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bien sur que si, tu as besoin d'une structure.
    Une structure permet de clarifier le code, de réunir ce qui va ensemble.
    Et même d'apporter des garanties d'intégrité, surtout si la forme de la structure n'est pas donnée dans le .h qui définit les fonctions l'utilisant, mais seulement dans le .c. C'est comme cela que fonctionne la structure FILE, dont aucun développeur n'a a savoir ce qu'ell contient précisément.

    Nous serons heureux de ton aide!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Effectivement, créer une structure me permettra d'utiliser les fonctions manipulant les matrices beaucoup plus facilement, notamment pour free la mémoire utilisée (ce qui réglera surement mon problème de "segmentation fault" qui s'affiche une fois sur x, lorsque je lance mon programme plusieurs fois de suite).
    Vous m'avez convaincu, merci encore.

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

Discussions similaires

  1. Problème d'affichage entre IE et Firefox
    Par bard123 dans le forum Struts 1
    Réponses: 2
    Dernier message: 20/10/2008, 17h08
  2. Problème d'affichage entre swf local et serveur
    Par djhanihill dans le forum Flash
    Réponses: 1
    Dernier message: 24/01/2008, 19h15
  3. Problème d'affichage Crystal Report entre deux machines.
    Par gwadakillah dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 20/09/2007, 14h01
  4. [Configuration] Problème d'affichage entre le php et html
    Par arioule dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 19/09/2007, 10h30
  5. Problème d'affichage de liste entre IE et FireFox
    Par slideveloppeur2006 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/07/2006, 11h07

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