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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 actif
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    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 Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 765
    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é....

  7. #7
    Membre actif
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    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]

+ Répondre à la discussion
Cette discussion est résolue.

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