|
#1
|
|||
|
|||
Ошибка
Вот в чем дело (работаю в console):
Создаю тип: type Num=array of integer; Потом описываю пару переменных: n1, n2, n3 :Num; Пишу рекурсивную процедуру, например: procedure Recurs(ClonN1:num; 'еще переменные'); begin ClonN1['переменная']:=1; ........... Recurs(ClonN1, 'еще переменные'); .......... end; После чего вызываю процедуру в главном блоке: begin Recurs(n1, 'еще переменные'); end. Так вот все значания ClonN1 присваиваются всем переменным типа num. Че за фигня? Хотя, если работать не console, то все ништяк. Это глюк при установке или в самом Delphi? |
#2
|
||||
|
||||
У меня все нормально… Приведи код полностью…
Код:
program Project1; {$APPTYPE CONSOLE} uses SysUtils; type Num = array of integer; var n1, n2, n3: Num; i: integer; procedure Recurs(ClonN1:num; i: integer); begin ClonN1[i] := i; if i < High( ClonN1 ) then Recurs( ClonN1, i+1 ); end; begin SetLength( n1, 10 ); SetLength( n2, 10 ); SetLength( n3, 10 ); Recurs( n1, 0 ); for i := Low( n1 ) to High( n1 ) do Write( IntToStr( n1[i] ), ' ' ); Writeln; for i := Low( n2 ) to High( n2 ) do Write( IntToStr( n2[i] ), ' ' ); Writeln; for i := Low( n3 ) to High( n3 ) do Write( IntToStr( n3[i] ), ' ' ); Readln; end. |
#3
|
|||
|
|||
program Project1;
{$APPTYPE CONSOLE} uses SysUtils,Dialogs; //Пример файла Summer.in //4 //0 1 0 1 //0 0 1 0 //1 0 0 0 //0 1 1 0 type Num=array of integer; type form=array of array of byte; var n,s,j:integer; people:form; number,endnum,view:num; procedure Init; var x,y:integer; begin s:=0; Assign(input,'summer.in'); Reset(input); Readln(n); SetLength(People,n,n); SetLength(Number,n); SetLength(View,n); For y:=0 to n-1 do begin view[y]:=0; For x:=0 to n-1 do begin Read(People[x,y]); end; end; endnum:=number; close(input); end; procedure SaveResult; var i:integer; begin Assign(output,'summer.out'); Rewrite(output); for i:=0 to n-1 do begin write(endnum[i]+1,' '); end; close(output); end; procedure Solve(ClonNum:Num; ClonView:Num; p,l:integer); var i:integer; begin ClonNum[l]:=p; ClonView[p]:=1; l:=l+1; for i:=0 to n-1 do begin if (ClonView[i]=0) and (People[i,p]=1) then begin Solve(ClonNum, ClonView,i,l); end; end; if s<l then begin s:=l; EndNum:=ClonNum; //У меня здесь даже можно и не присваивать end; end; var k:integer; begin Init; for j:=0 to n-1 do begin Solve(number,View,j,0); //Почему то number и view остаются не постоянными end; SaveResult; end. |
#4
|
||||
|
||||
1) Нифига не понял что делает программа…
2) Цитата:
ClonNum[l]:=p; // ClonNum:Num = @number ClonView[p]:=1; // ClonView:Num = @view 3) Цитата:
|
#5
|
|||
|
|||
Вообще это задача, там надо составить список из учеников максимальной длины:
//-------Формат входного файла--------------------- В первой строке входного файла содержится единственное число N (3 ≤ N ≤ 300) - количество учеников в классе. В следующих N строках идет описание класса. В (i+1)-ой строке записано N нолей или единиц. Ноль на j-й позиции означает, что ученик с номером i не знает адрес ученика с номером j, единица означает, что знает. Считается, что сам ученик не знает своего собственного адреса. Гарантируется, что для любых двух различных учеников ровно один из них знает адрес другого //---------------------------------------------------- А как тады передавать массивы - типы этой процедуре? Последний раз редактировалось ART, 10.01.2007 в 17:26. |
#6
|
||||
|
||||
Попробуй в Init и Solve заменить
EndNum:=ClonNum на EndNum:=Copy(ClonNum) и можно еще изменить procedure Solve(ClonNum:Num; ClonView:Num; p,l:integer); на procedure Solve(const ClonNum:Num; const ClonView:Num; p,l:integer); |
#7
|
|||
|
|||
Вот измененный код (пробавал const - не помогает):
program Project1; {$APPTYPE CONSOLE} uses SysUtils,Dialogs; type v=array of boolean; type list=array of integer; var People:array of array of byte; NNum:List; View:v; Num:list; n,s:integer; procedure Init; var x,y:integer; begin s:=0; Assign(input,'summer.in'); Reset(input); Readln(n); SetLength(People,n,n); SetLength(Num,n); SetLength(NNum,n); SetLength(View,n); For y:=0 to n-1 do begin Num[y]:=0; View[y]:=false; NNum[y]:=0; For x:=0 to n-1 do begin Read(People[x,y]); end; end; close(input); end; procedure SaveResult; var i:integer; begin Assign(output,'summer.out'); Rewrite(output); for i:=0 to n-1 do begin write(NNum[i]+1,' '); end; close(output); end; procedure Solve(ClonNum:List; ClonView:v; p,len:integer); var i,k:integer; begin ClonNum[len]:=p; ClonView[p]:=true; len:=len+1; for i:=0 to n-1 do begin if (ClonView[i]=false) and (People[i,p]=1) then begin Solve(ClonNum,ClonView,i,len); end; end; if s<len then begin s:=len; NNum:=Copy(ClonNum); end; end; var j,k:integer; begin Init; for j:=0 to n-1 do begin for k:=0 to n-1 do begin num[k]:=0; view[k]:=false; //Приходится обнулять end; Solve(Num,View,j,0); end; SaveResult; end. |
#8
|
||||
|
||||
program Project1;
{$APPTYPE CONSOLE} uses SysUtils,Dialogs; var People:array of array of byte; NNum:array of integer; View:array of boolean; Num:array of integer; n,s:integer; procedure Init; var x,y:integer; begin s:=0; Assign(input,'c:\summer.in'); Reset(input); Readln(n); SetLength(People,n,n); SetLength(Num,n); SetLength(NNum,n); SetLength(View,n); For y:=0 to n-1 do begin Num[y]:=0; View[y]:=false; NNum[y]:=0; For x:=0 to n-1 do begin Read(People[x,y]); end; end; close(input); end; procedure SaveResult; var i:integer; begin Assign(output,'c:\summer.out'); Rewrite(output); for i:=0 to n-1 do begin write(NNum[i]+1,' '); end; close(output); end; procedure Solve(ClonNum:array of integer; ClonView:array of boolean; p,len:integer); var i,k:integer; begin ClonNum[len]:=p; ClonView[p]:=true; len:=len+1; for i:=0 to n-1 do begin if (ClonView[i]=false) and (People[i,p]=1) then begin Solve(ClonNum,ClonView,i,len); end; end; if s<len then begin s:=len; NNum:=@ClonNum; end; end; var j,k:integer; begin Init; for j:=0 to n-1 do begin for k:=0 to n-1 do begin num[k]:=0; view[k]:=false; //Приходится обнулять end; Solve(Num,View,j,0); end; SaveResult; end. |