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 :

Programme qui transforme matrice en vecteur


Sujet :

C

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut Programme qui transforme matrice en vecteur
    Bonjour à tous,
    J'ai écris une fonction qui transforme matrice en vecteur. J'ai 0 erreur 0 warnig mais ca m'affiche rien.

    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
     
    #include <stdio.h>// pour les printf et puts
    #include <stdlib.h>// pour les malloc et free
    //#include <time.h>
    //#include <math.h>
    typedef double TYPE ;
    typedef TYPE *VECTOR ;
    typedef TYPE **MATRIX ;
    // transformation d'une matrice en vecteur
    double fmv(int const dim1, int const dim2, int dim, double **m_in);
    int main()
    {
    int const dimens1 = 4 , dimens2= 2 ;// on définit les dimensions de la matrice.
    int dimens=8;
     
    double **mat_in;// matrice de départ
    double vect_out[dimens]; //double *vect_out ;
    int i, j;
    //int i, j; // les indices des boucles.
     
    vect_out[dimens] = fmv(dimens1, dimens2, dimens, mat_in);// incompatible types when assigning to type 'double *' from type 'double'
    return 0;
    }
     
    double fmv(int const dim1, int const dim2, int dim, double **m_in)
    {
    int i;
    int j;
     
    double v_out[dim] ;// vecteur de départ
    // on va créer une matrice et la remplir par des valeurs reconnaissables
    m_in = (MATRIX) malloc( dim1 * sizeof(VECTOR) );
       if ( NULL == m_in )
       return EXIT_FAILURE ;
       *m_in = (VECTOR) malloc( dim * sizeof(TYPE) );
       if ( NULL == *m_in )
       return EXIT_FAILURE ;
       /*indiquer que les autres pointeurs de lignes correspondent au début des autres lignes de la matrice*/
       //for ( int i = 1 ; i < dim1 ; ++i )
     
       for ( i = 0 ; i < dim1 ; ++i)
       m_in[i] = m_in[i-1] + dim2 ;
     
       {
          for (j = 0 ; j < dim2 ; ++j)
     
          m_in[i][j] = (TYPE)(10*i+j);
       }
     
       for ( i = 0 ; i < dim1 ; ++i)
       {
          for ( j = 0 ; j < dim2 ; ++j )
          printf( " m_in[%d][%d] = %g \n" , i, j, (double)m_in[i][j] ) ;
       }
       printf(" ") ;
       v_out[dim] = **m_in ;                         // là le vecteur v_out est équivalent à la matrice m_in
       //debut des verifications
     
       printf( " On fait les verifications : " ) ;
       printf( " pour m_in  : %p \n", m_in  ) ;
       printf( " pour *m_in : %p \n", *m_in ) ;
       printf( " pour v_out : %p \n", v_out ) ;
       puts ( " OK pour les adresses \n" );
       for ( i = 0 ; i < dim ; ++i )
          printf( " v_out[%d] = %g \n" , i, (double)v_out[i] );
       puts ( " OK aussi pour les valeurs \n" ) ;
       // fin des verifications
     
     
    //free( *m_in ) ;
    //free( m_in ) ;
    return v_out[dim];
    }
    voici ce que le compilateur m'affiche:


    Compiling: C:\Users\OLGA\Desktop\fonctiontransfmatvect.c
    Linking console executable: C:\Users\OLGA\Desktop\fonctiontransfmatvect.exe
    Process terminated with status 0 (0 minutes, 6 seconds)
    0 errors, 0 warnings

    Checking for existence: C:\Users\OLGA\Desktop\fonctiontransfmatvect.exe
    Executing: C:\Program Files\CodeBlocks/cb_console_runner.exe "C:\Users\OLGA\Desktop\fonctiontransfmatvect.exe" (in C:\Users\OLGA\Desktop)
    Process terminated with status -1073741510 (0 minutes, 14 seconds)


    Merci de bien vouloir m'aider. Cordialement,

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_in = (MATRIX) malloc( dim1 * sizeof(VECTOR) );
    Ce qui prouve que m_in ne devrait pas être un paramètre de la fonction puisqu'on écrase immédiatement la valeur passée au paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       for ( i = 0 ; i < dim1 ; ++i)
       m_in[i] = m_in[i-1] + dim2 ;
    m_in[i-1] n'existe pas pour i==0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       {
          for (j = 0 ; j < dim2 ; ++j)
     
          m_in[i][j] = (TYPE)(10*i+j);
       }
    Pourquoi les { et } ? Pour faire joli ?
    L'élément v_out[dim] n'existe pas.
    ....

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    J'ai juste survolé mais il y a des choses bizarres, e.g. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       for ( i = 0 ; i < dim1 ; ++i)
       m_in[i] = m_in[i-1] + dim2 ;
     
       {
          for (j = 0 ; j < dim2 ; ++j)
     
          m_in[i][j] = (TYPE)(10*i+j);
       }
    es-tu sûre de savoir ce que ça fait? Tu es d'accord que les accolades ne servent à rien?

    Ah, grillé par diogene, comme souvent, du coup j'ajoute un petit commentaire pour préciser un tout petit peu :
    Après le premier for "i" est égal à "dim1", du coup dès que tu rentres dans le second "m_in[i][j] = ..." va provoquer une erreur de segmentation puisque tu vas chercher à écrire hors des dimensions du tableau.
    Mais bon il y a encore pas mal de choses qui posent problème. Essaye de procéder petit à petit.

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut
    j'ai revu le code grâce à vos commentaires.
    voici le nouveau 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
    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
     
    #include <stdio.h>// pour les printf et puts
    #include <stdlib.h>// pour les malloc et free
    //#include <time.h>
    //#include <math.h>
    typedef double TYPE ;
    typedef TYPE *VECTOR ;
    typedef TYPE **MATRIX ;
    // transformation d'une matrice en vecteur
    double fmv(int dim1, int dim2);
    int main()
    {
    int const dimens1 = 4 , dimens2= 2 ;// on définit les dimensions de la matrice.
    int dimens= dimens1*dimens2;
     
    MATRIX mat_in;// matrice de départ
    VECTOR vect_out; //double *vect_out ;
    int i, j;
    //int i, j; // les indices des boucles.
     
    *vect_out = fmv(dimens1, dimens2);// incompatible types when assigning to type 'double *' from type 'double'
    return 0;
    }
     
    double fmv(int dim1, int dim2)
    {
    int i, j;
    int dim = dim1*dim2;
    VECTOR v_out;// vecteur à réccupérer
    MATRIX m_in;// matrice de depart
    puts ( " Matrice ==> Vecteur \n" ) ;
    // on va créer une matrice et la remplir par des valeurs reconnaissables
    m_in = (MATRIX) malloc( dim1 * sizeof(VECTOR) );
       if ( NULL == m_in )
       return EXIT_FAILURE ;
    *m_in = (VECTOR) malloc(dim * sizeof(TYPE));
       if ( NULL == *m_in )
       return EXIT_FAILURE ;
       /*indique que les autres pointeurs de lignes csorrespondent au début des autres lignes de la matrice*/
       for ( i = 1 ; i < dim1 ; ++i )
       m_in[i] = m_in[i-1] + dim2 ;
     
       for ( i = 0 ; i < dim1 ; ++i)
       {
          for (j = 0 ; j < dim2 ; ++j)
     
          m_in[i][j] = (TYPE)(10*i+j);
       }
     
     
           for ( i = 0 ; i < dim1 ; ++i)
            {
                for ( j = 0 ; j < dim2 ; ++j )
                printf( " m_in[%d][%d] = %g \n" , i, j, (double)m_in[i][j] ) ;
            }
    printf(" ") ;
     
     
       v_out = *m_in ; // là le vecteur v_out est équivalent à la matrice m_in
       //debut des verifications
     
       printf( " On fait les verifications : " ) ;
       printf( " pour m_in  : %p \n", m_in  ) ;
       printf( " pour *m_in : %p \n", *m_in ) ;
       printf( " pour v_out : %p \n", v_out ) ;
       puts ( " OK pour les adresses \n" );
       for ( i = 0 ; i < dim ; ++i )
          printf( " v_out[%d] = %g \n" , i, (double)v_out[i] );
       puts ( " OK aussi pour les valeurs \n" ) ;
       // fin des verifications
     
    free( *m_in ) ;
    free( m_in ) ;
    return *v_out;
    }
    En compilant j'obtient

    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
     
    stagiaire@amaltee /mnt/manille/sdb2/stages/stagiaire $ gcc func1.c -o func1.out
    stagiaire@amaltee /mnt/manille/sdb2/stages/stagiaire $ ./func1.out
     Matrice ==> Vecteur 
     
     m_in[0][0] = 0 
     m_in[0][1] = 1 
     m_in[1][0] = 10 
     m_in[1][1] = 11 
     m_in[2][0] = 20 
     m_in[2][1] = 21 
     m_in[3][0] = 30 
     m_in[3][1] = 31 
      On fait les verifications :  pour m_in  : 0x602010 
     pour *m_in : 0x602040 
     pour v_out : 0x602040 
     OK pour les adresses 
     
     v_out[0] = 0 
     v_out[1] = 1 
     v_out[2] = 10 
     v_out[3] = 11 
     v_out[4] = 20 
     v_out[5] = 21 
     v_out[6] = 30 
     v_out[7] = 31 
     OK aussi pour les valeurs 
     
    Segmentation fault
    Segmentation default revient toujours.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    C'est un problème de type : la fonction "fmv" est sensée renvoyer un double mais elle renvoie "*v_out" (avec v_out de type VECTOR)

    Si tu remplaces le type le type de "fmv" par VECTOR et que tu renvoies "v_out" qui sera récupéré par la variable "vect_out" dans ton "main" tu ne devrais plus avoir de problème

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 705
    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 : 4 705
    Par défaut
    Tu peux regarder ce lien pour t'aiguiller

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut
    Merci beaucoup le code marche quand j'ai insérer vos remarques.
    A++

Discussions similaires

  1. transformer matrice en vecteur
    Par Nab18 dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/04/2013, 19h07
  2. Réponses: 4
    Dernier message: 09/05/2012, 15h35
  3. programme qui fait des opérations sur la matrices
    Par nomadstorm dans le forum Débuter
    Réponses: 6
    Dernier message: 07/01/2010, 00h05
  4. Transformation matrice en vecteur
    Par mihaispr dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/05/2009, 13h51
  5. Réponses: 18
    Dernier message: 24/07/2006, 20h30

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