1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy Károly Főiskola Számítástudományi tsz
2 Paraméterek típusai: Bemenő paraméter: az értéket az alprogram felhasználja Átmenő paraméter: az érték helyén egy egyező típusú változót kell megadni, az alprogram felhasználja a benne lévő értéket, és meg is változtatja Kimenő paraméter: az érték helyén egy egyező típusú változót kell megadni, az alprogram nem használja fel a benne levő értéket, de megváltoztatja
3 Bemenő paraméter: static int Osszege( int[] tomb ) { int sum=0; foreach(int x in tomb) sum+=x; return sum; } static int Osszege( int[] tomb ) { int sum=0; foreach(int x in tomb) sum+=x; return sum; } static void Main() { int[] a = new int[300]; … feltöltés elemekkel … int x = Osszege(a); int[] b = new int[15]; … feltöltés elemekkel … int z = Osszege(b); } static void Main() { int[] a = new int[300]; … feltöltés elemekkel … int x = Osszege(a); int[] b = new int[15]; … feltöltés elemekkel … int z = Osszege(b); }
4 Átmenő paraméter: static void Rendezes( int[] tomb ) { for(int i=0;i<tomb.Length-1;i++) for(int j=i+1;j<tomb.Length;j++) if( tomb[i]>tomb[j]) { int z=tomb[i]; tomb[i] = tomb[j]; tomb[j]=z; } static void Rendezes( int[] tomb ) { for(int i=0;i<tomb.Length-1;i++) for(int j=i+1;j<tomb.Length;j++) if( tomb[i]>tomb[j]) { int z=tomb[i]; tomb[i] = tomb[j]; tomb[j]=z; } static void Main() { int[] a = new int[300]; … feltöltés elemekkel … Rendezes (a); } static void Main() { int[] a = new int[300]; … feltöltés elemekkel … Rendezes (a); }
5 Kimenő paraméter: static void Feltoltes( int[] tomb ) { Random rnd = new Random(); for(int i=0;i<tomb.Length;i++) tomb[i] = rnd.Next(10,100); } static void Feltoltes( int[] tomb ) { Random rnd = new Random(); for(int i=0;i<tomb.Length;i++) tomb[i] = rnd.Next(10,100); } static void Main() { int[] a = new int[300]; Feltoltes (a); } static void Main() { int[] a = new int[300]; Feltoltes (a); }
6 Paraméterek típusai: Bemenő paraméter: az értéket az alprogram felhasználja Alapértelmezett paraméterátadás, nem kell semmilyen extra jelölést használni A hívás helyén egyszerű adattípus esetén akár kifejezést is lehet írni
7 Bemenő paraméter: static int Osszead( int a, int b ) { return a+b; } static int Osszead( int a, int b ) { return a+b; } static void Main() { int x = 13; int f = Osszead( 3, x ); int g = Osszead( f-1, f*2 ); int h = Osszead( Szoroz(2,8)+1,f*2 ); } static void Main() { int x = 13; int f = Osszead( 3, x ); int g = Osszead( f-1, f*2 ); int h = Osszead( Szoroz(2,8)+1,f*2 ); }
8 Kimenő paraméter: static void ElsoUtolso( int[] t, int elso, int utolso ) { elso=-1; utolso=-1; for(int i=0;i<t.Length;i++) { if (t[i]==0 && elso==-1) elso=i; if (t[i]==0) utolso=i; } static void ElsoUtolso( int[] t, int elso, int utolso ) { elso=-1; utolso=-1; for(int i=0;i<t.Length;i++) { if (t[i]==0 && elso==-1) elso=i; if (t[i]==0) utolso=i; } static void Main() { int[] h = new int[30]; int a,b; ElsoUtolso(h, a, b); Console.WriteLine(”{0},{1}”,a,b); } static void Main() { int[] h = new int[30]; int a,b; ElsoUtolso(h, a, b); Console.WriteLine(”{0},{1}”,a,b); }
9 Kimenő paraméter: static void ElsoUtolso( int[] t, int elso, int utolso ) { } static void ElsoUtolso( int[] t, int elso, int utolso ) { } int a=0,b=0; ElsoUtolso(h, a, b); int a=0,b=0; ElsoUtolso(h, a, b); 0 0 a 0 0 b 0 0 elso 0 0 utolso elso = a; utolso = b; elso = a; utolso = b; a = elso ; b = utolso; a = elso ; b = utolso; elindul az alprogram nincs ilyen
10 Kimenő paraméter: static void ElsoUtolso( int[] t, out int elso, out int utolso ) { } static void ElsoUtolso( int[] t, out int elso, out int utolso ) { } int a,b; ElsoUtolso(h, out a, out b); int a,b; ElsoUtolso(h, out a, out b); 0 0 a 0 0 b elsoutolso Az ‘out’ kulcsszót mindkét helyen alkalmazni kell!
11 Kimenő paraméter: static void ElsoUtolso( int[] t, out int elso, out int utolso ) { … } static void ElsoUtolso( int[] t, out int elso, out int utolso ) { … } A formális paraméterlistában az ‘out’ azt jelenti, hogy ezen változót nem akárhol kell a memóriában létrehozni, hanem pontosan azon a helyen, ahol az aktuális paraméterlistában megadott változó is van A két változó egy helyen szerepel a memóriában!
12 Kimenő paraméter: int a,b; ElsoUtolso(h, out a, out b); int a,b; ElsoUtolso(h, out a, out b); Az aktuális paraméterlistában az ‘out’ azt jelenti, hogy ezen változóknak nem szükséges megelőzően értéket adni, mivel a bennük lévő értékeket az alprogram nem kívánja felhasználni majd Ezen változók értékét az al-program kötelezően meg kell változtassa!
13 Kimenő paraméter: static void ElsoUtolso( int[] t, out int elso, out int utolso ) { for(int i=0;i<t.Length;i++) { if (t[i]==0 && elso==-1) elso=i; if (t[i]==0) utolso=i; } static void ElsoUtolso( int[] t, out int elso, out int utolso ) { for(int i=0;i<t.Length;i++) { if (t[i]==0 && elso==-1) elso=i; if (t[i]==0) utolso=i; } The out parameter ‘elso’ must be assigned to before control leaves the current method. Az ‘out’ paramétereknek kötelező értéket adni! A C# fordító nem biztos benne, hogy ez bekövetkezik ebben az esetben (pl ha a t tömb 0 elemszámú, vagy nincs nulla a tömbön belül)!
14 Referencia típusú paraméter: static void Oregedes( Hallgato akarki ) { akarki.eletkor++; } static void Oregedes( Hallgato akarki ) { akarki.eletkor++; } Hallgato h = new Hallgato(); h.Eletkor = 20; Oregedes(h); Console.WriteLine(h.eletkor); Hallgato h = new Hallgato(); h.Eletkor = 20; Oregedes(h); Console.WriteLine(h.eletkor); 1 1 hakarki eletkor | nev | ferfi akarki = h;
15 Referencia típusú paraméter: static void Oregedes( Hallgato akarki ) { akarki.eletkor++; } static void Oregedes( Hallgato akarki ) { akarki.eletkor++; } Oregedes(h); A referencia-típusú paraméter- változókra is ugyanaz a szabály, de… A híváskor a kezdőérték beállításakor a memóriacímet veszik át Így rajtuk keresztül elérhető a másodlagos memóriaterület, és meg is változtatható
16 Referencia típusú paraméter: static void Feltoltes( int[] t ) { for(int i=0;i<t.Length;i++) t[i] = i+1; } static void Feltoltes( int[] t ) { for(int i=0;i<t.Length;i++) t[i] = i+1; } int[] a = new int[20]; Feltoltes(a); int[] a = new int[20]; Feltoltes(a);
17 Referencia típusú paraméter: static void Feltoltes( int[] t ) { t = new int[20]; for(int i=0;i<t.Length;i++) t[i] = i+1; } static void Feltoltes( int[] t ) { t = new int[20]; for(int i=0;i<t.Length;i++) t[i] = i+1; } int[] a=null; Feltoltes(a); int[] a=null; Feltoltes(a); int[] b=new int[30]; Feltoltes(b); int[] b=new int[30]; Feltoltes(b);
18 Referencia típusú paraméter: static void Feltoltes( out int[] t ) { t = new int[20]; for(int i=0;i<t.Length;i++) t[i] = i+1; } static void Feltoltes( out int[] t ) { t = new int[20]; for(int i=0;i<t.Length;i++) t[i] = i+1; } int[] a; Feltoltes( out a ); int[] a; Feltoltes( out a ); int[] b=new int[30]; Feltoltes( out b ); int[] b=new int[30]; Feltoltes( out b );
19 Átmenő paraméter: static void Csere( ref int a, ref int b ) { int z = a; a = b; b = z; } static void Csere( ref int a, ref int b ) { int z = a; a = b; b = z; } int x=2, y=3; Csere( ref x, ref y ); int x=2, y=3; Csere( ref x, ref y ); A referencia-típusú paraméterátadás gyakorlatilag megegyezik a kimenő paraméterek kezelésével De a fordítóprogram megköveteli, hogy hívás előtt már legyen értéke az adott változónak, akit átadunk az eljárásnak!
20 Átmenő paraméter: static void Csere( ref int a, ref int b ) { if (a!=b) { int z = a; a = b; b = z; } static void Csere( ref int a, ref int b ) { if (a!=b) { int z = a; a = b; b = z; } int x=2, y=3; Csere( ref x, ref y ); int x=2, y=3; Csere( ref x, ref y ); Az átmenő paramétereket az eljárás nem kötelezően kell megváltoztatnia! (ellentétben a kimenő paraméterekkel)