Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу разобраться с runtime error [D7, WinXP]


plr ©   (2011-10-12 18:38:00) 

Самое банальное приложение. Начали возникать runtime error.

Имеем вспомогательную функцию:


type
 TarrByte = array of byte;

var
 PP: array[00..$FF] of TarrByte;

...

function setArray(arrSource : array of const) : TarrByte;
var
 i: Integer;

begin
   SetLength(Result, High(arrSource));

   for i := Low(arrSource) to High(arrSource) do
     Result[i] := arrSource[i].VInteger;
end;


Определил в каком участке кода:


// собака роется тут
 PP[X] := setArray([$02, $55, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $03, $56]);


Причём таких присвоений много (15 штук), привёл одно для примера.

X - проверяется на range checking.

Теперь главное.

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

---------------------------
Debugger Fault Notification
---------------------------
Project Z:\ZZZ.exe faulted with message: 'access violation at 0x00407168: write of address 0x00030cf0'. Process Stopped. Use Step or Run to continue.

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

---------------------------
Debugger Exception Notification
---------------------------
Project ZZZ.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.

Соответственно, если блок кода с присвоениями не выполняется - приложение не падает ни на каком этапе.

Debug не ловит строчку кода в какой ошибка происходит, например, ставлю break point на первой строчке FormClose(), пробую двигаться шагами, дохожу до "end." в dpr и получаю runtime error с выводом CPU.

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

Что я делаю не так? В чём причина? Как можно избежать runtime error?

Delphi 7.3.4.2, win-xp с апдейтами всеми, вирусов нет.


han_malign   (2011-10-13 08:45:00) [1]


> SetLength(Result, High(arrSource)+1);

проктовазэктомия, блин...
SetLength(Result, Length(arrSource));
и(!)
function setArray( constarrSource : array of byte) : TarrByte;

"cколько ж нам открытий чудных..."(с)А.С.Пушкин


plr   (2011-10-12 19:55:00) [2]

Вопрос закрыт:


SetLength(Result, High(arrSource) +1);


Наверх

Титульная страница Поиск, карта сайта Написать письмо