nutnost pouzivania argumentov funkcii a procedur v jazyku PASCAL

Sekcia: Programovanie 03.01.2009 | 19:50
Avatar slazer   Používateľ
Dobry.

Chcel by som sa spýtať, či treba predávať globálne premenné definované v hlavnom programe pomocou argumentov, alebo to nie je potrebné. Je v tom vôbec nejaký rozdiel?
var a:integer;

procedure moznost1;
begin
a:=1;
end;

procedure moznost2(var a:integer);
begin
a:=2;
end;

begin
moznost1; {a=1}
moznost2(a); {a=2}
end.

V tejto ukazke napriklad v "moznost1" toto predanie parametrami vynechavam. V tomto pripade to sice funguje, ale je to korektne? Bude to fungovat vzdy spravne?

Dakujem
    • Re: nutnost pouzivania argumentov funkcii a procedur v jazyku PASCAL 03.01.2009 | 20:13
      Avatar slazer   Používateľ
      Hmm. Zistil som, že ak nejakú procedúru volám z hlavného programu, tak premenná ktorá bola v hlavnom programe inicializovaná je inicializovaná aj v procedúre.

      Aha práve som to zistil.
      var a:integer;

      procedure dva;
      begin
      writeln(a); {}
      read(a);
      end;

      procedure jedna(a:integer);
      begin
      a:=10;
      dva;
      end;

      begin
      a:=20;
      jedna(a);
      end.

      Teda ked pracujem s premennou "a" v procedure "dva" tak je to vlastne ta globalna prenenna "a" a nie lokalna verzia z oboru platnosti funkcie "jedna", z ktorej som ju volal. Nebolo by logickejšie keby zo bola tá premenná z volanej funkcie? Je to v ostatných jazykoch rovnako?

      Dakujem za odpoved


    • Re: nutnost pouzivania argumentov funkcii a procedur v jazyku PASCAL 03.01.2009 | 21:43
      Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
      >> treba predávať globálne premenné definované v hlavnom programe pomocou argumentov ?

      nie

      >> Teda ked pracujem s premennou "a" v procedure "dva" tak je to vlastne ta globalna prenenna "a"

      ano

      >> teda nie lokalna verzia z oboru platnosti funkcie "jedna"

      lokalne premenne su neviditelne mimo vlastnu proceduru

      >> Nebolo by logickejšie keby zo bola tá premenná z volanej funkcie?

      nie, mohol by si lubovolne menit lokalne premenne "rodicovskej funkcie", program by bol imho neudrziavatelny, predstav si toto:
      procedure aaa;
      var a,b,c : integer;
      begin
        a := 123;
        b := 666;
        c := sin(5);
        writeln(c);
      end;
      

      Funckcia "sin" je nejaka cudzia funkcia. Urcite by jej autor potreboval nejake pomocne premenne na docasne vypocty, medzisucty atd. Keby si nahodou on zvolil pomocnu premennu "a" tak by prepisal tvoju premennu a. Cize autor funckie sinus by musel poznat mena vsetkych lokalnych premennych vo vsetkych existujucich aj buducich programoch a musel by pouzit iny identifikator.
      program pokus;	      // namespace pre globalne premmene
      
      var p : integer = 5;  // plobalna premenna p
      
      procedure foo;
      begin
        writeln(p);         // vypise plobalnu premennu
      end;
      
      procedure bar(p : integer);
      begin
        writeln(p);         // vypise parameter p 
      end;
      
      procedure zzz;
      var p : integer;     // lokalna premenna ma prioritu pred globalnou
      begin
        p := 1234;         // globalnu nezmeni
        writeln(p);        // vypise lokalnu
        writeln(pokus.p);  // vypise globalnu premennu (program,unit,self alebo inherited je namespace identifikator)
      end;
      
      begin
        zzz;               // 1234, 5
        foo;               // 5
        bar(666);          // 666
      end.