Stack overflow w procedurze, potrzebna szybka rada.

0

Witajcie !

Staram się napisać program który wczyta macierze przerobi je wg wzoru i zapisze do pliku binarnego.
Niestety na poziomie procedury program wywala mi komunikat o przepełnieniu stosu.
Nie mogę dołapać się co jest tu źle dlatego proszę o pomoc.
Oto kod:

uses
  SysUtils,
  Math;

type macierz=array[1..250,1..250,1..250] of single;
var i,j,wiersz,kolumna,nr:integer;
    S,T:macierz;
    A:single;
    p:text;
    PlikDocelowy:file of macierz;
    JEDYNKA:single;

PROCEDURE WczytajMacierz(T:macierz ; w,k:integer ; var n:integer);
  var i,j:integer;
  begin
  readln;
  writeln('Macierz T: ');
  writeln;
  for i:=1 to w-1 do
    begin
    for j:=1 to k-1 do
      begin
      read(p,T[n,w,k]);
      write(T[n,w,k]:2:0,' ');
      end;
    writeln;
    end;
  end;

begin
  writeln('PROGRAM PRZERABIAJACY MACIERZE Z PLIKU');
  writeln;
  writeln('Podaj parametr A: ');
  readln(A);

  assign(p,'macierze.txt');
  reset(p);

    assign(PlikDocelowy,'Macierze-S');
    rewrite(PlikDocelowy);
    nr:=0;

      repeat
      nr:=nr+1;
      readln(p,wiersz,kolumna);
      if (wiersz mod 2 = 0) then JEDYNKA:=1 else JEDYNKA:=-1;
      if (kolumna mod 2 = 0) then JEDYNKA:=1 else JEDYNKA:=-1;
      readln;
      WczytajMacierz(T,wiersz,kolumna,nr);
      writeln;
      for i:=1 to wiersz do
        begin
        for j:=1 to kolumna do
          begin
          writeln('T[',nr,',',wiersz,',',kolumna,'] = ',T[nr,wiersz,kolumna]);
          end;
        end;
      Writeln('Macierz S: ');
      for i:=1 to wiersz do
        begin
        for j:=1 to kolumna do
          begin
          S[nr,wiersz,kolumna]:=sqrt(abs(JEDYNKA*T[nr,wiersz,kolumna]+JEDYNKA*T[nr,kolumna,wiersz]))/(sin(T[nr,wiersz,kolumna])+A);
          write(S[nr,wiersz,kolumna]:2:0,' ');
          end;
        writeln;
        end;
      write(PlikDocelowy,S);
      until (wiersz=0) and (kolumna=0);
    close(PlikDocelowy);
  close(p);
  writeln;
  Writeln('GRATULACJE!! Przerobiono ',nr-1,' macierzy T na S!');
  Writeln('Plik zostal zapisany binarnie pod nazwa "MacierzeS"');
  readln;
end.

A oto komunikat który wyskakuje na ułamek sekundy po wpisaniu wartośći "A" i wciśnięciu Enter:

Exception EStackOverflow in module cwkolos.exe at 000089C7.
Stack overflow.

Serdecznie dziękuję za każdy odzew i wybaczcie błędy programowe.

1

ile tych macierzy nasz w pliku? Każda macierz to kilkadziesiąt megabajtów (jeśli dobrze liczę), może pamięci zabrakło...?

0

Macierzy z pliku czyta jedną:
3 3 - najpierw rozmiar tablicy
2 1 2
1 2 1 - tablica
2 1 2
0 0
program liczy póki nie dojdzie do rozmiaru tablicy [0,0]
tak więc musi przeczytać jedną tablicę.

0

Miałeś rację LukeJL zbyt duży rozmiar tablicy spowodował przepełnienie stosu [1..250,1..250,1..250] zamieniłem na [1..250,1..250] i działa. Jeden wymiar odpowiadał tylko za numer tablicy na której były przeprowadzane obliczenia, także zmieniłem to i wszystko jest okej.

Temat do zamknięcia.

1

@podlas00 - zamiast zapisywać do pliku po jednej liczbie, zapisz od razu albo cały wiersz (jeden po drugim), albo całą tablicę; Zwróć uwagę, że kolejne elementy tablicy istnieją w pamięci obok siebie, więc możesz zapisać cały wiersz, od pierwszego elementu do ostatniego, obliczając odpowiednio jego rozmiar - SizeOf(Single) * ilość_elementów w wierszu/tablicy;

Poza tym zainteresuj się klasą strumienia plikowego, czyli TFileStream; Daje ona większą wygodę grzebania w plikach;

LukeJL napisał(a)

Każda macierz to kilkadziesiąt megabajtów (jeśli dobrze liczę)

Niecałe 60MiB, więc sporo;


PS: Wątków na tym forum się nie zamyka; Jedyne co możesz (i wypadałoby) zrobić, to rozdać plusiki pomocnym postom i zaakceptować ten, który zawiera rozwiązanie problemu; I pamiętaj o tym w przyszłości, że w ten sposób zakańcza się wątki oraz dziękuje za okazaną pomoc.

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