Вар декларация в Лазаре - PullRequest
0 голосов
/ 14 февраля 2020

Я столкнулся со странным поведением при объявлении переменных в lazaus (2.0.6)

Если я объявляю переменные, используя следующую последовательность, программа останавливает выполнение, выдавая ошибку SIGSEGV, появляется ошибка, если я назначу начальное значение во второе поле TabCellContent var

TabReadActive: Boolean;
ShCol: Array[0..6] of Boolean;
TabCellContent: Array [0..6] of Array [1..50] of TCellContent;

Но если я помещу «TabReadActive» ниже объявления массива, программа работает нормально без ошибок

ShCol: Array[0..6] of Boolean;
TabCellContent: Array [0..6] of Array [1..50] of TCellContent;
TabReadActive: Boolean;

есть кто-то, кто сталкивался с таким же поведением? И в чем причина этого?

1 Ответ

4 голосов
/ 14 февраля 2020

Причина в том, что код, который обращается к переменным, выходит за пределы. Доступ к массивам за пределами приводит к неопределенному поведению. Это просто совпадение, что порядок, в котором вы объявляете переменные, меняет это поведение. Но это природа неопределенного поведения. Это, ну, в общем, не определено.

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

...