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 :

Structure de donnée, passage par adresse, faute de segmentation


Sujet :

C

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut Structure de donnée, passage par adresse, faute de segmentation
    Bonjour,

    je fais un exercice avec des pointeurs sur structure. Je passe tout par adresse, mais j'ai une faute de segmentation dès la première instruction du main; c'est à dire l'initialisation. Peut être pourrez vous me dire ce qui ne va pas.
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    /*
     * Le but de cet exercice est de creer une structure et les
     * fonctions sur une matrice 2x2.                          
     * Les fonctions seront en particulier :                   
     *  - Une fonction somme de deux matrices                  
     *  - Une fonction produit de deux matrices                
     *  - Une fonction determinant de la matrice               
     *  - Une procedure d'affichage                            
     *                                                         
     * Les fonctions devront utiliser le passage par adresse dans tous les
     * cas.                                                               
     */                                                                   
     
    #include <stdio.h>
    #include <stdlib.h>
     
    /* definition de la structure matrice 2x2*/
     
    typedef struct matrix {
        double a,b,c,d ;   
    } matrix ;             
     
    /* prototype d'initialisationd de matrice */
    void matrix_init(matrix * M1 , double , double, double, double) ;
     
    /* prototype de la somme de deux matrices */
    void matrix_sum( matrix * M1, matrix * M2 , matrix * M3 ) ;
     
    /* prototype du produit de deux matrices */
    void matrix_prod( matrix * M1 , matrix * M2 , matrix * M3 ) ;
     
    /* prototype du determinant d'une matrice */
    double matrix_det( matrix * M1 ) ;          
     
    /* prototype de la procedure d'affichage d'une matrice */
    void matrix_disp( matrix * M1 ) ;                        
     
    int main(void)
    {             
        /* declaration des deux matrices */
        matrix * M1 ;                      
        matrix * M2 ;                      
        matrix * M3 ;                      
     
        /* initialisation des deux matrices */
        matrix_init(M1, 1, 2, 3, 4 ) ;        
        matrix_init(M2, 1, 2, 3, 4 ) ;        
     
        /* affichage des deux matrices */
        matrix_disp(M1) ;                
        matrix_disp(M2) ;                
     
        /* addition des deux matrices */
        matrix_sum( M1 , M2 , M3 ) ;    
        matrix_disp( M3 ) ;             
     
        /* produit des deux matrices */
        matrix_prod( M1 , M2 , M3 ) ;  
        matrix_disp( M3 ) ;            
     
        /* determinant de la matrice */
        double determinant = matrix_det( M1 ) ;
        printf("le determinant est %lf\n", determinant ) ;
     
        /* fin du programme */
        return 0 ;            
    }                         
     
    void matrix_init( matrix * M1, double a, double b, double c, double d)
    {
        M1->a = a ;
        M1->b = b ;
        M1->c = c ;
        M1->d = d ;
    }
     
    void matrix_sum(matrix * M1 , matrix * M2 , matrix * M3)
    {
        M3->a = (M1->a) + (M2->a) ;
        M3->b = (M1->b) + (M2->b) ;
        M3->c = (M1->c) + (M2->c) ;
        M3->d = (M1->d) + (M2->d) ;
    }
     
    void matrix_prod(matrix * M1 , matrix * M2 , matrix * M3)
    {
        M3->a = (M1->a)*(M2->a) + (M1->b)*(M2->c) ;
        M3->b = (M1->a)*(M2->b) + (M1->b)*(M2->d) ;
        M3->c = (M1->c)*(M2->a) + (M1->d)*(M2->c) ;
        M3->d = (M1->c)*(M2->b) + (M1->d)*(M2->d) ;
    }
     
    double matrix_det(matrix * M1 )
    {
        double determinant ;
        determinant = (M1->a)*(M1->d) - (M1->b)*(M1->c) ;
        return determinant ;
    }
     
    void matrix_disp(matrix * M1)
    {
        printf(" ( %.1lf %.1lf ) \n ( %.1lf %.1lf ) \n",
               (M1->a) , (M1->b) , (M1->c) , (M1->d) );
    }
    Merci de bien vouloir m'aider, cordialement.

  2. #2
    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 kromartien Voir le message
    je fais un exercice avec des pointeurs sur structure. Je passe tout par adresse, mais j'ai une faute de segmentation dès la première instruction du main; c'est à dire l'initialisation. Peut être pourrez vous me dire ce qui ne va pas.
    Tu peux commencer par corriger ceci :
    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
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\main.c:63: warning: ISO C90 forbids mixed declarations and code
    C:\dev\hello\main.c:64: warning: ISO C90 does not support the `%lf' printf format
    C:\dev\hello\main.c:42: warning: 'M1' might be used uninitialized in this function
    C:\dev\hello\main.c:43: warning: 'M2' might be used uninitialized in this function
    C:\dev\hello\main.c:44: warning: 'M3' might be used uninitialized in this function
    C:\dev\hello\main.c: In function `matrix_disp':
    C:\dev\hello\main.c:104: warning: ISO C90 does not support the `%lf' printf format
    C:\dev\hello\main.c:104: warning: ISO C90 does not support the `%lf' printf format
    C:\dev\hello\main.c:104: warning: ISO C90 does not support the `%lf' printf format
    C:\dev\hello\main.c:104: warning: ISO C90 does not support the `%lf' printf format
    Output size is 20.70 KB
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 9 warnings
    et lire cela :

    http://emmanuel-delahaye.developpez....difie_variable

    Correction faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     ( 1.0 2.0 )
     ( 3.0 4.0 )
     ( 1.0 2.0 )
     ( 3.0 4.0 )
     ( 2.0 4.0 )
     ( 6.0 8.0 )
     ( 7.0 10.0 )
     ( 15.0 22.0 )
    le determinant est -2.000000
     
    Process returned 0 (0x0)   execution time : 0.046 s
    Press any key to continue.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    Bonjour, j'ai résolu le problème. C'est en fait que je n'avais pas compris la consigne. Le texte demandait d'utiliser des passages par adresse, mais il faut l'utiliser à bon escient.
    Le code corrigé :
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    /*
     *                                           
     * Le but de cet exercice est de creer une structure et les
     * fonctions sur une matrice 2x2.                          
     * Les fonctions seront en particulier :                   
     *  - Une fonction somme de deux matrices                  
     *  - Une fonction produit de deux matrices                
     *  - Une fonction determinant de la matrice               
     *  - Une procedure d'affichage                            
     *                                                         
     * Les fonctions devront utiliser le passage par adresse dans tous les
     * cas.                                                               
     */                                                                   
     
    #include <stdio.h>
    #include <stdlib.h>
     
    /* definition de la structure matruce 2x2*/
     
    struct matrix {
        double a,b,c,d ;
    } ;                 
     
    typedef struct matrix matrix ;
     
    /* prototype d'initialisationd de matrice */
    void matrix_init(matrix * , double , double, double, double) ;
     
    /* prototype de la somme de deux matrices */
    void matrix_sum( matrix , matrix , matrix *  ) ;
     
    /* prototype du produit de deux matrices */
    void matrix_prod( matrix , matrix , matrix * ) ;
     
    /* prototype du determinant d'une matrice */
    double matrix_det( matrix ) ;               
     
    /* prototype de la procedure d'affichage d'une matrice */
    void matrix_disp( matrix ) ;                             
     
    int main(void)
    {             
        /* declaration des variables */
        matrix M1 ;                    
        matrix M2 ;                    
        matrix M3 ;                    
        double determinant ;           
     
        /* initialisation des deux matrices */
        matrix_init(&M1, 1, 2, 3, 4 ) ;       
        matrix_init(&M2, 1, 2, 3, 4 ) ;       
     
        /* affichage des deux matrices */
        printf("matrice M1\n") ; matrix_disp(M1) ;
        printf("matrice M2\n") ; matrix_disp(M2) ;
     
        /* addition des deux matrices */
        matrix_sum( M1 , M2 , &M3 ) ;   
        printf("somme des deux matrices \n") ; matrix_disp( M3 ) ;
     
        /* produit des deux matrices */
        matrix_prod( M1 , M2 , &M3 ) ; 
        printf("produit des deux matrices \n") ; matrix_disp( M3 ) ;
     
        /* determinant de la matrice */
        determinant = matrix_det( M1 ) ;
        printf("le determinant de M1 est %lf\n", determinant ) ;
     
        /* fin du programme */
        return 0 ;            
    }                         
     
    void matrix_init( matrix * M1, double a, double b, double c, double d)
    {
        M1->a = a ;
        M1->b = b ;
        M1->c = c ;
        M1->d = d ;
    }
     
    void matrix_sum(matrix M1 , matrix M2 , matrix * M3)
    {
        M3->a = (M1.a) + (M2.a) ;
        M3->b = (M1.b) + (M2.b) ;
        M3->c = (M1.c) + (M2.c) ;
        M3->d = (M1.d) + (M2.d) ;
    }
     
    void matrix_prod(matrix M1 , matrix M2 , matrix * M3)
    {
        M3->a = (M1.a)*(M2.a) + (M1.b)*(M2.c) ;
        M3->b = (M1.a)*(M2.b) + (M1.b)*(M2.d) ;
        M3->c = (M1.c)*(M2.a) + (M1.d)*(M2.c) ;
        M3->d = (M1.c)*(M2.b) + (M1.d)*(M2.d) ;
    }
     
    double matrix_det(matrix M1 )
    {
        double determinant ;
        determinant = (M1.a)*(M1.d) - (M1.b)*(M1.c) ;
        return determinant ;
    }
     
    void matrix_disp(matrix M1)
    {
        printf("\n (   %.1lf   %.1lf   ) \n (   %.1lf   %.1lf   ) \n\n",
               (M1.a) , (M1.b) , (M1.c) , (M1.d) );
    }
    Bon, désolé pour les %lf. Emmanuel Delahaies, je m'autorise à faire du C99, est ce que ça pose un problème ? En fait, je pense que le C90 est meilleur d'un point de vue de l'organisation du code, mais j'utilise tout de même les %lf. Merci beaucoup.

  4. #4
    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 kromartien Voir le message
    Bon, désolé pour les %lf. Emmanuel Delahaies, je m'autorise à faire du C99, est ce que ça pose un problème ? En fait, je pense que le C90 est meilleur d'un point de vue de l'organisation du code, mais j'utilise tout de même les %lf. Merci beaucoup.
    En C99, "%lf" est toléré, mais le bon formateur est bel est bien "%f" quelque soit la version du C.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/12/2006, 17h46
  2. passage par adresse
    Par gloubig dans le forum C++
    Réponses: 1
    Dernier message: 20/05/2006, 06h35
  3. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29
  4. passage par adresse
    Par cari dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/02/2006, 11h33
  5. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 10h05

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