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

Odpowiedz Nowy wątek
2014-12-11 20:04
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

edytowany 3x, ostatnio: furious programming, 2014-12-11 21:26
Wstawiaj kod w znaczniki kolorujące składnię; - furious programming 2014-12-11 21:26

Pozostało 580 znaków

2014-12-11 20:19
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.

Pozostało 580 znaków

2014-12-11 21:00
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;
Pod FPC da się uniknąć warunku w funkcji max - to może konkursik by zrobić? Niech się użytkownicy wykażą :) - furious programming 2014-12-11 22:06

Pozostało 580 znaków

2014-12-11 21:29
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.


edytowany 2x, ostatnio: furious programming, 2014-12-11 21:30
ja używam ale tylko w kontekście kontrolek na formie: butButton1, labLabel1, cbCombo1, fForma itp. (oczywiście nie takie nazwy konkretnie, tylko np. butOK, butCancel) - Azarien 2014-12-11 21:48
Ogólnie wolę z notacją, bo mogę wiele zmiennych nazywać tak samo, jedynie z różnymi przedrostkami; W ogóle lubię mieć wszędzie przedrostki - T dla klas, F dla pól, A dla argumentów itd., kod robi się bardziej czytelny, a nazewnictwo spójne; - furious programming 2014-12-11 21:58

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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