Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.01.2007, 14:28
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию Ошибка

Вот в чем дело (работаю в 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  
Старый 10.01.2007, 15:34
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

У меня все нормально… Приведи код полностью…
Код:
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  
Старый 10.01.2007, 16:08
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

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  
Старый 10.01.2007, 17:00
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

1) Нифига не понял что делает программа…
2)
Цитата:
Solve(number,View,j,0);
//Почему то number и view остаются не постоянными
Потому что в процедуре Solve ты делаешь
ClonNum[l]:=p; // ClonNum:Num = @number
ClonView[p]:=1; // ClonView:Num = @view
3)
Цитата:
EndNum:=ClonNum; //У меня здесь даже можно и не присваивать
Естественно! В процедуре Init ты делаешь endnum:=number; Т.к. твои массивы динамические, то этим действием ты копируешь в EndNum указатель (ссылку) на ClonNum. То есть и EndNum и ClonNum указывают на одну область памяти…
Ответить с цитированием
  #5  
Старый 10.01.2007, 17:23
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Вообще это задача, там надо составить список из учеников максимальной длины:
//-------Формат входного файла---------------------
В первой строке входного файла содержится единственное число N (3 ≤ N ≤ 300) - количество учеников в классе. В следующих N строках идет описание класса. В (i+1)-ой строке записано N нолей или единиц. Ноль на j-й позиции означает, что ученик с номером i не знает адрес ученика с номером j, единица означает, что знает. Считается, что сам ученик не знает своего собственного адреса. Гарантируется, что для любых двух различных учеников ровно один из них знает адрес другого
//----------------------------------------------------

А как тады передавать массивы - типы этой процедуре?

Последний раз редактировалось ART, 10.01.2007 в 17:26.
Ответить с цитированием
  #6  
Старый 10.01.2007, 17:52
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Попробуй в 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  
Старый 10.01.2007, 18:27
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Вот измененный код (пробавал 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  
Старый 11.01.2007, 00:33
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter