|
#16
|
||||
|
||||
Цитата:
|
#17
|
|||
|
|||
Добавил архив
При запуске надо выбрать файл Тест_Стандартная петля (в архиве лежит) Затем последовательно Заполним точки,Анализ, Проявить Слева две таблички, там наблюдаем глюк В коде изменение переменной строка 321 Да делфи Embarcadero® Delphi® XE2 Version 16.0.4504.48759 |
#18
|
|||
|
|||
Прога берет файл картинки, преобразует в битовую карту и ищет связанные пикселы (аналог bwlable из MATLAB) если выбрать галку в таблицу, реномер, проявить, то в таблице появятся все связанные объекты
под своими номерами. Вот и не работает она при некоторых изображениях на входе, с тестовым примеро точно глючит, если крин шот кода который я оправил пропустить то все ок) |
#19
|
||||
|
||||
Цитата:
Ну вроде кое как переделал на Delphi 7, но теперь при нажатии на кнопку "Анализ" выдаёт ошибку, а всё потому, что метод Svazat вызывается с большим параметром B. А этот параметр указывает номер элемента в массиве. Поставь точку останова на начало метода Svazat и когда программа остановится в этом месте посмотри чему равны значения параметров A и B. У меня A=2, B=1454024: Код:
procedure TF1.Svazat(A: Integer; B: Integer); var ACp, BCp: CP; //Структуры цепочек А и Б APr, BPr: PR_;//Структуры родителей А и Б selIf, RDN_A, RDN_B, RDK_A: Integer; begin ACp := G1.Tcp[A]; BCp := G1.Tcp[b]; // Вот здесь у меня вылетает ошибка так как размер массива Length(G1.Tcp)=481, а переменная B=1454024 |
#20
|
|||
|
|||
Отлично, но у меня все работает без вылетов, следовательно в этом месте переменная имеет нормальное значение
|
#21
|
||||
|
||||
Цитата:
Код:
ShowMessageFmt('Длина массива G1.Tcp=%d; Значение параметра B=%d', [Length(G1.Tpr), B]); Ладно, пойдём другим путём. Во вложении я сделал небольшой пример. Нажатие кнопки "Заполнить" заполняет массив нужными числами, а нажатие кнопки "Прочитать" читает числа из массива в табличку StringGrid1. Видно, что какие числа в массив записали, такие числа и появились в табличке, следовательно упомянутого глюка не существует. |
#22
|
|||
|
|||
Я понимаю что в простом примере не проявляется. Пытаюсь найти ошибки в коде. Сейчас выложу подправленный код, стабильно все картинки открывает без вылетов, только глюк этот остался. Попробуйте запустить
|
#23
|
|||
|
|||
У меня ощущение что в массивах хаотично появляются разный мусор.
|
#24
|
|||
|
|||
По поводу значений в ACp := G1.Tcp[A];
BCp := G1.Tcp[b]; При загрузке некоторых изображений действительно в эти переменные попадает мусор. Но его источник выявить не удается. Изображение сканируется попиксельно и при соотвествии заданному порогу в массив скидывается1 или 0. Так вот в отладчике можно увидеть такую картину : часть массива содержит мусор а далее идут нормальные данные При этом стоит условие что в массив в любом случае будут записаны 0 или 1. Голову уже сломал откуда этот мусор лезет |
#25
|
|||
|
|||
Вот новые подробности!
Назначаю размер массиву заполняю его нулями в цикле Запускаю процедуру ставлю условие на проверку значения из массива вне заданного диапазона (оно не может быть более чем известная переменная) В итоге вылазит несколько ячеек с мусором И это стабильно. Сделал вместо массива чтение запись в StringGrid и глюк пропал!!!!!. Вывод: динамческий двумерный массив после установки его размера и обнуления может содержать мусор, и этот мусор появляется при попытке чтения/записи И еще хохма, вынес фрагмент на котором проявлялся глюк из процедуры в вызывающую процедуру и значение записалось правильно!!!!)) Даже было замечено что вставка по ходу программы фрагмента для вывода информации типа: Memo1.Lines.Add(inttostr(BI.N)+'|'+inttostr(zveno) ); приводит к тому что другой код работает иначе.... Ничего не могу понять, что это? |
#26
|
||||
|
||||
Цитата:
Цитата:
Цитата:
|
#27
|
|||
|
|||
Я тоже так думаю что у меня ошибки, но факты говорят обратное. От мемо1 ничего не зависит, вообще ничего!
Открыл картинку, запустил процесс, в отладчике массив заполнен 0 и 1 как надо, далее чтение и запись, и поехало. При использовании в качестве массива StringGrid все работает мусора нет. Вынес все обращения на чтение/запись в отдельную функцию. поставил условие для выбора варианта использования массив или StringGrid. Проверяю ....и эффект налицо, с массивом сыпятся мусорные значения, StringGrid ничего нет..) Память работает ок, сбоев нет. О великие Гуру кто поставит диагноз...)))??? |
#28
|
|||
|
|||
Выложил последний вариант, при выборе галки в массив, пишет и читает из массива
Строка 560 - обнуление массива перед использованием, потом заполнение данными |
#29
|
|||
|
|||
Нашелся первый косячек...) индексация выходила за границу на 1, поправил, вроде мусор пропал. Остается непонятки с появляющимися значениями в другой строке
|