Как устранить эту ошибку сегментации внутри моего дела l oop? - PullRequest
1 голос
/ 06 апреля 2020

Вы должны транспортировать максимум 15 различных грузов из одного порта в другой. Грузоподъемность корабля go корабля, который будет перевозить эти грузы, составляет 50 тонн. Нагрузки перечисляются, и информация о весе каждой нагрузки дается в качестве ввода.

Предположим, что вес каждой нагрузки меньше или равен 50 тоннам и больше 0.

Вы будет читать вес каждой нагрузки от входа в одной строке. Ваш ввод закончится -1. Вы напечатаете количество необходимых поездок.

Пример ввода:

50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1

Вывод:

15  

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

./vpl_execution: line 5: 15093 Bus error               (core dumped) ./main

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

#include <stdio.h>
int main()
{   int w,i,t,sum,index;
    int list[16];
    w = 1;
    do
    {   
        scanf("%d",&w);
        list[index] = w;
        index++;
    }while(w >= 0);
    t = 0;
    for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)
    {
        sum =0;
        if(sum <= 50)
        {sum += list[i];}
        else
        {t++;}
    }

    printf("%d",t);
    return 0;
}

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

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

Первая ошибка сегментации происходит в этой строке:

list[index] = w;

Как вы думаете, это значение index?

Вы не инициализировали его значением, которое, вероятно, должно было быть 0.

Следовательно, доступ к list[index] является неопределенным поведением. В вашем случае это вызвало ошибку сегментации.

Тогда внутри for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)

Доступ к list[i] здесь может вызвать еще один segfault с конечным значением i. Вы должны удалить +1 из ((sizeof(list)/sizeof(list[0]))+1).

Решение:

  1. Выполнить index = 0; один раз (инициализация) перед выполнением list[index] = w;

  2. Удалите +1 из ((sizeof(list)/sizeof(list[0]))+1)

Но было бы лучше изменить

for(i = 0;i < ((sizeof(list)/sizeof(list[0])));i++) до

for (i = 0; i < 15; ++i)

Поскольку вы уже знаете, что размер ваших list и list[15] гарантированно составит -1, если имеется 15 весов. Итак, вам просто нужно перейти к list[14].

Это просто устраняет ошибку segfault, но в вашем коде все еще есть другие проблемы.

Я хочу знать, почему код не работает, а затем решить вопрос самостоятельно.

Лог c внутри вашего for-l oop неверен.

sum =0;
if(sum <= 50)

Это условие всегда верно и ваш блок else, который увеличивает значение t, никогда не выполняется. Следовательно, на выходе всегда будет начальное значение, которое вы присваиваете t.

0 голосов
/ 06 апреля 2020

сначала вы использовали неинициализированную переменную index use index=0.

также, как сказано в вопросе a maximum of 15 different, но вы используете ((sizeof(list)/sizeof(list[0]))+1), кроме +1 в конце, что приведет к пропуску границ вашего массива, что приведет к неопределенному поведению, неправильно потому что вы будете обходить массив полностью, в то время как возможно, что у вас будет меньше элементов в array. Вы должны добавить счетчик во время сканирования данных, и ваш второй l oop должен быть основан на этом.

также ваш код отличается от вопроса, если ввод всегда 0 < input <= 50, вы никогда не введете else statement (t++) и вы всегда будете печатать 0. вы находите sum весов, а не подсчитываете их, и с помощью объясненного ввода вы всегда будете печатать t=0.

...