tablice jako parametry

0

Czesc mam taki problem. Pisze sobie program który ma sporo procedur pobierających jako parametry tablece typu double. Procedury te wywołują się nazwzajem dość czesto przekazując sobie jako parametry tę samą tablice.
Deklaracje tych procedur są typu:

procedure Proc_1(dane:array of double);
procedure Proc_2(dane:array of double); itd.

procedury te działąją poprawnie zarówna dla statycznych jak i dynamicznych tabel;

teraz chce zrobic procedurę:

Trekord=record
WE:array of Double;
WY: array of Double;
end;

procedure proc_3(dane:array of TRekord);

i tu jest problem bo do pól WE i WY rekordu mogę przypisać tylko wskaźniki do tablic (tablice dynamiczne). Przypisanie im adresów tablic statycznych powoduje błędy podczas pracy programu. Po prostu po wywołaniu procedury:

proc_1(dane[1].WE) wewnątrz proc_3

w procedurze proc_1 okazuje się że parametr WE nie wskazuje na żadną tablicę.

Kompilacja jest OK. Może mi ktoś z tym pomóc, po powoli szlag m,nie z tym trafia.

0

Może to głupie ale nie zagłębiałem sie bardzo dokładnie w kod ale może masz coś nie tak z długościami tablic dynamicznych

0

No ale jak Ty to przekazujesz.. wiadomo, że jeśli dasz Tablica_Dynamiczna := Tablica_Statyczna to nie trybi.. W ogóle jeśli nawet masz dać Tablica_Dynamiczna[x]= Tablica_Dynamiczna[x] czyli przekazać element pojedynczy to też tak nie można, bo się tylko wskaźnik ustawia - więc trzeba używac polecenia Copy. Mam nadzieję, że o to chodziło..

A co problemu - przekazuj jako parametr wskaźnik do tego rekordu...

Przykładowo:

type
  TMyRecord = record;
     // tu pola
  end;

var
  MyRecord: TMyRecord;
  RecPointer: ^TMyRecord;

Teraz parametry tak:

procedure Proc1(Rec: RecPointer);

Wywołujesz:

Proc1(@MyRecord);

Oczywiście to jest tylko 'szkicowy' kod - u Ciebie zamień jeszcze na tablicę..

0

Widzę ze trochę się nie zrozumieliśmy. Ten program to siec neuronowa a te procedury służa do jej uczenia. W orginale wyglądają tak:
type
TLearnPack=record
Input:array of Double;
PrefOutput:array of Double;
end;
// te działają poprawnie
procedure UczSiecBP(Input,Output:array of Double);
function ObliczBlad(PrefOutput:array of Double):Double;
procedure ObliczDeltyBP(PrefOutput:array of Double;Kumulacja Boolean=FALSE);
procedure PoprawWagiBP;
// ta sprawia problemy
procedure UczSiecEpokaBP(EpokaSize:Word; Dane:array of TLearnPack);

w skrócie procedura UczSiec wygląda tak

procedure UczSiecBP(Input,Output:array of Double);
begin
// input - wzorzec, podawany na wejście sieci
// output - oczekiwana odpowiedz ze strony sieci.

// jak sieć zareaguje po podany wzorzec
ObliczWyjscieSieci(Input);

// jeśli sieć rozpoznała poprawnie wzorzec (mały błąd) to wyjscie z procedury
// jak nie to kontynuuj naukę
if ObliczBlad(OutPut) <DokladnoscUczenia then Exit;

// obliczanie poprawek dla sieci
ObliczDeltyBP(Output);

// naniesienie poprawek do sieci
PoprawWagiBP;
end;

tablice podane jako parametry są tylko i wyłacznie odczytywane i wszystkie procedury dość intensywnie z nich korzystają, bo same w sobie wywołują kolejne procedury biorące jako parametry te tablice. Tak więc wykowywanie ich kopii dla każdej procedury jest zbyt czasochłonne.

Procedura UczSiecEpokaBP wygląda mniej więcej tak:

procedure UczSiecEpokaBP(EpokaSize:Word; Dane:array of TLearnPack);
var i,k:Integer;
begin
// sprawdzenia długości tabel i inne takie

for i:=0 to Epoka size -1 do
begin
i:=random(Length(dane));

   ObliczWyjscieSieci(dane[i].Input);  
   if ObliczBlad(dane[i].output) <DokladnoscUczenia then Exit;
   ObliczDeltyBP(dane[i].output,TRUE);

end;
PoprawWagiBP;
end;

W pewnym momencie, w środku ObliczWyjscieSieci okazuje się że długość podanej tablicy wynosi zero a program wywala wyjątek EAccesViolation.
Problem jest gdzieś na etapie podawania parametrów.
Procedury jednakowo łykają na wejściu tablice statyczne i dynamiczne typu array of double. Ale już przy próbie przypisania do pola rekordu tablicy statycznej(jej wskaźnika) trzeba użyć @ co nie jest konieczne przy wywoływaniou procedur.

1 użytkowników online, w tym zalogowanych: 0, gości: 1