Deklarowanie tablic

0

Witam, zaczynam nauke programowania w Delphi i probuje zrobic program przepisujacy pojedyncze elementy string do tablicy ineteger o dlugosci string, program sie nie kompiluje, kompilator wywala blad "expression expected but array found" oraz "type indentifier expected". Wertuje ksiazke do delphi i wydaje mi sie ze tablica jest dobrze zadeklarowana, ponizej kod

   program Recordapp;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
   liczba1, liczba2:string;
   DlugoscLiczby1,DlugoscLiczby2:integer;


begin
Writeln('Podaj liczbe 1');
Readln(liczba1);
Writeln('Podaj liczbe 2');
Readln (liczba2);
DlugoscLiczby1:=length(liczba1);
DlugoscLiczby2:=length(liczba2);
Writeln(DlugoscLiczby1);
Writeln(DlugoscLiczby2);


var
TablicaLiczba1 : array[1..DlugoscLiczby1]  of Integer; //tu kompilator sie zatrzymuje
TablicaLiczba2 : array[1..DlugoscLiczby2]  of Integer;


readln;


end.



4

W Delphi deklaracje zmiennych muszą być na początku kodu funkcji/procedury a w przypadku zmiennych globalnych przed właściwym kodem z bloku

begin 
.. 
end.

W najnowszym Delphi są od tego wyjątki ale jeśli się uczysz nie warto mieszać.
Odnośnie problemu musisz przerzucić deklarację tablic na początek do pierwszego var a później zmienić rozmiar tablicy dynamicznej przez Setlength.
Pisze z telefonu więc może mało dokładnie.

0

czyli w delphi nie moge sobie inicjowac zminnych w petli albo w trakcie uzyskiwania kolejnych danych od uzytkownika, np. podaj dlugosc tablicy i pozniej deklaracja tablicy o odpowiedniej dlugosci. Tam gdzie wywala mi blad probowalem dla testow zadeklarowac zwykla zmienna integer : **tablica:integer; ** i kompilator to puszczal. Czyli jedynym sposobem na niezasmiecanie programu krótkożyjącymi zmiennymi jest uzywanie procedur? Mozesz podrzucic jakis temat zwiazany z przekazywaniem tablic do funkcji bo pobieznie przejrzalem i to nie jest takie proste jak np w c++. I jeszcze jedno pytanie, jak przy pomocy SetLenth ustawic tablice dwuwymiarowa?

1

Jestem na telefonie i nie mam za bardzo czasu pisać. Poczytaj to
http://docwiki.embarcadero.com/RADStudio/Rio/en/Inline_Variable_Declaration
Zaraz pewnie ktoś pociągnie temat zanim ja bym mógł.

0

ok, dzieki za pomoc

3

Tak, jak napisał @Clarc - w nowszych wersjach jest dopuszczalne deklarowanie zmiennych w innych miejscach/wewnątrz ciała procedury, ale lepiej (przynajmniej na początku) z tego nie korzystać.

Co do tablic dynamicznych - także przeczytaj, co pisał @Clarc - deklarujesz najpierw tablicę, a potem w dowolnym momencie określasz jej rozmiar przez SetLength. Przy czym taka uwaga - w dowolnym miejscu z zastrzeżeniem, że MUSI to się stać przed rozpoczęciem korzystania z takiej tablicy, inaczej będziesz miał problem. No i oczywiście musisz pamiętać, żeby nie odwoływać się do elementów spoza jej zakresu.

Odnośnie fragmentu "jak się przekazuje tablice do funkcji" - nie wiem, co konkretnie masz na myśli, ale ogólnie to się robi zwyczajnie:

var
  Form1: TForm1;
  tablica: array[0..5] of string;

implementation

procedure ZmienNazwe(PrzekazanaTablica: array of String);
var
  Rudder: integer;
begin
  Form1.Caption:= '';
  for Rudder:= 0 to (Length(PrzekazanaTablica) - 1) do
    Form1.Caption:= Form1.Caption + PrzekazanaTablica[Rudder] + ' ';
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  tablica[0]:= 'Ala';
  tablica[1]:= 'ma';
  tablica[2]:= 'kota';
  tablica[4]:= 'głupi';
  tablica[5]:= 'sierściuch';
  ZmienNazwe(tablica);
end;  

Oczywiście jest to przykład mocno uproszczony, ale chyba pokazuje to, o co pytasz ;)

2

@srk71: wiem co Ci po głowie chodzi – VLA. :)

Niestety w Delphi takie cuś nie jest wspierane – możesz albo zadeklarować macierz o statycznym rozmiarze, albo skorzystać z macierzy dynamicznej, której rozmiar można zmieniać podczas działania programu. Sugeruję tę drugą opcję:

var
  Liczba1, Liczba2: String;
var
  // deklaracja macierzy dynamicznych
  Tablica1, Tablica2: array of Integer;
begin
  Write('Podaj liczbe 1: ');
  ReadLn(liczba1);
  Write('Podaj liczbe 2: ');
  ReadLn(liczba2);

  // ustawienie rozmiaru macierzy
  SetLength(Tablica1, Length(Liczba1));
  SetLength(Tablica2, Length(Liczba2));

  // dalszy kod
end.

PS: którego Delphi używasz? Wersję środowiska podaj.

0

Nie do końca chyba że nie zrozumiałem o co chodzi. http://docwiki.embarcadero.com/Libraries/Rio/en/System.DynArraySetLength

0

Chodzi o to, że OP użył zmiennej do określenia rozmiaru macierzy, której wartość definiowana jest później w kodzie (wczytywana z klawiatury), a tego język nie dopuszcza. Trzeba użyć macierzy dynamicznej i tyle.

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