Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 14.12.2012, 15:47
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от AlexA
Скриншот кода с двумя вариантами добавил
И как я по этим скриншотам проверю у себя этот глюк? У меня Delphi 7 скриншоты вместо исходников не принимает.
Ответить с цитированием
  #17  
Старый 14.12.2012, 15:51
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Добавил архив

При запуске надо выбрать файл Тест_Стандартная петля (в архиве лежит)
Затем последовательно Заполним точки,Анализ, Проявить

Слева две таблички, там наблюдаем глюк

В коде изменение переменной строка 321

Да делфи Embarcadero® Delphi® XE2 Version 16.0.4504.48759
Ответить с цитированием
  #18  
Старый 14.12.2012, 16:00
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Прога берет файл картинки, преобразует в битовую карту и ищет связанные пикселы (аналог bwlable из MATLAB) если выбрать галку в таблицу, реномер, проявить, то в таблице появятся все связанные объекты
под своими номерами. Вот и не работает она при некоторых изображениях на входе, с тестовым примеро точно глючит, если крин шот кода который я оправил пропустить то все ок)
Ответить с цитированием
  #19  
Старый 14.12.2012, 16:28
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от AlexA
Да делфи Embarcadero® Delphi® XE2 Version 16.0.4504.48759
У меня то как раз XE2 и не стоит.
Ну вроде кое как переделал на 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  
Старый 14.12.2012, 17:03
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Отлично, но у меня все работает без вылетов, следовательно в этом месте переменная имеет нормальное значение
Ответить с цитированием
  #21  
Старый 14.12.2012, 19:52
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от AlexA
Отлично, но у меня все работает без вылетов, следовательно в этом месте переменная имеет нормальное значение
Дело в том, что если у тебя работает без вылетов, то из этого совершенно не следует, что в этом месте переменная имеет нормальное значение. Вот если бы ты там поставил точку останова и посмотрел значения, или добавил бы сразу после begin такую строчку:
Код:
  ShowMessageFmt('Длина массива G1.Tcp=%d; Значение параметра B=%d', [Length(G1.Tpr), B]);
тогда можно было бы говорить, что значение параметра B действительно имеет нормальное значение.

Ладно, пойдём другим путём. Во вложении я сделал небольшой пример. Нажатие кнопки "Заполнить" заполняет массив нужными числами, а нажатие кнопки "Прочитать" читает числа из массива в табличку StringGrid1. Видно, что какие числа в массив записали, такие числа и появились в табличке, следовательно упомянутого глюка не существует.
Вложения
Тип файла: zip Test.zip (2.5 Кбайт, 2 просмотров)
Ответить с цитированием
  #22  
Старый 14.12.2012, 20:46
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Я понимаю что в простом примере не проявляется. Пытаюсь найти ошибки в коде. Сейчас выложу подправленный код, стабильно все картинки открывает без вылетов, только глюк этот остался. Попробуйте запустить
Ответить с цитированием
  #23  
Старый 14.12.2012, 21:18
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

У меня ощущение что в массивах хаотично появляются разный мусор.
Ответить с цитированием
  #24  
Старый 14.12.2012, 22:03
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

По поводу значений в ACp := G1.Tcp[A];
BCp := G1.Tcp[b];

При загрузке некоторых изображений действительно в эти переменные попадает мусор. Но его источник выявить не удается. Изображение сканируется попиксельно и при соотвествии заданному порогу в массив скидывается1 или 0. Так вот в отладчике можно увидеть такую картину : часть массива содержит мусор а далее идут нормальные данные
При этом стоит условие что в массив в любом случае будут записаны 0 или 1.

Голову уже сломал откуда этот мусор лезет
Ответить с цитированием
  #25  
Старый 16.12.2012, 16:13
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Вот новые подробности!
Назначаю размер массиву
заполняю его нулями в цикле
Запускаю процедуру
ставлю условие на проверку значения из массива вне заданного диапазона (оно не может быть более чем известная переменная)
В итоге вылазит несколько ячеек с мусором
И это стабильно.
Сделал вместо массива чтение запись в StringGrid и глюк пропал!!!!!.
Вывод: динамческий двумерный массив после установки его размера и обнуления может содержать мусор, и этот мусор появляется при попытке чтения/записи
И еще хохма, вынес фрагмент на котором проявлялся глюк из процедуры
в вызывающую процедуру и значение записалось правильно!!!!))

Даже было замечено что вставка по ходу программы фрагмента для вывода информации типа:
Memo1.Lines.Add(inttostr(BI.N)+'|'+inttostr(zveno) );
приводит к тому что другой код работает иначе....
Ничего не могу понять, что это?
Ответить с цитированием
  #26  
Старый 16.12.2012, 19:09
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от AlexA
Вывод: динамческий двумерный массив после установки его размера и обнуления может содержать мусор, и этот мусор появляется при попытке чтения/записи
Самопроизвольно мусор в массиве появиться не может. Хотя может у тебя на компьютере битая оперативная память? Ну или там вирусы?
Цитата:
Сообщение от AlexA
И еще хохма, вынес фрагмент на котором проявлялся глюк из процедуры
в вызывающую процедуру и значение записалось правильно!!!!))
Значит что-то не учитываешь.
Цитата:
Сообщение от AlexA
Даже было замечено что вставка по ходу программы фрагмента для вывода информации типа:
Memo1.Lines.Add(inttostr(BI.N)+'|'+inttostr(zveno) );
приводит к тому что другой код работает иначе....
Ничего не могу понять, что это?
Возможно тот код зависит от содержимого Memo1 ?
Ответить с цитированием
  #27  
Старый 16.12.2012, 20:30
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Я тоже так думаю что у меня ошибки, но факты говорят обратное. От мемо1 ничего не зависит, вообще ничего!
Открыл картинку, запустил процесс, в отладчике массив заполнен 0 и 1 как надо, далее чтение и запись, и поехало. При использовании в качестве массива StringGrid все работает мусора нет. Вынес все обращения на чтение/запись в отдельную функцию. поставил условие для выбора варианта использования массив или StringGrid. Проверяю ....и эффект налицо, с массивом сыпятся мусорные значения, StringGrid ничего нет..)
Память работает ок, сбоев нет.

О великие Гуру кто поставит диагноз...)))???
Ответить с цитированием
  #28  
Старый 16.12.2012, 20:50
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Выложил последний вариант, при выборе галки в массив, пишет и читает из массива
Строка 560 - обнуление массива перед использованием, потом заполнение данными
Ответить с цитированием
  #29  
Старый 16.12.2012, 21:45
AlexA AlexA вне форума
Прохожий
 
Регистрация: 14.12.2012
Сообщения: 18
Репутация: 10
По умолчанию

Нашелся первый косячек...) индексация выходила за границу на 1, поправил, вроде мусор пропал. Остается непонятки с появляющимися значениями в другой строке
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter