Funkcje i deklaracja lokalnych zmiennych - dlaczego działa bez?

0

Witam,
Bawię się funkcjami w Pascalu, jednak nie rozumiem dlaczego mój pierwszy kod nie działa. W Lazarusie podkreśla mi linijkę:

result: integer;

Sądziłem, że zanim użyję zmiennej w Pascalu muszę pierwsze określić jej typ, a okazuje się, że nie dosyć, że poniższy kod nie działa i nię mogę doszukać się przyczyny błędu, to po usunięciu deklaracji zmiennej result, ale zostawieniu reszty kodu, łącznie z fragmentami gdzie używam tej zmiennej - wszystko działa. Nie rozumiem dlaczego.

var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;
begin
   if (num1 > num2) then
      result := num1
   else
      result := num2;
   max := result;
end;
begin
   a := 100;
   b := 200;
  (* calling a function to get max value *)
   ret := max(a, b);
   writeln( 'Max value is : ', ret );
end.

Poniżej ten sam tylko z usuniętą częścią deklaracyjną w funkcji. O dziwo działa.

var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;

begin
   if (num1 > num2) then
      result := num1
   else
      result := num2;
   max := result;
end;
begin
   a := 342;
   b := 200;
  (* calling a function to get max value *)
   ret := max(a, b);
   writeln( 'Max value is : ', ret );
   readln;
end.

dodanie znaczników <code class="delphi"> - @furious programming

1

W pascalu w funckji automatycznie jest deklarowana zmienna o nazwie Result która ma typ taki, jak określa funkcja. Co do błędu, który miałeś w linijce z deklaracją - pewnie jakbyś spróbował zrozumieć treśc błędu, to wyjaśniała by ona, ze jest redeklaracja (próba zadeklarowania drugi raz zmiennej o tej samej nazwie) zmiennej result.

1

Twój kod wygląda na baaaaardzo wiekowy. W starych Pascalach wartość z funkcji zwracało się przypisując wartość do zmiennej o nazwie takiej jak funkcja:

function dwa:integer;
begin
  dwa:=2;
end;

nowsze kompilatory, jak Delphi i FPC (z którego korzysta Lazarus) mają zmienną o nazwie Result służącą do tego samego celu:

function dwa:integer;
begin
  result:=2;
end;

stary sposób oczywiście nadal działa. ale skutkiem tego jest, że nie można zdefiniować zmiennej lokalnej o nazwie result, bo taka już jest.

function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;
begin
   if (num1 > num2) then
      result := num1
   else
      result := num2;
   max := result;
end;

Ta zmienna jest nawet niepotrzebna, bo przecież można napisać tak:

function max(num1, num2: integer): integer;
begin
   if (num1 > num2) then
      max := num1
   else
      max := num2;
end;

a w Delphi/Lazarusie dodatkowo tak:

function max(num1, num2: integer): integer;
begin
   if (num1 > num2) then
      result := num1
   else
      result := num2;
end;
0

W sumie wszystko zostało już powiedziane w tym temacie - Result to ukryta zmienna, więc nie możesz zadeklarować takiej drugiej; Gdybyś jednak zainteresował się notacją węgierską i chciałbyś ją stosować, to Twoja zmienna nazywałaby się iResult lub intResult, co wykluczyło by wszelkie błędy redeklaracji; Ale to tylko sugestia, dlatego że wielu uważa notację węgierską za zło - rzecz gustu;

Osobiście korzystam z tej notacji, dlatego też ją polecam.

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