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 :

probleme initialisation matrice


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut probleme initialisation matrice
    bonjour j ai un probleme d initiation de matrice.Je vous explique le but est de faire saisir à l utilisateur une matrice en console.Pendant qu il saisit on affiche la matrice qui prend progressivement les valeur qu il entre(ainsi l utilisateur sait ou il entre sa valeur).La matrice est initialisé à 0 . le problème est que lorsque j affiche la matrice initialisé à 0 le programme m affiche n importe quoi.Voici les deux fichier le matrice.h qui contient les operations sur les matrices et le saisi.c qui execute ces fonction.SI vous voulez plus de details precisez moi mais je pense etre clair:

    matrice.h:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_ELEM 20
     
    struct  matrice
    {
           int tab[NB_ELEM][NB_ELEM];
           int nbl;
           int nbc;
    };
     
    typedef struct matrice matrice;
     
     
     
     
     
     void init_mat(matrice *mat)
     {   
            int i,j,l,c;
     
        printf("saisir le nombre de ligne\n");
         scanf("%d",&l);
         printf("saisir le nombre de colonne\n");
         scanf("%d",&c);
          printf("%d\n",l);
          (*mat).nbl=l;
          (*mat).nbc=c;
     
         for(i=0;i<(*mat).nbl;i++)
         {
     
     
                         for (j=0;j<(*mat).nbc;j++)
                         {
     
                          (*mat).tab[i][j]=0;
                          }
     
         }
     
     
    }
     
    void affiche_mat(matrice * mat)
    {
         int i,j;
     
     
                     for(i=0;i<(*mat).nbl;i++)
     
         {
                         for (j=0;j<(*mat).nbc;j++)
                         {
                          printf("%d",mat->tab[i][j]);
                          }
                          printf("\n");
         } 
    }
     
     void saisir_mat(matrice  *mat)
    {
    int i,j;
    for(i=0;i<(*mat).nbl;i++)
    {
                      for (j=0;j<(*mat).nbc;j++)
                         {
                          scanf("%d",&(*mat).tab[i][j]);
                          printf("à saisi");
                          system("cls");
                          affiche_mat(mat);
     
                          }                      
     
    }
    }

    saisi.c

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_ELEM 20
     
    #include "matrice.h"
     
     
     
     
    main()
    {
    matrice  mat;
         init_mat(&mat);
         printf("fin init\n");
         system("pause");
         affiche_mat(&mat);
         saisir_mat(&mat);
         affiche_mat(&mat);
         system("pause");
     
    }

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    il faudrai passer un pointeur sur mat aux fonctions qui modifient la matrice !
    dans ton cas, elles font une copie de mat et modifient la copie !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  3. #3
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    ah zut j ai deja bouffé plein de tuto sur les pointeur et je comprend pas trop je fais comment?

    En C++ je sais qu il faut mettre un & devant les variable modifiable mais la ça a pas l air de marcher:-(

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    oui:
    mais il faut changer la fonction d'initialisation en concequence....
    dans la declaration deja:
    et à chaque utilisation de mat, tu remplace mat par (*mat) ou alors remplacer mat. par mat->

    tu pe aussi le faire pour les autres fonctions, c'est meme mieux, y'aura mon de copies

    mais revoies les poiteurs !!!! si tu veux apprendre le C, c'est indispensable de BIEN comprendre leur fonctionnement...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  5. #5
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    voila j ai fait les modifes mais gros plantage la je crois que j ai pas trop compris.j ai fais les modifs dansd le premiers post.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sneb5757
    matrice.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     void init_mat(matrice *mat)
     {   
            int i,j,l,c;
    On ne met pas de définition d'objets ni de code (sauf inline) dans un header. Jamais.

    http://emmanuel-delahaye.developpez.....htm#organiser

    En plus, si c'est avoir de genre d'incohérences
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_ELEM 3
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_ELEM 20
    ça craint vraiment...



    Il faudrait aussi corriger ça :
    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
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:71: warning: return type defaults to `int'
    main.c:71: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:72: warning: unused variable `i'
    main.c:72: warning: unused variable `j'
    main.c:88: warning: control reaches end of non-void function
    Linking console executable: C:\dev\forums2\console.exe
    Process terminated with status 0 (0 minutes, 6 seconds)
    0 errors, 5 warnings
    Pour le reste, c'est simple. Pour qu'une fonction puisse modifier un objet, il faut lui passer son adresse via un pointeur du même type. C'est tout.
    avec
    Ah, j'avais pas vu encore vu le main(). Tu veux une taille programmable ?. OK. Il faut utiliser malloc(). C'est une FAQ (tableau dynamique à 2 dimensions). La structure devient (je recommande size_t pour cet usage) :

    http://emmanuel-delahaye.developpez....tes.htm#size_t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct matrice
    {
       int **tab;
       int nbl;
       int nbc;
    };
    Fait de ton mieux et poste ton code si tu es en panne.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    dans ta fonction saisir mat....
    c'est pas
    mais:
    vu que tu a passé en argument de saisir mat un ponteur sur mat....
    ecoutes, tu ferais mieux de revoir tes cours sur les pointeurs avant hein !

    tu as aussi declaré deux NB_ELEM deifferents !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  8. #8
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    pour le header j ai effectivement eu un doute mais sur ce forum on m avait donné le lien d un projet et le mec avait mis son code dans un header donc je pensais qu on avait "droit".


    L incoherence a été vu est modifié mais j ai pas pensé a corrigé sur le forum

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sneb5757
    pour le header j ai effectivement eu un doute mais sur ce forum on m avait donné le lien d un projet et le mec avait mis son code dans un header donc je pensais qu on avait "droit".
    Redonne le lien...

    C'est techniquement possible, mais çäy mal.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    vla le lien

    http://www.developpez.net/forums/sho...d.php?t=235691

    j ai trouvé la ligne qui me fait planter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     (*mat).nbl=l;
      (*mat).nbc=c;
    j essaie de la corriger avec ce que tu m as dis j ai mis le malloc j ai encore quelque probleme je cherche et je reposte

  11. #11
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    tu melanges, c'est dans les declarations de fonction que je t'ai dis de mettre
    matrice * mat
    pas dans le main !
    en le declarant ainsi dans le main, tu n'as pas besoin de mettre le & !

    avant d'utiliser les pointeurs il faut les comprendre, sinon tu risque de faire de grosses betises !
    un petit rappel:

    signifie: mat est un poiteur sur la structure matrice, le pointeur contien donc l'adresse de la matrice...
    signifie qu'on recupere l'adresse de mat

    signifie qu'on recupere ce qu'il y a dans l'adresse contenue dans le pointeur...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  12. #12
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    le pire c est que je sais a quoi correspond chacune de ces notation le fait est que c est surtout un manque de pratique.

    j ai modifié le code je garde le tableau statique(je ferai le tableau dynamique apres avoir fait avec tableau statique j avance petit à petit).Cette fois plus d erreur mais pas pas d affichage de matrice

  13. #13
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    montre ce que tu as ecris !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  14. #14
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    j ai modifié mon premier post .

  15. #15
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    dans init mat, pourquoi tu mes le nombre de colones dand c et le nombre le ligne dans l ???
    c'est dans (*mat).nbc et (*mat).nbl qu'il faut les mettre ! vu que c'est eux que tu utilise comme condition dans tes boucles for


    ou alors dans les for

    tu met for(i=0;i<l;i++)
    et for(j=0;j<c;j++)
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  16. #16
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    d'ailleur tu as fais une erreure ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(i=0;i<(*mat).nbl;i++)
         {
     
     
                         for (j=0;(*mat).nbl;j++)
                         {
     
                          (*mat).tab[i][j]=0;
                          }
     
         }
    si tu veux utiliser nbl et nbc, dans la deuxieme boucle il faut mettre nbc et pas nbl !!et il faudra mettre avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (*mat).nbl=l;
    (*mat).nbc=c;
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  17. #17
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    ah vi pourtant j ai relu deux fois pour voir si c etait pas une erreur conne de ce style.Si j ai pas capté ça c est qu il est temps de faire une petite pause parce que la je vais accumuler les conneries

    en plus dans le saisi_mat j avais oublié un "&" dans le scanf.Merci beaucoup en tout cas à toi et emmanuel
    je commence a comprendre un peu mieux mais je vais faire moult exercices sur les pointeurs

  18. #18
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    ps: un main c se declare comme ca:

    int main(void)

    avec un return 0;
    à la fin !

    et...bonnes revisions ^^
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sneb5757
    je commence a comprendre un peu mieux mais je vais faire moult exercices sur les pointeurs
    Commence par des choses plus simples que les tableaux à 2 dimensions. Essaye déjà avec une... Une fois que tu auras compris certains principes, tu pourras envisager des choses plus complexes...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut
    ah je ne savais pas qu un main se declarait comme ça à liut ils nous l ont appris comme je l ai ecris.

    Bein j ai pas trop le choix pour els tableaux a 2 dimension c est pour mon projet.

    Vi je sais si tu regarde mon code de la premier page dans la fonction affichage j ai utilisé "->"

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/10/2006, 22h41
  2. [win32]Problème initialisation slider
    Par pj69100 dans le forum MFC
    Réponses: 1
    Dernier message: 02/05/2006, 17h20
  3. Réponses: 2
    Dernier message: 09/01/2006, 16h53
  4. [Debutant] Probleme initialisation de references
    Par kiroukou dans le forum Débuter
    Réponses: 17
    Dernier message: 02/03/2005, 13h55
  5. Probleme de matrice
    Par Johngame dans le forum DirectX
    Réponses: 1
    Dernier message: 07/02/2005, 18h53

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