Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Непонятное значение локальной переменной функции и составные типы в FPC

Автор: TuM0xA 16.01.2018 5:17

TYPE arr=array[1..19] of byte; digCnt=array[0..9] of byte;

function calc(const r,q,len:byte; var a:digCnt; const b:arr; var res:arr):boolean;
var i,d,c:byte;
begin
if q <> 0 then begin write('блять',q); halt end;
if r > len then begin
calc:=true;
exit
end; //выход из рекурсии
if q > 0 then c:=9
else c:=b[r];
for i:=c downto 0 do
if a[i]>0 then begin
dec(a[i]);
res[r]:=i;
if b[r]>i then d:=1;
if calc(r+1,d,len,a,b,res) then begin
calc:=true;
exit
end
else begin
inc(a[i]);
res[r]:=0;
calc:=false;
end
end;

end;

VAR a:array[0..9] of byte;
b,res:arr;
i,d,len1,len2,q,r:byte; c:char;

BEGIN
read©;
repeat
inc(len1);
d:=ord©-48;
inc(a[d]);
read©;
until c=#13;
readln;

read©;
repeat
d:=ord©-48;
inc(len2);
b[len2]:=d;
read©;
until c=#13;

r:=len2-len1 + 1;
if b[r]=0 then q:=1;

calc(r,q,len2,a,b,res);
for i:=r to len2 do write(res[i]);

END.

TYPE arr=array[1..19] of byte; digCnt=array[0..9] of byte;

function calc(const r,q,len:byte; var a:digCnt; const b:arr; var res:arr):boolean;
var i,d,c:byte;
begin
if q <> 0 then begin write('хуйня ебучая ебаный в рот блять',q); halt end;
if r > len then begin
calc:=true;
exit
end; //выход из рекурсии
if q > 0 then c:=9
else c:=b[r];
for i:=c downto 0 do
if a[i]>0 then begin
dec(a[i]);
res[r]:=i;
if b[r]>i then d:=1;
if calc(r+1,d,len,a,b,res) then begin
calc:=true;
exit
end
else begin
inc(a[i]);
res[r]:=0;
calc:=false;
end
end;

end;

VAR a:digCnt;
b,res:arr;
i,d,len1,len2,q,r:byte; c:char;

BEGIN
read©;
repeat
inc(len1);
d:=ord©-48;
inc(a[d]);
read©;
until c=#13;
readln;

read©;
repeat
d:=ord©-48;
inc(len2);
b[len2]:=d;
read©;
until c=#13;

r:=len2-len1 + 1;
if b[r]=0 then q:=1;

calc(r,q,len2,a,b,res);
for i:=r to len2 do write(res[i]);

END.



переменная q (локальная), в функции имеет абсолютно непонятное значение, когда на месте параметра q в функцию закидывается 0, при обращении к q оказывается что она имеет значение 68.
и ещё, почему можно использовать как параметр массив a, он же имеет другой тип

Автор: OCTAGRAM 16.01.2018 16:58

На местo параметра q при рекурсии поступает значение из переменной d, которая в зависимости от того, что в if, может оставаться неинициализированной. Какой мусор был на стеке, такое и будет значение d, а после рекурсивного вызова — значение q.

У массива a формальный тип совпадает. И формально, и реально массив от 0 до 9 из Char с правом на чтение/запись, значит, подходит.

Ненормативная лексика на форуме нежелательна.

Автор: TuM0xA 16.01.2018 22:32

Цитата
На местo параметра q при рекурсии поступает значение из переменной d, которая в зависимости от того, что в if, может оставаться неинициализированной. Какой мусор был на стеке, такое и будет значение d, а после рекурсивного вызова — значение q.

Спасибо, и блин, как же все таки непривычно следить за такими вещами после дотнета.
Цитата
У массива a формальный тип совпадает. И формально, и реально массив от 0 до 9 из Char с правом на чтение/запись, значит, подходит.
надо почитать

Цитата
Ненормативная лексика на форуме нежелательна.

извиняюсь, просто было поздно, и я забыл стереть свою 'отладочную информацию'