Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];

Вниз

Проблем с рекурсии   Найти похожие ветки 

 
Боян Георгиев   (2004-05-22 22:34) [0]

TCrossWord = array of array of char;

function Combine(Cwd: TCrossword): boolean;
begin
...
 if Combine(GetNewCrossword(Cwd))
    then ...
...

end;

Runtime error 204.
При трасирования проблемы нет, програма достигает "еnd." успешно, но когда запускаю .ехе файла без дебугер-а, дает ошибка 204.

Возможно ли есть проблем с параметра Cwd: TCrossword, это динамичная матрица чар-ов?

Проблем очень странны, я думаю. Дебугер явно "заличает" ошибку.

(функция GetNewCrossword создает копие параметра и возврощает копия как результатом)

Если кто-то знает чего ни будь по вопросом, подскажите где проблем?


 
Mim1 ©   (2004-05-22 22:49) [1]

1) потоков в программе нет?
2) не получается ли что под отладчиком испольняется одна программа, а без него другая?
3) одни ли и теже условия в обоих случаях при выполнении программы?

Про TCrossWord не уверен, можно попробовать так
TCrossWord = array of array of char;

function Combine(Cwd: TCrossword): boolean;
 function recurive_func:boolean;
 begin
    ... if recurive_func(GetNewCrossword(Cwd)) then
 end;
begin
 result := recurive_func;
end;


 
Внук ©   (2004-05-22 23:17) [2]

Проблема явно не в приведенном коде. Нужно подробнее, как выделяется\освобождается память для Cwd, и как он заполняется.


 
Боян Георгиев   (2004-05-22 23:35) [3]

Это как выделяется память для Cwd:

 function GetNewCrossword(CroBword: TCrossWord): TCrossWord;
 var col, row: integer;
 begin
   SetLength(Result, Width + 1);
   for col := 1 to Width do
     SetLength(Result[col], Height + 1);
   for row := 1 to Height do
     for col := 1 to Width do
     Result[col, row] := CroBword[col, row];

 end;


Памятю нигде не освобождаю, надеюсь что процедура сама освобождает ее в конце процедуры.

Код выполнении матрицы очень долгий, но не изпользую SetLength освен в данную процедуру GetNewCrossword.


 
jack128 ©   (2004-05-22 23:46) [4]


> for col := 1 to Width do
>      SetLength(Result[col], Height + 1);
Ты именно это хотел? может цикл от 0 до Width - 1 ?? Тоже к другому циклу..


 
Боян Георгиев   (2004-05-23 00:06) [5]

jack128, я именно это хотел, позиция 0 не изпользувется


 
Боян Георгиев   (2004-05-23 00:06) [6]

jack128, я именно это хотел, позиция 0 не изпользуется


 
Jel ©   (2004-05-23 00:06) [7]


> надеюсь что процедура сама освобождает ее в конце процедуры.

А не в этом ли заключается проблема? Массив как результат функции передается по ссылке, но куда указывает эта ссылка, если память про завершению процедуры уже освобождена?
Соответственно и получаешь 204 - Invalid pointer operation.


 
Боян Георгиев   (2004-05-23 00:13) [8]

Jell, да, передаю по адресе параметр, но передаю копие массива через функции GetNewCrossword, нет реалный массив.


 
Внук ©   (2004-05-23 18:13) [9]

Хм. Пока ничего страшного не увидел...
 Есть мысль, что если Height и Width меняются от вызова к вызову, то на обратном ходе рекурсии возможен выход за пределы массива.
 Кроме того, если осуществляется многократный SetLength для одной и той же переменной, адрес массива может измениться, и на обратном ходе рекурсии соответствующие ссылки будут невалидны. Можно, например, в целях отладки после каждого SetLength писать текущее значение адресов строк и столбцов  в файл, а потом сравнить.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.035 c
6-1082466371
alan2
2004-04-20 17:06
2004.06.06
Пересылка файла через Сокеты от клиента к серверу


3-1084451175
Maxim Volobuev
2004-05-13 16:26
2004.06.06
Сортировка по вычисляемому полю


1-1085546834
Анатолий
2004-05-26 08:47
2004.06.06
Блокирование файлов как винда блокирует некоторые свои


1-1085127834
Alex
2004-05-21 12:23
2004.06.06
могу ли я использовать массив в Delphi с динамическими границами


1-1085088491
ZedeS
2004-05-21 01:28
2004.06.06
Фокус на Edit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский