Почему в этот динамический массив выдается исключение?

Возможно, что-то вроде этого:

#!/bin/bash

echo Enter Number:
read num

function1() { echo one; }
function2() { echo two; }

case $num in
    1)
        function$num
    ;; 
    2)
        function$num
    ;;
esac
-1
задан Christophe 19 January 2019 в 09:49
поделиться

2 ответа

Проблема не в том, сколько номеров вы храните, а в том, где вы их храните; вы храните 101 в a[101], что, очевидно, неправильно.

Если i: нечетное число - C, правильный индекс i-1, а не C.

Наиболее читаемым изменением, вероятно, является введение новой переменной счетчика.

int main() {
    int a[100] = {0}; 
    int count = 0;
    for (int number = 1; number < 200; number++) {
        if (number % 2 == 1) {
            a[count] = number;
            count += 1; 
       }
    }
}

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

Если вам случится вспомнить, что каждое нечетное число C может быть записано в форме 2 * A + 1 для некоторого A, вы 'увидите, что последовательность, которую вы ищете, равна

2*0+1, 2*1+1, 2*2+1, ..., 2*99+1
[ 1113] так

int main()
{
    int numbers[100] = {0};
    for (int i = 0; i < 100; i++)
    {
        numbers[i] = 2 * i + 1;
    }
}

Вы также можете пойти другим путем, перебирая нечетные числа и сохраняя их в нужном месте:

int main()
{
    int numbers[100] = {0};
    for (int i = 1; i < 200; i += 2) // This loops over the odd numbers.
    {
        numbers[i/2] = i;  // Integer division makes this work.
    }
}
0
ответ дан molbdnilo 19 January 2019 в 09:49
поделиться

Причина ошибки

Если у вас есть массив a, который был создан с элементами n, то при попытке получить доступ к элементу массива из облака это неопределенное поведение. Таким образом, индекс ДОЛЖЕН всегда быть между 0 и n-1.

Таким образом, поведение вашей программы не определено, как только count равно 100, так как оценка условия в if -предложении уже пытается получить доступ за пределами.

Корректировка, которая делает то, что вы хотите

Теперь, кроме того, есть серьезная ошибка в логике вашей программы: если вы хотите добавить числа, которые удовлетворяют некоторому условию, вам нужно 2 счетчика: один для итерации по числам и один для последнего индекса, используемого в массиве:

for (int nextitem=0, count = 1; count < 200; count++) {
    if (count % 2 == 1) {   // not a[count], you need to test number itself
        a[nextitem++] = count;
        cout << count << endl;
        if (nextitem == 100) {    // attention:  hard numbers should be avoided
            cout << "Array full: " << nextitem << " items reached at " << count <<endl;
            break;   // exit the for loop
        }
    }
} 

Но, это решение требует, чтобы вы отслеживали последний элемент в массиве и размер массива (это жестко запрограммировано здесь).

Векторы

Вы, вероятно, учитесь. Но в C ++ лучшим решением было бы использовать vector вместо массива и использовать push_back(). Векторы управляют памятью, так что вы можете сосредоточиться на своем алгоритме. Полная программа будет выглядеть следующим образом:

vector<int> a;
for (int count = 1; count < 200; count++) {
    if (count % 2 == 1) {
        a.push_back(count);
        cout << count << endl;
    }
}
cout << "Added " << a.size() << " elements" <<endl; 
cout << "10th element: "<< a[9] << endl; 
0
ответ дан Christophe 19 January 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: