Ошибки индексации массива

Суть этой ошибки очень проста — попытка обратиться к элементу списка/массива с несуществующим индексом.

Пример:

lst = [1, 2, 3]
print(lst[3])

вывод:

----> 2 print(lst[3])

IndexError: list index out of range

Указанный в примере список имеет три элемента. Индексация в Python начинается с 0 и заканчивается n-1, где n — число элементов списка (AKA длина списка).
Соответственно для списка lst валидными индексами являются: 0, 1 и 2.

В Python также имеется возможность индексации от конца списка. В этом случае используются отрицательные индексы: -1 — последний элемент, -2 — второй с конца элемент, …, -n-1 — второй с начала, -n — первый с начала.

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

In [2]: lst[-4]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-ad46a138c96e> in <module>
----> 1 lst[-4]

IndexError: list index out of range

В реальной жизни (коде) эта ошибку чаще всего возникает в следующих ситуациях:

  • если список пустой: lst = []; first = lst[0]
  • в циклах — когда переменная итерирования (по индексам) дополнительно изменяется или когда используются глобальные переменные
  • в циклах при использовании вложенных списков — когда перепутаны индексы строк и столбцов
  • в циклах при использовании вложенных списков — когда размерности вложенных списков неодинаковые и код этого не учитывает. Пример: data = [[1,2,3], [4,5], [6,7,8]] — если попытаться обратиться к элементу с индексом 2 во втором списке ([4,5]) мы получим IndexError
  • в циклах — при изменении длины списка в момент итерирования по нему. Классический пример — попытка удаления элементов списка при итерировании по нему.

Поиск и устранения ошибки начинать нужно всегда с того, чтобы внимательно прочитать сообщение об ошибке (error traceback).

Пример скрипта (test.py), в котором переменная итерирования цикла for <variable>
изменяется (так делать нельзя):

lst = [1,2,3]
res = []

for i in range(len(lst)):
  i += 1   # <--- НЕ ИЗМЕНЯЙТЕ переменную итерирования!
  res.append(lst[i] ** 2)

Ошибка:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    res.append(lst[i] ** 2)
IndexError: list index out of range

Обратите внимание что в сообщении об ошибке указан номер ошибочной строки кода — File "test.py", line 6 и сама строка, вызвавшая ошибку: res.append(lst[i] ** 2). Опять же в реальном коде ошибка часто возникает в функциях, которые вызываются из других функций/модулей/классов. Python покажет в сообщении об ошибке весь стек вызовов — это здорово помогает при отладке кода в больших проектах.

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

I have been doing array indexing as follows

>> n=[1 2 3]
n =
     1     2     3

>> idx=1
idx =
     1

>> n([idx+1 idx])
ans =
     2     1

without any problem. However, today I encounter this error in my following snippet. Please forgive me. I understand I should provide MWE, but I simply cannot reproduce the error!

>> %%% interpret tree
bitmap = zeros(pix_no_per_side, pix_no_per_side);
x_pixels = 1:1:pix_no_per_side;
y_pixels = 1:1:pix_no_per_side;
rule_set = {}; % cell to accommodate rows of diff. sizes
% parse branches
trav_iter = tr.depthfirstiterator;
while tr.get(trav_iter(end)) <= 0 % still have branch unparsed
    branch = [1]; % contains the root
    node_idx = 1;
    while tr.get(branch(end)) > 0 % not bottom yet
        node_idx = node_idx+1;
        branch = [branch trav_iter(node_idx)];
    end
    rule_set{end+1} = branch; % one rule per cell
    disp(node_idx) % DISPLAYING FOR DEBUGGING
    if numel(rule_set) == 1 % only one branch found so far
        trav_iter(node_idx) = []; % remove this leaf
    else % more than one branches found so far
        trav_iter([node_idx-1 node_idx]) = []; % remove this leaf and parent node
    end
end
     3

     3

     2

Subscript indices must either be real positive integers or logicals.
>> 

asked Jun 17, 2014 at 16:11

Sibbs Gambling's user avatar

Sibbs GamblingSibbs Gambling

19.1k42 gold badges101 silver badges172 bronze badges

The index node_idx-1 is likely either 0 or -1. The subscript error almost always indicates this problem. However, any empty, NaN or other value can cause this as well.

Perhaps this is because the assignment node_idx = 1; sets the value and in your last loop, it is never incremented yielding a 0 index.

answered Jun 17, 2014 at 16:14

macduff's user avatar

macduffmacduff

4,64517 silver badges29 bronze badges

1

The problem with your debugging line is that it only displays the output of node_idx at the end of the while loop. If it errors after setting node_idx to 1 and before hitting disp then you will not see the value of the index that caused the error.

Here’s a simple way of understanding it:

x = 1:3

for n = 3:-1:0
    y = x(n);
    disp(n)
end

As you can probably guess, the above code will error when n gets to 0,
However, when it runs, I get:

     3

     2

     1

Attempted to access x(0); index must be a positive integer or logical.

i.e. disp never shows 0.

But from the command line:

>> n

n =

     0

If this is within a function, use dbstop if error and then check node_idx when the code stops.

answered Jun 17, 2014 at 17:18

nkjt's user avatar

nkjtnkjt

7,8159 gold badges22 silver badges28 bronze badges

0

It turns out that error message is triggered by

trav_iter(end)

where trav_iter is possibly to be empty.

Reproducing the error then becomes.

>> a = []

a =

     []

>> a(end)
Subscript indices must either be real positive integers or logicals.

Hence, to fix that, I add one logical and to make sure that the trav_iter is not empty. i.e.,

while numel(trav_iter) ~= 0 && tr.get(trav_iter(end)) <= 0

answered Jun 17, 2014 at 18:40

Sibbs Gambling's user avatar

Sibbs GamblingSibbs Gambling

19.1k42 gold badges101 silver badges172 bronze badges

yevgesh

1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

1

Ошибки индексации в двумерном массиве

09.07.2016, 09:26. Показов 1003. Ответов 22

Метки c++, двумерный массив (Все метки)


Студворк — интернет-сервис помощи студентам

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

Заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <time.h>
using namespace std;
 
int const size1 = 4;
int const size2 = 4;
int mArr[size1][size2];
 
bool isDigitCorect(int digit, int pos1, int pos2) {
 
    int const size = 16;
    int const n = 4;
    int const m = 4;
    int myArr[n][m];
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            myArr[i][j] = mArr[i][j];
        }
    }
 
    for (int k = 0; k < n; k++) {
        for (int l = 0; l < m; l++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (i + 1 == n && j + 1 == m) {
                        continue;
                    }
                    else {
                        if (j + 1 == m && myArr[i][j] > myArr[i + 1][0]) {
                            int t = myArr[i][j];
                            myArr[i][j] = myArr[i + 1][0];
                            myArr[i + 1][0] = t;
                        }
                        else {
                            if (j + 1 != m && myArr[i][j] > myArr[i][j + 1]) {
                                int t = myArr[i][j];
                                myArr[i][j] = myArr[i][j + 1];
                                myArr[i][j + 1] = t;
                            }
                        }
                    }
                }
            }
        }
    }
 
    cout << endl << endl << myArr[pos1][pos2] << endl << digit << endl << endl;
 
    if (myArr[pos1][pos2] == digit)
        return true;
    else
        return false;
 
}
 
 
void main() {
 
    srand(time(NULL));
 
 
 
    int mArr2[size1][size2];
    int x = 16;
 
    for (int i = 0; i < size1; i++)
        for (int j = 0; j < size2; j++, x--)
            mArr[i][j] = x;
 
    for (int i = 0; i < size1; i++) {
        for (int j = 0; j < size2; j++) {
            cout << mArr[i][j] << " ";
        }
        cout << endl;
    }
 
    if (isDigitCorect(1, 0, 0) == true)
        cout << endl << endl << "true" << endl;
    else if (isDigitCorect(1, 0, 0) == false)
        cout << endl << endl << "false" << endl;
 
    if (isDigitCorect(16, 4, 4) == true)
        cout << endl << endl << "true" << endl;
    else if (isDigitCorect(1, 4, 4) == false)
        cout << endl << endl << "false" << endl;
 
    system("Pause");
}



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 09:33

2

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



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 09:44

 [ТС]

3

пишу приложение на winApi. в нем возникла проблема при чтении массива. вот решил проверить правильность работы кода в отдельном проекте. а в чем, собственно, проблема? в сортировке массива я уверен, т.к. проверял ее отдельно. мне нужна помощь лишь в том, чтобы найти ошибку в коде программы и понять почему в массив записывается муссор



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 09:48

4

yevgesh, по вашему коду массив инициализируется убывающим от 16 значением — если это мусор инициализируйте по другому



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 09:59

 [ТС]

5

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



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 10:06

6

yevgesh, критерий мусора не определен, где он здесь:

16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1

1
1

true

-4727032
16

-4727032
1

false



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 10:09

 [ТС]

7

Цитата
Сообщение от vxg
Посмотреть сообщение

-4727032

вот он



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 10:12

8

телепатирую — возможно дело в том что иногда вы можете вылезти за массив используя i + 1 и j + 1 так как перебор идет по всем индексам и пропускает только правый нижний угол из-за &&

Добавлено через 1 минуту
большим не зная что должно быть вместо -4727032 помочь сложно



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 10:39

 [ТС]

9

я думал над этим. но если я вывожу сам массив в функции, то все выводится нормально. никакого мусора и правильно отсортирован

Добавлено через 1 минуту
да посмотри же на код.. не понятно разве? там должен быть элемент массива с индексами pos1 и pos2…

Добавлено через 23 минуты
ооокей…. проблема решена. в это трудно поверить, но индексация элементов массива начинается с 0, а не 1



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 10:51

10

yevgesh, нет, не понятно ничего в вашем коде, а если вам понятно почему скрываете я не знаю, пока все объяснения были на уровне «вот эта магия выводит 8, а в решениях написано что должна выводить 0 — как магию магически починить?» — помощь будет эффективнее если вопрос будет вопросом. Так или иначе рад что у вас все заработало, да, массивы индексируется с 0



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 11:06

 [ТС]

11

сорян, если что… я новичек в этой сфере. можете уточнить что конкретно вы называете магией, и что конкретно в моем коде вам не понятно?



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 11:12

12

yevgesh, каждый символ по отдельности понятен, но разбираться в происходящем без словесного описания просто может оказаться не досуг. Если вам не досуг обьяснить то почему другой человек должен быть так сильно мотивирован что станет фантазировать над вашим кодом что же вы имели в виду и что в нем верно а что ошибка? Магией я называю такой вот подход — есть мол код-черный ящик — входит одно, выходит другое, почему выходит не то что я жду не знаю, чего жду тоже не знаю — иначе как термином магия тут не обойтись)



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 11:17

 [ТС]

13

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



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 11:24

14

yevgesh, ещё разок — если вы не объясняете что должен сделать код как я смогу отличить ошибку от алгоритма?



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 11:33

 [ТС]

15

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



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 11:36

16

yevgesh, что бы не делал основной проект вы пытались это воспроизвести в тесте — если вы не смогли объяснить что вы тестировали то думаю в случае с основным проектом меня вообще ждёт сиреневый туман



0



yevgesh

1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 11:43

 [ТС]

17

поясняю:
я создаю приложение — игрушку. на окне располагаются 16 кнопок с разными числовыми значениями. пользователь должен нажать эти кнопки по возрастанию находящихся на них чисел. значения всех кнопок хранятся в двумерном массиве. данная функция должна сортировать кнопки в правильном порядке, а потом сравнивать порядок нажатия пользователем кнопок.
я думаю, когда посмотрите на код, станет понятнее

Добавлено через 1 минуту

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        case IDC_BUTTONS:
 
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if ((HWND)lParam == hButtons[i][j])
                    {
                        GetWindowText(hButtons[i][j], BUFF, 256);
                        if (isDigitCorect(_wtoi(BUFF), i, j) == TRUE) {
                            SendMessage(hList, LB_ADDSTRING, 0, LPARAM(BUFF));
                            EnableWindow(hButtons[i][j], false);
                        }
                    }
                }
            }



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 12:36

18

yevgesh, генерируем последовательность, сортируем порядковые номера ячеек по возрастанию значения в ячейке, при нажатии проверяем что в отсортированном массиве порядковый номер ячейки в позиции равной номеру нажатия соответствует порядковому номеру нажатой ячейки



0



1 / 1 / 0

Регистрация: 26.08.2015

Сообщений: 30

09.07.2016, 12:40

 [ТС]

19

а разве есть разница в том, проверять содержание ячеек или их порядковые номера?



0



Модератор

3371 / 2143 / 352

Регистрация: 13.01.2012

Сообщений: 8,331

09.07.2016, 12:43

20

yevgesh, проверять содержимое с чем?



0



Глава 39 Командная игра (массивы)

procedure ABC (var arg: TRatings); { параметр процедуры } var A, B, C : TRatings; { локальные переменные } begin

. . .

end;

Здесь тип TRatings служит для объявления переменных и параметров в трех местах программы. В будущем мы всегда будем объявлять типы — как для массивов, так и для других сложных наборов данных.

Доступ к элементам (индексация)

Переменной-массивом можно ворочать как единым целым, например, при копировании одного массива в другой. Но чаще приходится работать с отдельными его элементами, как «выдернуть» их из массива?

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

Рассмотрим примеры доступа к элементам объявленных выше массивов.

Пример 1. Трем элементам массива Names даём фамилии хоккеистов:

Names[1]:= ’Петров’;

Names[2]:= ’Михайлов’;

Names[3]:= ’Харламов’;

Пример 2. Сравниваем третий и четвертый элементы массива Ratings. Здесь индексы заданы через целочисленную переменную n.

Ratings[3]:= 12;

Ratings[4]:= 8;

n:=3;

if Ratings[n] > Ratings [n+1] then … else …;

Как видите, индекс в массиве можно вычислять, а это открывает дорогу к циклам. И мы двинемся ею немедленно!

284

Глава 39 Командная игра (массивы)

Ввод и вывод массивов

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

Взять, к примеру, массив Names, ввести который можно так:

for i:=1 to 30 do Readln(F, Names[i]);

Здесь F — это открытый для чтения текстовый файл, каждая строка которого содержит фамилию.

На первый взгляд всё просто. Просто, да не гладко, — это будет работать лишь с файлом, в котором не менее 30 строк (по числу циклов). А иначе случится ошибка: противозаконное чтение за пределами файла. Как избежать её? Внимательней присматривайте за концом файла, вот так:

i:=1;

{ пока не конец файла и не введены все элементы } while not Eof(F) and (i<=30) do begin

Readln(F, Names[i]); i:= i+1;

end;

А вот ещё один хороший вариант:

for i:=1 to 30 do begin

if Eof(F) then break; { если конец файла, прервать цикл } Readln(F, Names[i]);

end;

Вывод массива в файл не представляет труда, вот пример:

for i:=1 to 30 do Writeln(F, Names[i]);

Разумеется, что файловая переменная F должна быть открыта для записи.

Ошибки индексации

Объявление массива, как сказано, содержит границы для индексов: MIN — номер первого элемента, и MAX — номер последнего. А что случится при попытке обратиться к элементу с меньшим, чем MIN номером? Или наоборот — с большим, чем MAX? Иначе говоря, что случится при попытке доступа к несуществующему

285

Глава 39 Командная игра (массивы)

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

Предположим, в программу вкрался такой оператор:

Names[200]:= ’Синичкин’;

Поскольку в массиве Names нет элемента с индексом 200, здесь вас остановит компилятор, — ошибка слишком явна, чтобы он промолчал. Вам не останется ничего иного, как исправить индекс, иначе программа не откомпилируется.

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

Readln(N);

Writeln(Names[N]);

Нам не угадать, что введет пользователь в переменную N, — здесь ошибка нарушения границ может возникнуть при выполнении программы. В главе 27 мы рассматривали ошибки времени исполнения, — это как раз такой случай. Если указать индекс, выходящий за границы массива, то реакция программы будет зависеть от настройки компилятора, точнее, от опции контроля диапазонов. Напомню, что эта опция управляется директивой $R, а также доступна через меню по цепочке:

Options à Compiler… à Runtime Errors à Range checking

Рассмотрим вариант компиляции при включенном контроле границ ($R+). Тогда, при нарушении границ индекса, программа выдаст аварийное сообщение «Range check error». То есть, она заметила нарушение границ индекса, «крикнула» об этом и прервала работу.

Теперь отключим контроль диапазонов ($R-) и перекомпилируем программу. Она станет «легче» и быстрее, и по ходу выполнения проверять границы не станет. Но ошибки не пройдут бесследно. Наоборот, последствия будут тяжелыми и непредсказуемыми! Отключать проверку диапазонов позволительно только в тщательно проверенной программе.

Лучший способ избежать нарушения границ индексов — взять проверку на себя. В данном случае это можно сделать так:

286

Глава 39 Командная игра (массивы)

repeat

Readln(N);

if N in [1..30]

then Writeln(Names[N])

else Writeln(’Ошибка! Введите индекс от 1 до 30’);

until N in [1..30]

Этот цикл будет терзать пользователя, пока тот не введет допустимое значение индекса, или не выключит компьютер.

Итоги

Массив – это сложный тип данных, объединяющий в себе несколько однотипных переменных – элементов массива.

Все элементы массива носят одно общее имя – это имя самого массива. Внутри массива элементы различаются своими порядковыми номерами –

индексами.

В объявлении массива указывают две его характеристики: диапазон индексов и тип элементов.

Индекс элемента может быть задан числом или выражением порядкового типа.

Указание неверного индекса порождает ошибки либо при компиляции, либо при выполнении программы.

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

Аслабо?

А) Массив A и переменная C объявлены так:

var A : array [’a’..’z’] of integer;

C: char;

Допустимо ли такое объявление массива и почему? Сколько элементов содержит массив? Какие из указанных ниже операторов будут (или могут) вызывать ошибки нарушения диапазонов?

A[’s’]:= 10;

A[’R’]:= 10;

Readln(C); A[C]:= 10;

Проверьте свои решения на практике.

287

Соседние файлы в папке delphi

  • #
  • #
  • #
  • #
  • #
  • #

#matlab

#matlab

Вопрос:

Я выполнял индексацию массива следующим образом

 >> n=[1 2 3]
n =
     1     2     3

>> idx=1
idx =
     1

>> n([idx 1 idx])
ans =
     2     1
  

без каких-либо проблем.Однако сегодня я сталкиваюсь с этой ошибкой в моем следующем фрагменте. Пожалуйста, простите меня. Я понимаю, что должен предоставить MWE, но я просто не могу воспроизвести ошибку!

 >> %%% interpret tree
bitmap = zeros(pix_no_per_side, pix_no_per_side);
x_pixels = 1:1:pix_no_per_side;
y_pixels = 1:1:pix_no_per_side;
rule_set = {}; % cell to accommodate rows of diff. sizes
% parse branches
trav_iter = tr.depthfirstiterator;
while tr.get(trav_iter(end)) <= 0 % still have branch unparsed
    branch = [1]; % contains the root
    node_idx = 1;
    while tr.get(branch(end)) > 0 % not bottom yet
        node_idx = node_idx 1;
        branch = [branch trav_iter(node_idx)];
    end
    rule_set{end 1} = branch; % one rule per cell
    disp(node_idx) % DISPLAYING FOR DEBUGGING
    if numel(rule_set) == 1 % only one branch found so far
        trav_iter(node_idx) = []; % remove this leaf
    else % more than one branches found so far
        trav_iter([node_idx-1 node_idx]) = []; % remove this leaf and parent node
    end
end
     3

     3

     2

Subscript indices must either be real positive integers or logicals.
>> 
  

Ответ №1:

Индекс node_idx-1 , скорее всего, либо 0 или -1 . Ошибка индекса почти всегда указывает на эту проблему. Однако любое пустое NaN или другое значение также может вызвать это.

Возможно, это связано с тем, что присваивание node_idx = 1; задает значение, и в вашем последнем цикле оно никогда не увеличивается, давая 0 индекс.

Комментарии:

1. Спасибо, но 3 3 2 это то, что я получаю, когда делаю disp(node_idx) .

Ответ №2:

Проблема с вашей отладочной строкой заключается в том, что она отображает вывод только node_idx в конце цикла while. Если после установки node_idx значения 1 и до нажатия disp появляется ошибка, вы не увидите значение индекса, вызвавшего ошибку.

Вот простой способ понять это:

 x = 1:3

for n = 3:-1:0
    y = x(n);
    disp(n)
end
  

Как вы, вероятно, можете догадаться, приведенный выше код выдает ошибку при n достижении значения 0,
Однако, когда он запускается, я получаю:

      3

     2

     1

Attempted to access x(0); index must be a positive integer or logical.
  

т.е. disp никогда не отображается 0 .

Но из командной строки:

 >> n

n =

     0
  

Если это внутри функции, используйте dbstop if error , а затем проверьте node_idx , когда код останавливается.

Ответ №3:

Оказывается, что сообщение об ошибке вызывается

 trav_iter(end)
  

где trav_iter , возможно, должно быть пусто.

Затем воспроизводится ошибка.

 >> a = []

a =

     []

>> a(end)
Subscript indices must either be real positive integers or logicals.
  

Следовательно, чтобы исправить это, я добавляю один логический и чтобы убедиться, что trav_iter он не пуст. т.е.,

 while numel(trav_iter) ~= 0 amp;amp; tr.get(trav_iter(end)) <= 0
  

Понравилась статья? Поделить с друзьями:
  • Ошибки инвестора картинка
  • Ошибки инвестирования новичков
  • Ошибки инвертора toshiba
  • Ошибки инвертора siemens
  • Ошибки инвентаризационной комиссии