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 :

Erreur de segmentation lorsque je change la taille du tableau


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut Erreur de segmentation lorsque je change la taille du tableau
    Bonjour,

    J'ai créer un programme qui calcule le produit matricie et vecteur

    Voilà mon programme de test :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    typedef int matrice [1000][1000];
    void remplissage_matrice (matrice mat , int n)
    {
    	int i ;
    	int j ;
     
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            {
             mat[i][j]=(rand()%10);
            }
    }	
     
    void afficher_matrice (matrice mat , int n)
    {
    	int i ;
    	int j ;
    	printf("affichage de  matrice \n");
    	 for (i=0; i<n; i++)
        {
         for (j=0; j<n; j++)
         printf("%d ",mat[i][j]);
         printf("\n");}
     
    }
    void remplissage_vecteur (int vecteur[] , int n)
    {
    	int i ;
     
    	 for (i=0; i<n; i++)
    	 {
    		vecteur[i]=(rand()%10);
    	 }
    }	
    void afficher_vecteur (int vecteur[] , int n)
    {
    	int i ;
    	printf("affichage de vecteur \n");
    	 for (i=0; i<n; i++)
    	 {
    		 printf("%d", vecteur[i]);
    		 printf("\n");
    	 }
    }
    void produit ( matrice mat ,int vecteur[], int n)
    {
    int i ;
    int j ;
    int k ;
    int z ;
    int x ;
    matrice p;
    for (i=0; i<n; i++)
    {    
             for (j=0; j<n; j++)
            { p[i][j]=0;
                  p[i][j]+=mat[i][j]*vecteur[j];   }        
     
    }
    printf("affichage de produit de matrice par vecteur \n");
    	 for (z=0; z<n; z++)
        {
         for (x=0; x<n; x++)
         printf("%d ",p[z][x]);
         printf("\n");}
     
     
     
    }
    int main(void)
    {
    int n=1000;
    matrice A; /* matrice donnée   */
    int v[n] ;    /* vecteur donné */
    remplissage_matrice(A,n);
    remplissage_vecteur(v,n);
    afficher_matrice(A,n);
    afficher_vecteur(v,n);
    int timer=0;
    produit(A,v,n);
    timer=clock();
    printf("temp d'exectuion = %d ms \n",timer);
    }
    Ca marche si je met la taille à 1000 mais si je met 5000 comme taille j'ai une erreur de segmentation .Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Et comment mets-tu la taille de 1000 à 5000 ? Quel(s) élément(s) du code changes-tu ?

    EDIT : après quelques essais, je pense que le problème vient du fait que ta matrice est déclarée sur la pile. Quand tu augmentes la taille, tu dois faire un stack overflow. Il faut soit la déclarer à l'extérieur du main(), soit passer par une allocation dynamique.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse

    Et comment mets-tu la taille de 1000 à 5000 ? Quel(s) élément(s) du code changes-tu ?
    je change ces deux lignes comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int matrice [5000][5000];
    J'ai déclaré la matrice au début du programme mais j'ai toujours le même problème.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il serait peut-être cool de faire un code comme 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
    #define SIZE    5000
     
    typedef int matrice [SIZE][SIZE];
     
    // ...
     
    int main()
    {
        // ...
     
        int n=SIZE;
     
        // ...
    }
    Ainsi, tu aurais un seul changement à faire et éviterait les risques de ne pas changer aux 3 endroits.

    J'ai déclaré la matrice au début du programme mais j'ai toujours le même problème.
    Une fois que c'est fait, tu dois avoir le même problème avec ton vecteur, et encore après avec la variable locale de type matrice dans ta fonction produit...

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    int v[n] ; est-ce que ta version supporte les VLA ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 551
    Points
    1 551
    Par défaut
    Citation Envoyé par Bousk Voir le message
    int v[n] ; est-ce que ta version supporte les VLA ?
    Oui, sinon le compilateur aurait râlé....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Il serait peut-être cool de faire un code comme 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
    #define SIZE    5000
     
    typedef int matrice [SIZE][SIZE];
     
    // ...
     
    int main()
    {
        // ...
     
        int n=SIZE;
     
        // ...
    }
    Ainsi, tu aurais un seul changement à faire et éviterait les risques de ne pas changer aux 3 endroits.


    Une fois que c'est fait, tu dois avoir le même problème avec ton vecteur, et encore après avec la variable locale de type matrice dans ta fonction produit...

    Bonjour Merci pour l'astuce de SIZE .
    J'essaye d'utiliser l'allocation dynamique avec malloc (c'est ma première expérience ), j'ai toujours des erreurs , mon programme est le suivant donc :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define SIZE 1000
     
    typedef int matrice [SIZE][SIZE];
    void remplissage_matrice (matrice mat , int n)
    {
    	int i ;
    	int j ;
    	matrice A; /* matrice donnée   */
    	int v[n] ;    /* vecteur donné */
     
    for (i=0; i<j; i++)
    A[i]=(int *) malloc(j*sizeof(int));
     
     
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            {
             mat[i][j]=(rand()%10);
            }
    }	
     
    void afficher_matrice (matrice mat , int n)
    {
    	int i ;
    	int j ;
    	printf("affichage de  matrice \n");
    	 for (i=0; i<n; i++)
        {
         for (j=0; j<n; j++)
         printf("%d ",mat[i][j]);
         printf("\n");}
     
    }
    void remplissage_vecteur (int vecteur[] , int n)
     
    for (i=0; i<j; i++)
    v[i]=(int *) malloc(j*sizeof(int));
    {
    	int i ;
     
    	 for (i=0; i<n; i++)
    	 {
    		vecteur[i]=(rand()%10);
    	 }
    }	
     
    void afficher_vecteur (int vecteur[] , int n)
    {
    	int i ;
    	printf("affichage de vecteur \n");
    	 for (i=0; i<n; i++)
    	 {
    		 printf("%d", vecteur[i]);
    		 printf("\n");
    	 }
    }
    void produit ( matrice mat ,int vecteur[], int n)
    {
    int i ;
    int j ;
    int k ;
    int z ;
    int x ;
    matrice p;
    for (i=0; i<n; i++)
    {    
             for (j=0; j<n; j++)
            { p[i][j]=0;
                  p[i][j]+=mat[i][j]*vecteur[j];   }        
     
    }
    printf("affichage de produit de matrice par vecteur \n");
    	 for (z=0; z<n; z++)
        {
         for (x=0; x<n; x++)
         printf("%d ",p[z][x]);
         printf("\n");}
     
    }
     
    int main(void)
    {
    int n=SIZE;
    remplissage_matrice(A,n);
    remplissage_vecteur(v,n);
    afficher_matrice(A,n);
    afficher_vecteur(v,n);
    int timer=0;
    produit(A,v,n);
    timer=clock();
    printf("temp d'exectuion = %d ms \n",timer);
    }

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par samirahal Voir le message
    J'essaye d'utiliser l'allocation dynamique avec malloc (c'est ma première expérience ), j'ai toujours des erreurs , mon programme est le suivant donc :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define SIZE 1000
     
    typedef int matrice [SIZE][SIZE];
    void remplissage_matrice (matrice mat , int n)
    {
    	int i ;
    	int j ;
    	matrice A; /* matrice donnée   */
    	int v[n] ;    /* vecteur donné */
     
    for (i=0; i<j; i++)
    A[i]=(int *) malloc(j*sizeof(int));
    Bonjour
    A est une matrice de 1000 * 1000 int. En fait, A est un tableau de 1000 items; et chaque item est un tableau de 1000 ints. Donc A[i] est le "i ième item" donc un tableau de 1000 ints. Et ça, c'est fixé une fois pour toute.
    Or en écrivant A[i]=autre_chose tu tentes de changer un truc bien établi et immuable.

    Si tu veux pouvoir allouer A[i] il te faut dire "A[i] est un pointeur" => int *A[1000] => déclaration de 1000 int étoiles où chaque A[i] pourra alors être alloué de façon indépendante.

    Mais si tu veux t'essayer au malloc, autant partir simple => int *A; A=malloc(1000 * sizeof(int)). Ensuite, tu pourras partir sur des tableaux de pointeurs.

    Par ailleurs il est très mauvais de masquer un tableau derrière un type. Ca rend ton programme illisible.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si tu fais de l'allocation dynamique, il faut complètement revoir ton type 'matrice'. Il te faut maintenant une fonction pour en créer une.

    Voir cette entrée dans la FAQ comme début : https://c.developpez.com/faq/?page=L...a-2-dimensions

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    5000 * 5000 * sizeof(int) c'est probablement trop pour la pile. Si ça fonctionne en statique avec 50 le crash vient probablement de là (à vérifier en compilant avec -fsanitize=address, par exemple).

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    5000 * 5000 * sizeof(int) c'est probablement trop pour la pile. Si ça fonctionne en statique avec 50 le crash vient probablement de là (à vérifier en compilant avec -fsanitize=address, par exemple).
    bonjour
    ca change rien .... je suis en train de lire le tuto sur l'allocation dynamique

  12. #12
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Qu'est-ce qui ne change rien ?

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Si tu fais de l'allocation dynamique, il faut complètement revoir ton type 'matrice'. Il te faut maintenant une fonction pour en créer une.

    Voir cette entrée dans la FAQ comme début : https://c.developpez.com/faq/?page=L...a-2-dimensions
    J'ai pas réussi a utiliser l'allocation dynamique , une idée SVP?

  14. #14
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par samirahal Voir le message
    J'ai pas réussi a utiliser l'allocation dynamique , une idée SVP?
    voilà cette version mais toujours Erreur de segmentation
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define SIZE 500
     
    typedef int matrice [SIZE][SIZE];
     
    int main(int argc, char **argv){   
     
      int nb, i , j, k;
     
      int t,start,stop;  
     
      int* matrice_A;
     
      int* matrice_B;
     
      int* matrice_res;
     
    // Allocations  
     
      matrice_A = (int*) malloc(SIZE*SIZE*sizeof(int)) ; 
     
      matrice_B = (int*) malloc(SIZE*sizeof(int)) ;
     
      matrice_res = (int*) malloc(SIZE*SIZE*sizeof(int)) ; 
     
     
     
      for(i = 0; i < SIZE; i++){
     
        for(j = 0; j < SIZE; j++){
     
          matrice_A[i*SIZE + j] = (int)rand()/(int)RAND_MAX;
     
          matrice_B[i*SIZE + j] = (int)rand()/(int)RAND_MAX; 
     
        }
     
      }
     
    void remplissage_matrice (matrice matrice_A , int n)
    {
    	int i ;
    	int j ;
     
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            {
             matrice_A[i][j]=(rand()%10);
            }
    }	
     
    void afficher_matrice (matrice matrice_A , int n)
    {
    	int i ;
    	int j ;
    	printf("affichage de  matrice \n");
    	 for (i=0; i<n; i++)
        {
         for (j=0; j<n; j++)
         printf("%d ",matrice_A[i][j]);
         printf("\n");}
     
    }
     
    void remplissage_vecteur (int vecteur[] , int n)
    {
    	int i ;
     
    	 for (i=0; i<n; i++)
    	 {
    		vecteur[i]=(rand()%10);
    	 }
    }	
    void afficher_vecteur (int vecteur[] , int n)
    {
    	int i ;
    	printf("affichage de vecteur \n");
    	 for (i=0; i<n; i++)
    	 {
    		 printf("%d", vecteur[i]);
    		 printf("\n");
    	 }
    }
     
    void produit ( matrice matrice_A ,int vecteur[], int n)
    {
     
    int z ;
    int x ;
    matrice p;
    for (i=0; i<n; i++)
    {    
             for (j=0; j<n; j++)
            { p[i][j]=0;
                  p[i][j]+=matrice_A[i][j]*vecteur[j];   }        
     
    }
    printf("affichage de produit de matrice par vecteur \n");
    	 for (z=0; z<n; z++)
        {
         for (x=0; x<n; x++)
         printf("%d ",p[z][x]);
         printf("\n");}
     
    }
     
    int main(void)
    {
    int n=SIZE;
    matrice A; /* matrice donnée   */
    int v[n] ;    /* vecteur donné */
    remplissage_matrice(A,n);
    remplissage_vecteur(v,n);
    afficher_matrice(A,n);
    afficher_vecteur(v,n);
    int timer=0;
    produit(A,v,n);
    timer=clock();
    printf("temp d'exectuion = %d ms \n",timer);
     
    }
    }

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par samirahal Voir le message
    voilà cette version mais toujours Erreur de segmentation
    Si tu avais indenté proprement ton code, tu aurais vu qu'il est composé d'un gros "main()" qui encapsule toutes les autres fonctions (y compris une sous-fonction "main"). Je suis d'ailleurs étonné que ça compile mais le fait est que ça compile (enfin en enlevant tous les warnings).
    Sinon je te recommande de te concentrer sur la façon dont tu alloues "matrice_B" par opposition avec ta façon de la remplir car ton erreur est là.

    Et si t'es pas assez motivé pour écrire du code proprement indenté, ne t'étonne pas qu'on ne soit pas assez motivé pour prendre du temps à t'aider. Le C non seulement ça s'écrit pour que son code fasse ce que l'on attend mais aussi ça s'écrit pour être lu.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Bonsoir voilà le programme indenté

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define SIZE 500
     
    typedef int matrice [SIZE][SIZE];
     
    int main(int argc, char **argv) {
     
        int nb, i , j, k;
     
        int t,start,stop;
     
        int* matrice_A;
     
        int* vecteur;
     
        int* matrice_res;
     
    // Allocations
     
        matrice_A = (int*) malloc(SIZE*SIZE*sizeof(int)) ;
     
        vecteur = (int*) malloc(SIZE*sizeof(int)) ;
     
        matrice_res = (int*) malloc(SIZE*SIZE*sizeof(int)) ;
     
     
     
        for(i = 0; i < SIZE; i++) {
     
            for(j = 0; j < SIZE; j++) {
     
                matrice_A[i*SIZE + j] = (int)rand()/(int)RAND_MAX;
     
                matrice_B[i*SIZE + j] = (int)rand()/(int)RAND_MAX;
     
            }
     
        }
     
        void remplissage_matrice (matrice matrice_A , int n)
        {
            int i ;
            int j ;
     
            for (i=0; i<n; i++)
                for (j=0; j<n; j++)
                {
                    matrice_A[i][j]=(rand()%10);
                }
        }
     
        void afficher_matrice (matrice matrice_A , int n)
        {
            int i ;
            int j ;
            printf("affichage de  matrice \n");
            for (i=0; i<n; i++)
            {
                for (j=0; j<n; j++)
                    printf("%d ",matrice_A[i][j]);
                printf("\n");
            }
     
        }
     
        void remplissage_vecteur (int vecteur[] , int n)
        {
            int i ;
     
            for (i=0; i<n; i++)
            {
                vecteur[i]=(rand()%10);
            }
        }
        void afficher_vecteur (int vecteur[] , int n)
        {
            int i ;
            printf("affichage de vecteur \n");
            for (i=0; i<n; i++)
            {
                printf("%d", vecteur[i]);
                printf("\n");
            }
        }
     
        void produit ( matrice matrice_A ,int vecteur[], int n)
        {
     
            int z ;
            int x ;
            matrice p;
            for (i=0; i<n; i++)
            {
                for (j=0; j<n; j++)
                {   p[i][j]=0;
                    p[i][j]+=matrice_A[i][j]*vecteur[j];
                }
     
            }
            printf("affichage de produit de matrice par vecteur \n");
            for (z=0; z<n; z++)
            {
                for (x=0; x<n; x++)
                    printf("%d ",p[z][x]);
                printf("\n");
            }
     
        }
     
        int main(void)
        {
            int n=SIZE;
            matrice A; /* matrice donnée   */
            int v[n] ;    /* vecteur donné */
            remplissage_matrice(A,n);
            remplissage_vecteur(v,n);
            afficher_matrice(A,n);
            afficher_vecteur(v,n);
            int timer=0;
            produit(A,v,n);
            timer=clock();
            printf("temp d'exectuion = %d ms \n",timer);
     
        }
    }

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par samirahal Voir le message
    Bonsoir voilà le programme indenté
    Ouais. Et mes autres remarques ? Le fait que tu aies inclus toutes tes fonctions dans le main t'en fais quoi ? Tu sais au-moins que ça ne fonctionne pas ??? (je n'arrive même pas à imaginer comment ça compile et ce que comprend le compilo). Et l'allocation de "matrice_B" qui n'a pas changée !!! As-tu examiné en détails sa taille allouée par rapport à son remplissage ???

    Et fais attention à l'émoticon "roll" car c'est un émoticon d'insulte qui signifie grosso-modo "quel abruti celui-là" en désignant son interlocuteur (moi)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouais. Et mes autres remarques ? Le fait que tu aies inclus toutes tes fonctions dans le main t'en fais quoi ? Tu sais au-moins que ça ne fonctionne pas ??? (je n'arrive même pas à imaginer comment ça compile et ce que comprend le compilo). Et l'allocation de "matrice_B" qui n'a pas changée !!! As-tu examiné en détails sa taille allouée par rapport à son remplissage ???

    Et fais attention à l'émoticon "roll" car c'est un émoticon d'insulte qui signifie grosso-modo "quel abruti celui-là" en désignant son interlocuteur (moi)...
    Je suis vraiment désolé pour l'émoticon "roll" je sais pas la signification que tu as cité, j'ai changé matrice_B par vecteur car l'objectif du programme est un produit matrice vecteur
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define SIZE 500
     
    typedef int matrice [SIZE][SIZE];
     
    int main(int argc, char **argv) {
     
        int nb, i , j, k;
     
        int t,start,stop;
     
        int* matrice_A;
     
        int* vecteur;
     
        int* matrice_res;
     
    // Allocations
     
        matrice_A = (int*) malloc(SIZE*SIZE*sizeof(int)) ;
     
        vecteur = (int*) malloc(SIZE*sizeof(int)) ;
     
        matrice_res = (int*) malloc(SIZE*SIZE*sizeof(int)) ;
     
     
     
        for(i = 0; i < SIZE; i++) {
     
            for(j = 0; j < SIZE; j++) {
     
                matrice_A[i*SIZE + j] = (int)rand()/(int)RAND_MAX;
     
                vecteur [i*SIZE ] = (int)rand()/(int)RAND_MAX;
     
            }
     
        }
     
        void remplissage_matrice (matrice matrice_A , int n)
        {
            int i ;
            int j ;
     
            for (i=0; i<n; i++)
                for (j=0; j<n; j++)
                {
                    matrice_A[i][j]=(rand()%10);
                }
        }
     
        void afficher_matrice (matrice matrice_A , int n)
        {
            int i ;
            int j ;
            printf("affichage de  matrice \n");
            for (i=0; i<n; i++)
            {
                for (j=0; j<n; j++)
                    printf("%d ",matrice_A[i][j]);
                printf("\n");
            }
     
        }
     
        void remplissage_vecteur (int vecteur[] , int n)
        {
            int i ;
     
            for (i=0; i<n; i++)
            {
                vecteur[i]=(rand()%10);
            }
        }
        void afficher_vecteur (int vecteur[] , int n)
        {
            int i ;
            printf("affichage de vecteur \n");
            for (i=0; i<n; i++)
            {
                printf("%d", vecteur[i]);
                printf("\n");
            }
        }
     
        void produit ( matrice matrice_A ,int vecteur[], int n)
        {
     
            int z ;
            int x ;
            matrice p;
            for (i=0; i<n; i++)
            {
                for (j=0; j<n; j++)
                {   p[i][j]=0;
                    p[i][j]+=matrice_A[i][j]*vecteur[j];
                }
     
            }
            printf("affichage de produit de matrice par vecteur \n");
            for (z=0; z<n; z++)
            {
                for (x=0; x<n; x++)
                    printf("%d ",p[z][x]);
                printf("\n");
            }
     
        }
     
        int main(void)
        {
            int n=SIZE;
            matrice A; /* matrice donnée   */
            int v[n] ;    /* vecteur donné */
            remplissage_matrice(A,n);
            remplissage_vecteur(v,n);
            afficher_matrice(A,n);
            afficher_vecteur(v,n);
            int timer=0;
            produit(A,v,n);
            timer=clock();
            printf("temp d'exectuion = %d ms \n",timer);
     
        }
    }

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par samirahal Voir le message
    Je suis vraiment désolé pour l'émoticon "roll" je sais pas la signification que tu as cité, j'ai changé matrice_B par vecteur car l'objectif du programme est un produit matrice vecteur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vecteur = (int*) malloc(SIZE*sizeof(int)) ;
    for(i = 0; i < SIZE; i++) {
        for(j = 0; j < SIZE; j++) {
            vecteur [i*SIZE ] = (int)rand()/(int)RAND_MAX;
    Le nom on s'en fiche. Ce qui est vraiment important c'est ta façon de le remplir. Tu lui alloues "SIZE" int, et tu vas remplir la case [SIZE * i].
    Si "SIZE" vaut 5, tu alloues 5 int (qui pourront donc aller dans les cases vecteur[0], vecteur[1], vecteur[2], vecteur[3] et vecteur[4]) et tu vas remplir les cases vecteur[0], vecteur[5], vecteur[10], vecteur[15] et vecteur[20] !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  20. #20
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Et encore une fois : c'est quoi ce main() qui contient un main() ??

    EDIT : et je redis ce que j'ai déjà dit, fais toi une fonction pour créer et supprimer des matrices. Voici une possibilité :

    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
    #include <stdlib.h>
     
    typedef struct {
    	size_t size;
    	int* data;
    } Matrix;
     
    Matrix create_matrix(size_t size) {
    	// Create empty matrix
    	Matrix matrix = { 0, NULL };
     
    	// Allocate memoty
    	int* data = (int*) malloc(size * size * sizeof(int));
     
    	if (data != NULL) {
    		// Creation OK, fill matrix
    		matrix.data = data;
    		matrix.size = size;
    	} else {
    		// Nothing to do, matrix is already empty
    	}
     
    	// Return matrix
    	return matrix;
    }
     
    void destroy_matrix(Matrix* matrix) {
    	// Deallocate memory (works even if 'data' is NULL)
    	free(matrix->data);
     
    	// Indicate that matrix is no longer valid
    	matrix->size = 0;
    	matrix->data = NULL;
    }
     
    int main(int argc, char **argv) {
    	Matrix matrix = create_matrix(5000);
     
    	destroy_matrix(&matrix);
    }
    J'espère ne pas avoir fait d'erreur, je rouille avec l'allocation dynamique en C... Si le champ size te dérange, tu peux l'enlever et utiliser ton#define SIZE au lieu de data.size quand tu souhaites manipuler la matrice. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void fill_matrix(Matrix* matrix, int value) {
    	const size_t size = matrix->size;
     
    	for (size_t line; line <= size; line++) {
    		for (size_t col; col < size; col++) {
    			matrix->data[line * size + col] = value;
    		}
    	}
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define SIZE	50
     
    void fill_matrix(Matrix* matrix, int value) {
    	for (size_t line; line <= SIZE; line++) {
    		for (size_t col; col < SIZE; col++) {
    			matrix->data[line * SIZE + col] = value;
    		}
    	}
    }

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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