...
var st:string;
...
Procedure my_proc(nr:comp);
var nr1:comp;
{
if ((getfirst STATCALC where STATCALC.nrec=nr)=tsok)
{
if (STATCALC.name<>''){ st:=STATCALC.name+'\'+st; }
}
nr1:=STATCALC.cSTATCALC;
if (nr1<>0){my_proc(nr1);}
}
В результате для нулевых(корневых) элементов выводится нормально(без рекурсивного вызова), если подсунуть элемент первого уровня, то нулевой не выводится - getfirst STATCALC where STATCALC.nrec=nr не возвращает tsok
1. getfirst STATCALC where STATCALC.nrec=nr замените на
getfirst STATCALC where (( nr == STATCALC.nrec))
2. с виду все нормально, добавьте мессаги с nr и nr1
3. В вашем случае хватит и while. Рекурсия нужна чтобы развернуть дерево вниз.
function my_proc(nr:comp):string;
var
s:string;
begin
if (getfirst STATCALC where ((nr==STATCALC.nrec))=tsok)
{
s := my_proc(STATCALC.cSTATCALC);
if (s<>'') {
if (STATCALC.name<>''){
s:=STATCALC.name+'\'+s;
}
}
my_proc := s;
end;
...
PushPos(#STATCALC);
message(my_proc(STATCALC.nrec));
PopPos(#STATCALC);
...
Не проверял, но должно работать по логике...
Но вызов my_proc(STATCALC.nrec) меня настораживает. Должен быть либо синоним таблицы либо как я написал.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
По-моему, вы паритесь ) Если нужно просто вывести строку, содержащую всех родителей конкретного узла, то рекурсия тут нужна как мертвому припарка.. Старый добрый цикл никто не отменял.
Vik писал(а):По-моему, вы паритесь ) Если нужно просто вывести строку, содержащую всех родителей конкретного узла, то рекурсия тут нужна как мертвому припарка.. Старый добрый цикл никто не отменял.
В представленном коде нет рекурсии. Как раз цикл.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
цикл все таки while
Вообще не гоже передавать переменной поле таблицы, если там внутри потом идет поиск через эту переменную. Есть шанс нарваться что переменную передадут не значением , а ссылкой. Раньше кроме var .. шло значением, но фиг его знает что сейчас, и как будет потом.
function my_proc(nr:comp):string;
{
external _loop STATCALC where ((nr==STATCALC.nrec))
{
if (STATCALC.name<>''){ my_proc:= my_proc +'/'+STATCALC.name; }
if (STATCALC.cSTATCALC<>comp(0)){my_proc(STATCALC.cSTATCALC);}
}
}