Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

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

 
Боян Георгиев   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
1-1085124955
*Pavel
2004-05-21 11:35
2004.06.06
Найти temp


1-1085380730
therion
2004-05-24 10:38
2004.06.06
как цвет отдельной ячейки в StringGrid


4-1083259132
Seldon
2004-04-29 21:18
2004.06.06
Изменение позиции UpDown a в TTabControl


4-1082601486
DeHuC
2004-04-22 06:38
2004.06.06
TWebBrowser + эмуляция нажатия TAB


1-1085507296
td
2004-05-25 21:48
2004.06.06
большой вопрос про DLL