Форум: "Основная";
Текущий архив: 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