Количество случаев заболевания, связанных с возрастом пациента - PullRequest
0 голосов
/ 28 апреля 2020

Пользователь введет в качестве входных данных тройки, где первое число равно 0, второе число равно числу случаев заболевания определенного возраста (третье число) ИЛИ первое число равно 1, второе и третье числа соответствуют крайним возрастам интервал. Я должен связать «количество случаев» с «возрастом» и иметь возможность редактировать это количество случаев, у него есть возможность получать больше случаев для возраста, указанного ранее (первое число: 0). Кроме того, он даст числа X и Y, так что мне нужно напечатать количество случаев, связанных с возрастами между X и Y (первое число: 1). Я использую язык C.

Я попробовал этот код

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

int l[3], *list, n = 5;

void add(int X, int Y){
    while (Y < n){
        n = n * 2;
        list = realloc(list, n * sizeof(int));
    }
    list[Y] += X;
}

void consult(int X, int Y){
    int print = 0;
    for (int k = X; k <= Y; ++k){
        print += list[k];
    }
    printf("%d\n", print);
}

int main() {
    int P;
    scanf("%d", &P);
    list = (int*)calloc(n, sizeof(int));
    for (int i = 0; i < P; ++i){
        for (int j = 0; j < 3; ++j){
            scanf("%d", &l[j]);
        }
        if (l[0] == 0){
            add(l[1],l[2]);
        } else {
            consult(l[1],l[2]);
        }
    }
    return 0;
}

Для ввода:

20
0 194 9
1 7 41
0 102 38
1 30 43
0 22 49
1 34 56
1 15 20
1 34 57
1 34 51
0 128 39
0 97 57
0 114 25
0 10 82
0 127 35
1 66 164
0 60 85
0 155 48
1 60 186
1 10 384
0 166 950

он работает, возвращая:

194
102
124
0
124
124
10
70
815

[Program exited with exit code 0]

, но для

40
0 151 25
0 5 3
0 99 1
0 109 14
0 115 15
0 110 1
0 191 2
0 94 9
1 11 13
1 25 31
1 1 33
1 14 26
0 49 31
1 28 33
1 18 34
1 16 23
1 28 38
1 13 26
1 2 5
1 17 29
0 132 8
1 21 24
0 137 0
1 0 13
1 8 26
1 12 20
0 22 63
1 5 8
1 24 70
1 51 61
1 36 40
0 164 42
1 55 70
0 134 112
0 71 105
0 101 7
0 17 67
1 56 252
0 172 363
0 18 188

возвращается, что "превышен максимальный размер стека или памяти или, возможно, недопустимый указатель (код 139)".

Как это исправить проблема в моем коде?

Замечание: это обязательство запустить вектор с размером 5 и, если его недостаточно, мне нужно дублировать предыдущий объем памяти.

1 Ответ

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

Если вы добавите утверждения перед доступом к элементу массива, вы обнаружите, что индекс массива выходит за пределы:

assert(Y >= 0);
assert(Y < n);
list[Y] += X;

и

assert(k >= 0);
assert(k < n);
print += list[k];

Функция assert доступно после включения заголовочного файла assert.h. Вам также необходимо убедиться, что отсканированный ввод действителен.

...