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


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut Erreur de segmentation
    Bonjour,

    Mon code plante a la ligne 78 a cause de la fonction Multimatrice() qui multiplie une matrice carre et une matrice colonne.
    Cette fonction prend en parametre un tableau 2D, 1D et la taille. Puis je retourne un tableau 1D dans u[].
    J'ai ce probleme de segmentation et je ne comprend pas l'erreur ?

    La grande fonction main :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <math.h>
     
    #include "Inverseur.h"
    #include "Multimatrice.h"
    #include "alloc2D.h"
    #include "free2D.h"
     
     
    struct Parametre
    {
      double Longueur;
      int Nbrepoints;
      int tend;
      double Re;
    };
     
    int main(void)
    {
      struct Parametre p = {4.,81,2,1.};
     
      double dx = p.Longueur/(p.Nbrepoints-1);
      double dt = dx/2.;
      double a = -dt/(p.Re*pow(dx,2));
      double b = 1+2*dt/(p.Re*pow(dx,2));
      double c = -dt/(p.Re*pow(dx,2));
      /**
         dynamic allocation table
      */
      double*x=NULL,*B=NULL, *u=NULL;	
      x= calloc(p.Nbrepoints,sizeof(double));
      u= calloc(p.Nbrepoints,sizeof(double));
      B= calloc(p.Nbrepoints, sizeof(double));
     
      /**
         initial exponential elevation
      */
     
      for(int i=0; i<p.Nbrepoints-1;i++)
          x[i+1] = x[i] + dx;
     
      for(int i =0; i<p.Nbrepoints-1;i++)
        u[i]=1.*exp(-(pow(x[i]-1.,2)/0.1));
      /** 
          Velocity Boundaries Conditions 
      */
      u[0]=0.;
      u[p.Nbrepoints-1]=0.;
     
      /** 
          Matrice B (table 1D)
      */
      for (int i=1;i<p.Nbrepoints-1;i++)
        B[i] = (u[i]*dt/dx)*(u[i-1]-u[i])+u[i];
      B[0] = u[0];
      B[p.Nbrepoints-1] = u[p.Nbrepoints-1];
    /**
       Matrice inverse
    */
      double ** Ainv;
      Ainv = arr_alloc(p.Nbrepoints, p.Nbrepoints);
      Ainv = Matrice(&p.Nbrepoints, &a, &b, &c);
     
    /**
       begin the time loop
    */
      FILE *fic = fopen("data.txt", "w");
      fprintf(fic, "%s %s %s\n", "#x", "#u", "#t");
     
      double t=0.;
      while(t<=p.tend){
        for(int i=0;i<p.Nbrepoints;i++)
          fprintf(fic, "%g %g %g\n", x[i], u[i], t);
        fflush(fic);
        u=Multimatrice(Ainv, B, u, &p.Nbrepoints);
        for (int i=1;i<p.Nbrepoints-1;i++)
          B[i] = (u[i]*dt/dx)*(u[i-1]-u[i])+u[i];
        B[0] = u[0] = 0.;
        B[p.Nbrepoints-1] = u[p.Nbrepoints-1] = 0.;
        fprintf(fic,"\n\n");
        t+=dt;
      }
     
      free(x);
      free(u);
      free(B);
      fclose(fic);
      arr_free(Ainv, p.Nbrepoints, p.Nbrepoints);
      return 0;
    }
    La fonction arr_alloc qui alloue le bloc memoire pour un tableau 2D:

    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 <stdlib.h>
    #include <assert.h>
    #include "alloc2D.h"
    double** arr_alloc (size_t x, size_t y)
    {
      double** pp = calloc(x,sizeof(*pp));
      assert(pp != NULL);
      for(size_t i=0; i<x; i++)
      {
        pp[i] = calloc(y,sizeof(**pp));
        assert(pp[i] != NULL);
      }
     
      return pp;
    }
    La fonction Multimatrice source de l'erreur :

    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 <stdlib.h>
    #include "Multimatrice.h"
     
    double *Multimatrice(double **mat1, double *mat2, double *U, int *taille){
      int n = *taille;
      for(int i = 0; i < n; i++)
        {
    	for(int k = 0; k < n; k++)
    	{
    	   	U[i] += mat1[i][k] * mat2[k];
    	}	
        }
      return U;
    }


    Lorsque je compile :

    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
     
    (base) alexandre@alexandre-Latitude-E7270:~/Gitlab/finite-difference/1D/Burger$ gcc -g *.c -o prog -lm
    (base) alexandre@alexandre-Latitude-E7270:~/Gitlab/finite-difference/1D/Burger$ ./prog gbd
    Erreur de segmentation (core dumped)
    (base) alexandre@alexandre-Latitude-E7270:~/Gitlab/finite-difference/1D/Burger$ gdb
    GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
    Copyright (C) 2018 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.
    For help, type "help".
    Type "apropos word" to search for commands related to "word".
    (gdb) run
    Starting program:  
    No executable file specified.
    Use the "file" or "exec-file" command.
    (gdb) file prog
    Reading symbols from prog...done.
    (gdb) run
    Starting program: /home/alexandre/Gitlab/finite-difference/1D/Burger/prog 
     
    Program received signal SIGSEGV, Segmentation fault.
    0x0000555555555842 in Multimatrice (mat1=0x555555764c30, mat2=0x555555757780, 
        U=0x5555557574f0, taille=0x7fffffffdb88) at Multimatrice.c:11
    11		   	temp[i] += mat1[i][k] * mat2[k];
    Je suis ouvert a vos conseils car je debut depuis peu en c. Je sais que mon main est horrible mais je l'ameliorais dans un deuxieme temps lorsque que mon code tournera.
    Je vous en remercie !

    Si besoin voici un lien vers mon gitlab avec tous les fichiers : https://gitlab.com/v_alexandre/finit...ster/1D/Burger

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut
    Re-Bonjour,

    Dsl pour le derangement mais j'ai trouver l'erreur.
    Mon probleme venait de la fonction Matrice qui renvoyait rien.
    C'etait un probleme de retour de matrice qui etait renvoye dans un la matrice donne en parametre.
    Bref du coop je n'ai plus le probleme de segmentation.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Ton code est trop lourd tu n'as pas besoin de double étoile X** : parce que pour chaque ligne, le "nombre de colonnes" est le même.
    Donc 1 tableau de tableaux ne se justifie pas

    Tu peux créer 1 tableau d'1 ligne (et c'est comme cela que le C gère les tableaux multi-dimensions) de taille nb_lines * nb_columns et en y accédant à l'élément [i][j] (j*nb_columns + i).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      double ** Ainv;
      Ainv = arr_alloc(p.Nbrepoints, p.Nbrepoints);
      Ainv = Matrice(&p.Nbrepoints, &a, &b, &c);
    C'est quoi la fonction Matrice ? parce que tu écrases ton pointeur fraîchement créé par "quelque chose"


    Édit : Après, mais il manque des détails, il faut encapsuler les données dans des structures pour 1 meilleur code
    D'abord 1 classe matrice avec 1 pointeur et le nombre de lignes et de colonnes.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Suntory Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    u= calloc(p.Nbrepoints,sizeof(double));
    u=Multimatrice(Ainv, B, u, &p.Nbrepoints);
    Super dangereux ça. Ok la fonction Multimatrice() retourne le "u" reçu et resté inchangé (style "one again je le lache et je le rattrappe") mais ça n'aide pas à la lecture.
    Et bien entendu la remarque de foetus reste primordiale. Chaque fois que tu écriras var=truc puis, sans avoir utilisé var, que tu écriras en dessous var=autre_truc ce sera au mieux un signe de mauvaise conception et de mauvaise compréhension des choses et au pire (comme ici) une source de bug.

    Citation Envoyé par Suntory Voir le message
    Bref du coop je n'ai plus le probleme de segmentation.
    Ce n'est pas une garantie de code sans erreur. Voire même tout le contraire car au-moins avec un segfault tu avais la preuve de l'existence d'un souci, là tu n'as plus la preuve de rien et vu ce qu'on a lu de ton code...
    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