Ошибка сегментации C в определенных строках - PullRequest
0 голосов
/ 24 апреля 2018

Здравствуйте, я новичок в C, как вы можете понять. Я получаю ошибку сегментации со строками 26 - 31. Я упомянул, где фалут начинается ниже в коде. Я получаю сообщение об ошибке в этом онлайн-компиляторе c , а также в блоках кода ничего не говорится, только остановка файла .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 голосов
/ 27 апреля 2018

Я только что решил. Я определяю

int deger [terim] [2];

ПОСЛЕ этой строки:

зсапЕ ( "% d", & Terim);

Не знаю почему, но этот код действует по-разному в разных операционных системах и разных типах компиляторов. Но с этим решением, оно работает отлично.

Спасибо всем вам :)

0 голосов
/ 26 апреля 2018

Я просто скопировал ваш код, скомпилировал его и получил ошибку сегментации, как вы описываете.

Затем я инициализировал terim , чтобы иметь начальное значение 100, и снова скомпилировал. Затем ваша программа запускается без ошибки сегментации, при условии, что я не ввожу значение 100 или более при сканировании в terim .

#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

Я не комментирую, хорошо ли структурирован ваш код или нет. Я сосредоточен исключительно на том, почему вы получаете ошибку сегментации.

Надеюсь, это поможет.

...