A B nyelvben az eljárások és a függvények definiálása hasonló módon történik. A kettõ
közötti formai különbség csupán annyi, hogy a függvényeknél a visszatérési értéket a
return után megadjuk, míg az eljárásoknál nem adunk meg visszatérési értéket. A
deklarálás szintaxisa :
alprogramnev (parameterlista) ut;
Az alprogram neve nem számjeggyel kezdõdõ, betûvel,
számmal vagy _-jellel folyatódó karaktersorozat lehet. A paraméterek megadásánál változóneveket
kell felsorolni típusmegadás nélkül, elválasztó vesszõkkel felsorolva. Az alprogram hatását ut;
(általában szekvencia) utasítás határozza meg. Az eljárásokból visszatérni a
return;
utasítással lehet. Függvények esetében a visszatérési értéket
return (ertek); formában
kell megadni.
Példa két elem mínimumát megadó függvényre (a típusnélküliség minden szépségét
kihasználva) :
min (a, b)
{
if (a > b) return (a) else return (b);
}
Speciális a main () függvény, melyet minden B programnak tartalmaznia kell. A
program indítása után a vezérlést ez a függvény kapja meg.
Rekurzió: természetesen van lehetõség rekurzív függvény hívásokra, egy példa rá:
putnumb(n) {
auto a;
if (a=n/10) putnumb(a); /* a rekurzió */
putchar(n % 10 + ’0’);
}
Paraméter átadás
Megegyezik a C nyelvben megszokottakkal: érték szerinti paraméterátadás
esetén az aktuális paraméterek értékei nem változnak, míg cím szerinti paraméterátadáskor
nem készül másolat az aktuális paraméterekrõl, hanem az alprogram azokkal ”dolgozik”. Mivel
a változóknak nem adjuk meg a típusát deklarálásukkor (a típus a programkörnyezetbõl derül
ki), ezért ezt alprogram definiáláskor sem tesszük meg.
Példa érték szerinti
paraméterátadásra:
Swap(x,y){
auto temp;
temp = x;
x = y;
y = temp;
}
Ilyenkor az aktuális x és y értéke nem változik. Példa cím szerinti
paraméterátadásra:
Swap(&x, &y) {
auto temp;
temp = *y;
*x = *y;
*y = temp;
Ilyenkor az aktuális x és y értékek tényleg kicserélõdnek.