![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк в динамическом массиве Delphi [D2]
AlexA © (2012-12-14 15:05:00)Есть структура
PR = record // Структура массива родителя
N: Integer; // Номер
I_: Integer; // Вход
OU_: Integer; // Выход
S_: Integer; // Старт
F_: Integer; // Финиш
C_: Integer; // Счетчик ссылок
end;
Массив
ContPar = record
Tpr: array of PR; // Массив родителей
Код
RDN_B:=2; integer
RDK_A:=1; integer
G1.Tpr[RDK_A].OU_:=RDN_B;
В после последней строчки в массиве G1.Tpr в строчке 0 появляется данные из строчки 1, а значение RDN_B записывается в строчку 1 как и должно быть, при записи в строчку 2 и далее такого нет
Тут скриншот таблицы http://89166974791.webasyst.net/DD/2...B_KEY=QUMxNjQ4
Видно в 0 строке цифры, а записывали в 1 строку, причем только в одну ячейку 1,О = 2. А в строке 0 появились 0,F=5 0,C=1
Как с этим бороться то?
NoUser (2012-12-15 18:38:00) [21]> Ошибка стабильно повторяется и числа те же, пробовал перезагружать комп
??
file - point - analiz -> Svazat(PTI.A, C1 = ( 1635360) ); ->
->
procedure TF1.Svazat(A: Integer; B: Integer);
begin
ACp := G1.Tcp[A];
BCp := G1.Tcp[B]; // Length(G1.Tcp) = 481;
->-> ?? Глюк в динамическом массиве Delphi ??
AlexA (2012-12-14 20:49:00) [22]Ошибка стабильно повторяется и числа те же, пробовал перезагружать комп
KilkennyCat (2012-12-14 17:44:00) [23]
> или же до выполнения записи уже должны быть неправильные
> значения.
или правильные. иногда мусор бывает "верным". что есть массив? некий список адресов на ячейки памяти. изменяя размер массива изменяешь лишь список адресов, но не содержимое. и вполне возможна ситуация, когда захватываешь область памяти, которая была захвачена до этого, и за промежуток между
SetLength(G1.Tcp, 0);
SetLength(G1.Tcp, G1.IM_C);
ее ничто не успело изменит, или изменило частично.
AlexA (2012-12-14 17:08:00) [24]Глюк выскакивает на некоторых изображениях. Тем более когда SetLength установлен размер достаточный для работы. даже если в массиве мусор, то как при одних и тех де условиях запись в строку 1 вызывает появление значений в строке 0 из других строк, а запись в строку 2 работает нормально? На что повлияет способ установки длинны массива?
Тогда уже при записи в строку 2 должна быть ошибка или же до выполнения записи уже должны быть неправильные значения.
O'ShinW (2012-12-14 16:29:00) [25]еще,
если появляется трудноуловимый глюк с индексом доступа
тогда надо сделать доступ по свойству.
А в геттере/сеттере можно уже тупо написать
if (вообще быть не может) then
raise Exception.Create('вообще быть не может, а есть');
далее по стеку вызовов смотрим откуда ноги растуту
"Багель отладчик" - в гугле искать
KilkennyCat (2012-12-14 16:27:00) [26]и не спеши называть глюком свои ошибки ;)
KilkennyCat (2012-12-14 16:24:00) [27]код надо приводить нормально, как есть.
твой код:
SetLength(G1.Tcp, 0); // Очистим массив цепочек
SetLength(G1.Tcp, G1.IM_C);
это неверно. смотри [9]
AlexA (2012-12-14 16:20:00) [28]Код лежит в архиве по ссылке http://89166974791.webasyst.net/DD/2.0/folder_link.php?sl=94e0dae428c1ce3a79eecd049fee567d&DB_KEY=QUMxNjQ4
При запуске надо выбрать файл Тест_Стандартная петля (в архиве лежит)
Затем последовательно Заполним точки,Анализ, Проявить
Слева две таблички, там наблюдаем глюк
В коде изменение переменной строка 321
Прога берет файл картинки, преобразует в битовую карту и ищет связанные пикселы (аналог bwlable из MATLAB) если выбрать галку в таблицу, реномер, проявить, то в таблице появятся все связанные объекты
под своими номерами. Вот и не работает она при некоторых изображениях на входе, с тестовым примеро точно глючит, если крин шот кода который я оправил пропустить то все ок)
Да делфи Embarcadero® Delphi® XE2 Version 16.0.4504.48759
O'ShinW (2012-12-14 16:20:00) [29]
> SetLength(G1.Tpr, 0);
> SetLength(G1.Tpr, G1.IM_C);
// a обнулить?
// оф чего они там уж..
ZeroMemory(G1.Tpr, G1.IM_C * SizeOf(PR) );
// так вроде..
KilkennyCat (2012-12-14 16:18:00) [30]ты весь код приводи, тебя что, пытать надо?
AlexA (2012-12-14 16:14:00) [31]SetLength(G1.Tpr, 0);
SetLength(G1.Tpr, G1.IM_C);
G1.IM_C - рассчитывается раньше и ее размер всегда больше чем будет записей
O'ShinW (2012-12-14 16:11:00) [32]
> инициализация делается,
как?
KilkennyCat (2012-12-14 16:10:00) [33]ну код-то приведи. здесь нет телепатов.
O'ShinW (2012-12-14 16:08:00) [34]и ссылка битая
AlexA (2012-12-14 16:07:00) [35]G1: ContPar;
инициализация делается, размер массива тоже установлен и его хватает
Пишем в строку 1, а значения появляются в строке 0 и в строке 1
KilkennyCat (2012-12-14 15:26:00) [36]инициализация массива делается? иначе мусор будет
Jeer (2012-12-14 15:24:00) [37]Каша..
И что такое G1 ?