Deklarowanie tablicy ktorej dlugosc zalezy od inputu

0

Witam,
od niedawna ucze sie programowania w pascalu i mam nastepujacy problem: nie wiem gdzie zadeklarowac tablice ktorej dlugosc bedzie zalezala od danych wejsciowych. Nie moge jej zadeklarowac przed rozpoczeciem wykonania programu skoro nie wiem jaka jest jej dlugosc zanim program sie rozpocznie. Po rozpoczeciu tez nie moge chyba ze wewnatrz jakiejs funkcji, ale wolalbym tego uniknac jesli to mozliwe. Nie moglem nigdzie znalezc odpowiedzi na to pytanie, czy jest jakies proste rozwiazanie tego problemu? Z gory dziekuje za odpowiedz.

0

Skoro nie możesz przed rozpoczęciem, nie możesz po rozpoczęciu to spróbuj po zakończeniu.
A tak serio to napisz konkretnie o co chodzi bo delikatnie mówiąc namąciłeś.

0

Poczytaj o tablicach dynamicznych oraz SetLength.

0
AnonimowyTyracz napisał(a)

od niedawna ucze sie programowania w pascalu [...]

Pytacz napisał, że uczy się pascala, stąd podejżewam, że pisze pewnie w TP7 - stąd nie ma do dyspozycji macierzy dynamicznych; Mam nadzieję, że to nieprawda, że ma lepsze IDE i po prostu nie wie, że istnieją tablice dynamiczne :]

2
Var
  tablica : Array of TYP;
  a : integer;

begin
  readln (a)
  SetLength(tablica, a);
end;

Jak to CI nie zadziała to polecam te dwa linki:
http://www.freepascal.org/
http://www.lazarus.freepascal.org/

0

Dzieki wszystkim, to co napisal babubabu faktycznie dziala. Jeszcze szybkie pytanie: Czy da sie cos podobnego zrobic z typami? To jest jesli mam np. Type = array [1..N] of integer i wiem ze N bedzie na wejsciu, to jak i gdzie zadeklarowac taki typ? Jeszcze raz dzieki z gory.

0

Czy da sie cos podobnego zrobic z typami? To jest jesli mam np. Type = array [1..N] of integer i wiem ze N bedzie na wejsciu [...]

Nie, nie można w ten sposób; Jeżeli deklarujesz macierz statyczną jako stała lub zmienna, to jej rozmiar musi być nie tyle wpisany na sztywno, co znany w momencie kompilacji; Czyli możesz np. tak:

const
  N = 9;
var
  MyArray: array [0 .. N] of Integer;

Wtedy kompilator wie jaki jest rozmiar macierzy, bo N jest stałe; Natomiast inaczej nie ma możliwości (a przynajmniej ja nie znam lub nie pamiętam), np. taki zapis:

procedure Foo(const ACount: Byte);
var
  MyArray: array [0 .. ACount] of Byte;
begin
  { do something }
end;

jest nieprawidłowy z punktu widzenia kompilatora i zasygnalizuje błąd:

[Error] XXX.pas(XXX): Constant expression expected
Jest możliwość także wykorzystać jakąś funkcję do określenia wartości dla N, dla przykładu Succ (zwraca podaną w parametrze liczbę powiększoną o 1):

procedure Foo();
const
  N = Succ(10);
var
  MyArray: array [0 .. N] of Byte;
begin
  { do something }
end;
0

Ok dzieki za odpowiedz.

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