Почему моя программа показывает ошибку сегментации в Ubuntu, но работает нормально в Geeks IDE? - PullRequest
0 голосов
/ 15 января 2019

Эксперты, это программа, которую я сделал для составления расписаний в порядке поступления заявок на языке Си.
Для входов типа -
4
0 0 0 0
1 2 3 4

и вводы типа -
5
0 1 2 3 4
4 3 1 2 5

Моя программа выдает ошибку сегментации (ядро сброшено), когда я пытался запустить его на своей Ubuntu, но он отлично работал в IDE GeeksForGeeks.
А для входов вроде -
6
4 3 2 1 2 3
4 3 2 3 4 5

Моя программа работает нормально как в Ubuntu, так и в IDE GeeksForGeeks.

#include<stdio.h>
void main(){
    int n,i;
    printf("\nEnter the number of jobs:\n");
    scanf("%d",&n);
    int at[n],bt[n],at_copy[n];
    printf("\nEnter the arrival time:\n");
    for(i=0;i<n;i++){
        scanf("%d",&at[i]);
        at_copy[i]=at[i];   
    }    
    printf("\nEnter the burst time:\n");
    for(i=0;i<n;i++)
        scanf("%d",&bt[i]);
    int priority[n],min=at_copy[0],k,j;
    for(j=0;j<n;j++){
        min=at_copy[0];
        for(i=0;i<n;i++){
            if(at_copy[i]<min){
                min=at_copy[i];
                k=i;
            }
        }
        at_copy[k]=999;
        priority[j]=k;
    }
    int ct[n],wt[n],tat[n],t=0;
    for(i=0;i<n;i++){
        if(at[i]<t)
            k=0;
        else
            k=at[i];
        t+=bt[i]+k;
        ct[i]=t;
        tat[i]=ct[i]-at[i];
        wt[i]=tat[i]-bt[i];
    }
    printf("\nProcess\tAT\tBT\tCT\tTAT\tWT\n");
    for(i=0;i<n;i++){
       printf("P%d\t%d\t%d\t%d\t%d\t%d\n",i+1,at[i],bt[i],ct[i],tat[i],wt[i]);
    }
}

В выходных данных я ожидаю таблицу в виде структуры, отображающей время прибытия, время пакета, время завершения, время пакета, время выполнения и время ожидания всех процессов.

1 Ответ

0 голосов
/ 15 января 2019

Здесь:

int priority[n],min=at_copy[0],k,j;
for(j=0;j<n;j++){
    min=at_copy[0];
    for(i=0;i<n;i++){
        if(at_copy[i]<min){
            min=at_copy[i];
            k=i;
        }
    }
    at_copy[k]=999;
    ...

Представьте, что происходит, когда at_copy[0] является минимальным значением. Тогда условие atcopy[i]<min никогда не выполняется, и k остается неинициализированным, что приводит к выходу за пределы этой области:

    at_copy[k]=999;

Вы должны инициализировать k с помощью 0, поскольку в первой итерации вы предполагаете, что at_copy[0] - это минимум.

int priority[n],min=at_copy[0],k=0,j;

С Geeks-IDE вам, возможно, повезло, и значение k было равно 0 без инициализации.

...