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 :

Fonctions manipulant des matrices


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut Fonctions manipulant des matrices
    Bonjour, cette fois mon problème est digne de ce nom...

    Le contexte est un test du module "Creux". Je crée une matrice simple de nc colonnes et nl lignes. Je la remplis de 0.000 et de 2.000 (des double). Je veux la faire afficher par une fonction contenue dans un module annexe (en version inline cela marche mais je teste le passage des paramètres pour un tableau à deux dimensions...) qui se nomme AffMatSimple. Dans un second temps, je veux faire construire une matrice creuse à partir de cette matrice simple mais le programme stoppe dès que j'entre dans une fonction gérant des tableaux à deux dimensions...

    EN-TÊTE DE AffMatSimple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <stdlib.h>
    #include <stdio.h>
     
    int AffMatSimple(double **, int, int);
    CORPS :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "AffMatSimple.h"
     
    int AffMatSimple(double ** mat, int nl, int nc){
        int i, j;
     
        for (i=0; i<nl; i++){
     
            printf("\nLigne %d :",i);
            for (j=0; j<nc; j++){
                printf("%lf | ", mat[i][j]);
            }
        }
        printf("\n\n") ;
        return 0;
    }
    Moi je pensais que cela irait mais dès que je rentre dans cette fonction , le programme s'arrête... Et pourtant ça compile ! Mais ce n'est pas une fin en soit je sais. Le problème semble se situer dans le passage en paramètres de la matrice. Je vous envoie tous les fichiers relatifs pour vous faire une idée.

    Merci d'avance pour vos avis et conseils.
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Logique, tu déclares ton tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	double MatSimple[TAILLE_L][TAILLE_C]; /*Matrice simple à traiter*/
    Mais ta fonction est déclarée comme étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int AffMatSimple(double **, int, int);
    Les deux écritures n'ont rien à voir (le calcul de la case contenant l'information qui te faut n'est pas du tout pareil)...

    C'est logique que ton programme plante...

    Jc

  3. #3
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Citation Envoyé par fearyourself
    Logique, tu déclares ton tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         double MatSimple[TAILLE_L][TAILLE_C]; /*Matrice simple à traiter*/
    Mais ta fonction est déclarée comme étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int AffMatSimple(double **, int, int);
    Les deux écritures n'ont rien à voir (le calcul de la case contenant l'information qui te faut n'est pas du tout pareil)...

    C'est logique que ton programme plante...

    Jc
    Tu peux développer stp ? Je croyais profondément que j'avais le droit de procéder ainsi...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par panda31
    Tu peux développer stp ? Je croyais profondément que j'avais le droit de procéder ainsi...
    Tu confonds "pointeur de pointeur" et "tableau à 2 dimensions". Absolument rien à voir.

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

  5. #5
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    f (int p[])
    f (int p[12])
    f (int p[][34])
    f (int p[56][78])
    etc.
    Ok... Mais cela veut dire que pour mon en-tête, je mets quoi ?

    c'est ça ???


    Merci pour l'éclaircissement ! J'ai l'air con mais pas con !
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par panda31
    Ok... Mais cela veut dire que pour mon en-tête, je mets quoi ?

    c'est ça ???
    Le prototype de la fonction doit être ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AffMatSimpe(double MatSimple[TAILLE_L][TAILLE_C]);

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    La première écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	double MatSimple[TAILLE_L][TAILLE_C]; /*Matrice simple à traiter*/
    est une zone contigüe en mémoire, l'adresse de chaque case pouvant être calculé comme étant un tableau à une dimension :

    MatSimple[i][j] == MatSimple1D[i*TAILLE_C + j]

    C'est donc un calcul arithmétique qui permet d'obtenir la bonne case...

    La 2ème écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int AffMatSimple(double **, int, int);
    Dit qu'on a un pointeur de pointeurs... Donc pas forcément une zone contigüe. La première dimension étant un pointeur qui va nous donner l'adresse de la ligne de la 2ème dimension.

    Pour obtenir l'adresse de la case (i,j), on doit donc obtenir l'adresse contenu dans la case MatSimple[i]. Ceci nous donne le début de la i-ème ligne et on ira à la j-ème case pour obtenir la case voulue.

    Pour obtenir la valeur de la case, on doit donc faire une indirection en mémorie...

    C'est donc vraiment différent comme approche et en se mélangeant les deux, le compilateur va faire les mauvais calculs, ce qui provoquera une erreur...

    Jc

  8. #8
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Citation Envoyé par fearyourself
    La première écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         double MatSimple[TAILLE_L][TAILLE_C]; /*Matrice simple à traiter*/
    est une zone contigüe en mémoire, l'adresse de chaque case pouvant être calculé comme étant un tableau à une dimension :

    MatSimple[i][j] == MatSimple1D[i*TAILLE_C + j]

    C'est donc un calcul arithmétique qui permet d'obtenir la bonne case...
    c'est pas plutôt MatSimple1D[i*TAILLE_L + j] (L pour ligne) ?

    Merci à tous en tout cas... Je me coucherai bien moins bête...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par panda31
    c'est pas plutôt MatSimple1D[i*TAILLE_L + j] (L pour ligne) ?

    Merci à tous en tout cas... Je me coucherai bien moins bête...
    Non, fait un dessin, tu verras que c'est bien i*TAILLE_C
    Jc

  10. #10
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Donc si j'ai bien compris, lorsque j'ai une matrice comme :
    ________________
    | x | x | x | x |
    ________________
    | x | Y | x | x |
    ________________
    | x | x | x | x |
    ________________
    | x | x | x | x |
    ________________
    | x | x | x | x |


    Pou accéder à l'élément de valeur Y, je dois faire : mat[i*nc+j] avec i=1, nc=4, j=1 => mat[5] ?
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

Discussions similaires

  1. Manipulation des matrices
    Par drimong dans le forum MATLAB
    Réponses: 5
    Dernier message: 02/03/2013, 04h59
  2. manipulation des matrices
    Par amanichennoufi dans le forum Simulink
    Réponses: 3
    Dernier message: 15/02/2012, 19h21
  3. Manipulation des matrices ?
    Par maker dans le forum WinDev
    Réponses: 5
    Dernier message: 15/02/2010, 10h03
  4. Manipulation des Matrices en VB .NET
    Par ziados dans le forum VB.NET
    Réponses: 1
    Dernier message: 27/07/2009, 12h02
  5. manipulation des matrices sous SSRS
    Par linram dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/07/2007, 12h31

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