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

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

Глюк в динамическом массиве Delphi [D2]


Страницы:   1 2

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 ?


Страницы:   1 2

Наверх

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