特定线路中的C分段故障

时间:2018-04-24 12:52:57

标签: segmentation-fault

你好我是新来的C,你可以理解。我用26 - 31行得到了一个分段错误。 我提到了falut从下面开始代码的地方。 我在this online c compiler中收到错误消息,并且代码块也没有说.exe文件正在停止。但是这段代码在DevC ++中完美运行。

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

int main() {
    int terim,s,z;
    int deger[terim][2];
    float alt_limit;
    float ust_limit;
    float toplam;
    float cikarma;

    printf("Denkleminizde kac adet terim var?\n");
    scanf("%d",&terim);

//#################
    for(s=0; s<terim; s++){  //----- segmentation fault begins
        printf("Lutfen %d. terimin katsayisini giriniz : ",s+1);
        scanf("%d",&deger[s][0]);
        printf("Lutfen %d. terimin us degerini giriniz:",s+1);
        scanf("%d",&deger[s][1]);
    }                          //----- segmentation fault ends



    printf("\nLutfen alt limit degerini giriniz\n>>:  ");
    scanf("%f",&alt_limit);
    printf("\nLutfen ust limit degerini giriniz\n>>:  ");
    scanf("%f",&ust_limit);


        cikarma = ust_limit - alt_limit;
        toplam = ust_limit + alt_limit;

    int tercih;

    printf("\n [ 1 ]  Rectangle Yontemi \n");
    printf("\n [ 2 ]  Midpoint Yontemi \n");
    printf("\n [ 3 ]  Trapezoid Yontemi \n");
    printf("\n [ 4 ]  Simpsons Yontemi \n");

    printf("Lutfen tercih ettiginiz yontemin numarasini tuslayiniz\n");
    scanf("%d",&tercih);

    float a_tabaninda , b_tabaninda , tplm_yarisi;
    float rec_sonuc,mid_sonuc;
    float trap_sonuc,simp_sonuc;

    a_tabaninda = pow(alt_limit,deger[z][1]);
    b_tabaninda = pow(ust_limit,deger[z][1]);
    tplm_yarisi = pow((alt_limit + ust_limit)/2,deger[z][1]);
    float zrec,zmid,ztrap,zsimp;
    switch(tercih){
        case 1:

            for(z=0; z<terim ;z++){


                rec_sonuc += ((deger[z][0])*pow(alt_limit,deger[z][1]));

            }

            zrec = (cikarma * rec_sonuc);
            printf("%.4f",fabs(zrec));

            break;

        case 2:

            for(z=0;z<terim;z++){

             mid_sonuc += ((deger[z][0]*pow((alt_limit + ust_limit)/2,deger[z][1])));

            }

            zmid = (cikarma * mid_sonuc);
            printf("%.4f",fabs(zmid));

            break;

        case 3:
            for(z=0;z<terim;z++){

             trap_sonuc += (((deger[z][0]*pow(alt_limit,deger[z][1]))+(deger[z][0]*pow(ust_limit,deger[z][1])))/2);

    }
            ztrap = (cikarma * trap_sonuc);
            printf("%.4f",fabs(ztrap));

            break;

        case 4:
                for(z=0;z<terim;z++){

             simp_sonuc += (deger[z][0]*pow(alt_limit,deger[z][1])) + 4*(deger[z][0]*pow((alt_limit + ust_limit)/2,deger[z][1])) + (deger[z][0]*pow(ust_limit,deger[z][1])) ;

    }
            printf("%.4f",fabs(cikarma/6*simp_sonuc));

            break;

        default:
            printf("Lutfen gecerli bir numara giriniz!\n");

    }


    return 0;
}

感谢您的帮助......

2 个答案:

答案 0 :(得分:0)

我刚刚复制了您的代码并对其进行了编译,并在您描述时遇到了分段错误。

然后我初始化 terim 以使初始值为100并再次编译。然后你的程序在没有分段错误的情况下运行,前提是当你扫描到 terim 时,我没有输入100或更多的值。

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

int main() {
    int terim = 100,s,z; /* Initialise here */
    int deger[terim][2];

这是我运行时从程序中获得的输出......

Denkleminizde kac adet terim var?
2 
Lutfen 1. terimin katsayisini giriniz : 1
Lutfen 1. terimin us degerini giriniz:2
Lutfen 2. terimin katsayisini giriniz : 3
Lutfen 2. terimin us degerini giriniz:4

Lutfen alt limit degerini giriniz
>>:  5

Lutfen ust limit degerini giriniz
>>:  6

 [ 1 ]  Rectangle Yontemi 

 [ 2 ]  Midpoint Yontemi 

 [ 3 ]  Trapezoid Yontemi 

 [ 4 ]  Simpsons Yontemi 
Lutfen tercih ettiginiz yontemin numarasini tuslayiniz
1
1900.0000

我不会评论您的代码是否结构良好或其他方面。我专注于你为什么会遇到分段错误。

希望这有帮助。

答案 1 :(得分:0)

我刚刚解决了。我正在定义

int deger [terim] [2];

此行之后:

的scanf( “%d”,&安培; TERIM);

不知道为什么,但这段代码在不同的操作系统和不同类型的编译器中的行为方式不同。但是通过这个解决方案,它可以完美运行。

谢谢大家:)