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.