english version while1 - stránky o programování

Parametry funkce

Popis

  • parametry se definují v hlavičce procedury
  • volané hodnotou - V těle funkce se vytvoří pomocná proměnná, do které je kopírován obsah parametru. Funkce pracuje s pomocnou proměnou a hodnotu parametru tak nemění.
  • volané odkazem - Funkce pracuje s adresou proměnné předané parametrem. Hodnota předané proměnné tak může být změněna. Předávání parametrů odkazem je výhodné i pro objemné struktury kde urychlíme program ušetřením kopírování jejich obsahu do pomocné proměnné.

Vývojový diagram

Přirozený jazyk

JSA

NASM

  • Parametry lze předávat v zásobníku, v registrech nebo uložením do paměti.


predani parametru podprogramu (použita knihovna proc.asm)[ param.asm ]
; funkce n-te mocniny
;  + parametry (zaklad, exponent) predane zasobnikem
;  + navratova hodnota funkce predana registrem (ax)

bits 16

%include "proc.asm" ;pripojeni procedur

segment code 
;----------------------------------------------------------------------------
;  mocnina : vypocet n-te mocniny  
;  vypocitana hodnota v (ax)
;----------------------------------------------------------------------------
   mocnina:
      push bp
      mov  bp, sp ; adresovani parametru od vrcholu zasobniku
      push bx ; ulozeni registru, ktere budou prepsany
      push cx
      
      mov bx, [bp+6] ; zaklad (bx)
      mov cx, [bp+4]  ; exponent (cx)      
      
; vypocet mocniny 1*(bx)*(bx)*....
      mov ax, 1
      jcxz ENDFOR
FOR      
      mul bx
      loop FOR
ENDFOR:

      pop bx     ; obnoveni registru
      pop cx
      pop bp      
      ret 4      ; navrat do programu 
                 ; s odebranim parametru 4B - odebira volany
;----------------------------------------------------------------------------	

..start: 
  mov ax, data	
  mov ds, ax 
  mov ax, stack 
  mov ss, ax 
  mov sp, stacktop

; predani parametru zasobnikem
  push word [A]
  push word [E]
  call mocnina  ; volani podprogramu

  call printw   ; vypis navracene hodnoty (ax -> 0..65535)
  
  call printnl ; novy radek
  call press   ; cekej na stisk klavesy


; navrat do OS
  mov ah, 4ch  
  int 21h


	segment data
A          dw   2   ;zaklad
E          dw   9   ;exponent

Pascal

  • volané hodnotou - procedure print(a:integer);
  • volané odkazem - Klíčové slovo var. procedure inc(var a:integer);
  • Závorky () se vynechávají pokud je seznam parametrů prázdný procedure print;
  • Parametry jsou na zásobníku uloženy zleva doprava a po ukončení podprogramu je ze zásobníku odstraňuje volající (program).

C/C++

  • volané hodnotou - void print (int a) { }
  • volané odkazem - void inc (int& a) { a++; }
  • Parametry jsou na zásobníku uloženy zprava doleva (kvůli možnosti proměnného počtu) a po ukončení podprogramu je ze zásobníku odstraňuje volaný (podprogram).
  • typ identifikátor () { } Seznam parametrů může být prázdný.
  • void inc (int& a, int plus=1) { a+=plus; } Parametry s implicitní hodnotou se umísťují na konec seznamu parametrů a při volání funkce je lze vynechat (bude použita implicitní hodnota).
  • void printf (const char* ...); Funkce s nespecifikovaným počtem parametrů (...).


parametr[ parametr.cpp ]
/* funkce : parametr predany hodnotou/odkazem */

#include <stdio.h> /* knihovna s funkci printf() */

/* hodnotou */
void inc_h (int& i) {  i++;  }

/* odkazem (reference) */
void inc_r (int& i) {  i++;  }

/* odkazem (ukazatel) */
void inc_p (int* i) {  (*i)++; }

/*
 * hlavni funkce main
 */
int main (int argc, char *argv[]) {
    int a = 0; /*lokalni promenna */ 
    printf(" vychozi  : a = %d \n", a);
    
    inc_h (a);
    printf(" hodnotou : a = %d \n", a);
    
    inc_r (a);
    printf(" odkazem  : a = %d \n", a);
    
    inc_p (&a); /* predava se adresa (a) */
    printf(" odkazem  : a = %d \n", a);
    
    return 0;
}

Java

  • volané hodnotou - void print (int a) { }
  • volané odkazem - void inc (int& a) { a++; }
  • typ identifikátor () { } Seznam parametrů může být prázdný.
  • void inc (int& a, int plus=1) { a+=plus; } Parametry s implicitní hodnotou se umísťují na konec seznamu parametrů a při volání funkce je lze vynechat (bude použita implicitní hodnota).

JavaScript

  • typ parametrů se neuvádí
  • předávání parametrů pouze hodnotou


parametry funkce[ parametry.html ]
<html>            
  <head>
    <title>Parametry funkce</title>
  </head>
  
  <body>
    <script type="text/javascript">
      function reverse (str) { 
          var str2 = ''; // lokalni promenna
          
          for(i=str.length-1; i>=0; i--)
            str2 = str2 + str[i];
            
          return str2; // navraceni obraceneho retezce
      }
      
      var retezec  = 'ahoj';
          
      document.write(" obracenim ("+ retezec +") je ("+reverse(retezec)+") <br/>");
    </script>
  </body>
</html>

Matlab

  • typ parametrů se neuvádí
  • předávání parametrů v seznamu vstupních parametrů funkce pouze hodnotou
  • pro změnu hodnoty parametru po návratu z funkce stačí jméno vstupního parametru uvést i v seznamu výstupních parametrů
  • nespecifikovaný počet parametrů
  • funkce nargin pro zjištění počtu předaných vstupních parametrů


implicitni hodnota parametru[ add.m ]
function c = add (a, b)
% implicitni parametr b

if (nargin == 1)
    c = a + 1; % 'implicitni' (b)
elseif (nargin == 2)
    c = a + b; % (b) bylo predano
end

>> add(1)

ans =
     2
     
>> add(1, 3)

ans =
     4

PHP

function plus($a, $b) { return $a+$b; }
  • Předávání parametrů odkazem : function inc(&$a) { return $a++; }
  • Proměnný počet parametrů. Funkce :
    • func_num_args() - vrací počet předaných parametrů
    • func_get_arg(n) - vrací n-tý argument
    • func_get_args() - vrací pole s argumenty
  • Implicitní parametry (na konci seznamu parametrů).


funkce[ func.php ]
<html>            
  <head>
    <title>Funkce</title>
  </head>
  
  <body>
    <?php
      // funkce s parametrem predanym odkazem
      // bez navratove hodnoty
      function inc(&$a) { $a++; }
      
      // funkce s implicitni hodnotou parametru ($plus = 1)
      // s navratovou hodnotou ($a+=$plus)
      function pricti(&$a, $plus = 1) { return $a+=$plus; }
            
      $i = 1; 
      inc($i); // volani funkce s parametrem $i predanym odkazem
      // i==2
      
      pricti($i);    // pricteni implicitni jednicky (i==3)
      pricti($i, 5); // pricteni petky (i==8)
      
      $j = pricti($i);  // navratova hodnota do $j (j==9, i==9)
      
      echo "i($i), j($j) <br/>";
    ?>
  </body>
</html>

Kontakt
Prohlášení o dostupnosti
Tisk stránky
Autor: Václav Bubník © 2005
vbubnik@post.cz
XHTML 1.0| CSS