2016-05-26 1 views
-3

J'essaie de faire cette calculatrice intégrale dans la méthode de Simpson en programmation C, mais elle sort avec une erreur: erreur de segmentation (core dumped). J'ai googlé des choses à ce sujet et essayé le débogueur gdb, mais je n'ai rien obtenu.C programmin: Défaut de segmentation (core dumped)

revendications gdb: Programme reçu signal SIGSEGV, erreur de segmentation. 0x00000000004008f6 dans main()

Je ne suis pas un programmeur expert, je ne comprends pas sur les pointeurs et des trucs de ce genre.

Que signifie cette erreur? Comment puis-je le réparer? Que faut-il faire attention pour que je puisse l'empêcher de se produire/trouver l'erreur?

Merci à l'avance (:

#include<stdio.h> 
#include<math.h> 

double inta,suma; //value of the integral and a provisory value for it 
int a; //a sort of boolean 

double expo(double x) //the function to be integrated 
{ 
    return exp(-0.5 * pow(x,2)); 
} 


double integration(double min, double max, int division) //the process of integration 
{ 
    double step = (max - min)/(pow(2,division)); //define the number of steps 
    double fake_a; 
    fake_a = min; //a value thats equal to the minimum 
    int counter; // to count how many times the steps have been taken 
    counter = 1; 
    while(fake_a < max) 
    { 
     fake_a = fake_a + counter*step; //the first value of a 
     if(counter % 2 == 0) //even 
     { 
      suma = suma + 2*expo(fake_a); 
      counter++; 
     } 
     else //odd 
     { 
      suma = suma + 4*expo(fake_a); 
      counter++; 
     } 
    } 

    inta = suma + expo(min) + expo(max); //final value of the integral 
    counter = 1; //reset counter 
    return inta; 
} 

int main() 
{ 
    int N; //N of columns of matrix_inte 
    double matrix_inte[N][2]; //a matrix for the evaluating the integrals 
    a = 0; //boolean 
    double acc = pow(10,-6); //accuracy 
    N = 2; //length of the integral vector 
    int n_div; //number of divisions 
    double mn = -1.0; 
    double mx = 1.0; 
    n_div = 10; 
    //first values of the matrix 
    matrix_inte[1][1] = 0; 
    matrix_inte[2][1]= 1; 
    matrix_inte[1][2] = 0; 

    while(a=0) //main loop 
    { 
     for(int i=2;i<=N;i=i+1) //takes the differences of a vector[i] and vecotr[i-1] 
     { 
      double result; 
      result = fabs(matrix_inte[i][1]-matrix_inte[i-1][1]); 
      matrix_inte[i][2] = result; 
     } 

     for(int j = 1;j <= N; j = j + 1) 
     { 
      if(matrix_inte[j][2] > acc) //checks if there is any value greater than acc 
      { 
       n_div = n_div + 10; 
       N = N + 1; 
       inta = 0; 
       suma = 0; //readjusts the variables 
       integration(mn,mx,n_div); 
       matrix_inte[N][1] = inta; //recalculate the integral 
      }      
      else 
      { 
       printf("%f ", matrix_inte[j][1]); //shows the value of the integral 
       a = 1; //changes the boolean 
      } 
     } 
    } 
    return 0; 
} 
+0

Cela vous dérange de créer un [___MCVE___] (http://stackoverflow.com/help/mcve)? –

+4

Le débogueur vous dira facilement où l'accident se produit. C'est peut-être là que vous accédez au troisième élément d'un tableau de 2 éléments, même avant la boucle. – chris

+1

... et aussi 'N' n'est pas initialisé lorsque vous utilisez' double matrix_inte [N] [2]; '. –

Répondre

2

Que diriez-vous de lire les messages du compilateur

while(a = 0){ … } 

est une déclaration sans effet à votre boucle, car il attribue a d'avoir une valeur de 0, ce qui n'est pas une vérification de condition pour votre boucle Vous devriez avoir probablement utilisé l'opérateur de comparaison d'égalité while(a == 0){ … }
Plus loin, 2 est passé le e nd du tableau double matrix_inte[N][2].

matrix_inte[1][2] = 0; 

et ainsi est ici, mais N est jamais initialisés.

matrix_inte[i][2] = result; 

Espérons que cela peut aider.

+0

La chose que j'ai comprise, c'était une erreur de frappe. Je n'ai pas compris les autres. Pourquoi est-ce que 2 a dépassé la fin du tableau? Il a N lignes et 2 colonnes, donc j'ai pensé que matrix_inte [1] [2] signifierait la première ligne et la deuxième colonne. Pourquoi N n'est jamais initialisé? Comme je l'ai dit, je suis nouveau dans la programmation et même «plus récent» dans la programmation en C, je ne comprends pas encore grand-chose. –

+0

Désolé pour la réponse tardive.Si le tableau a deux colonnes, celles-ci sont indexées comme [0] et [1]. Un élément indexé avec [2] serait déjà une "troisième colonne". Les tableaux de longueur variable sont facultatifs dans C11, donc il pourrait être plus sûr 'int N = 2; double matrix_inte [N] [2]; 'et active tous les avertissements dans le compilateur. – user3078414