調(diào)用子程序最簡(jiǎn)單的方式就是按照子程序聲明的格式調(diào)用,如前例的procedure swap(A:Integer;B:Integer),只要填入的參數(shù)是Integer類型,便能直接使用 swap (A,B)。注意調(diào)用子程序時(shí)參數(shù)之間用“,”隔開(kāi);同類型的參數(shù)在聲明時(shí)也可簡(jiǎn)化,如procedure swap(A,B:Integer)。但使用參數(shù)時(shí)還有下列幾種特殊情況.
我們也可以不按照參數(shù)順序調(diào)用子程序。如調(diào)用 swap 也可以這樣: swap(B => Y, A => X),這時(shí)是使用有名參數(shù),明確聲明每個(gè)變量的值,可以不按照子程序聲明中的參數(shù)順序賦值。這樣的做的話可讀性是好了一點(diǎn),比較適合參數(shù)較多的情況。
如果將有名參數(shù)和位置參數(shù)一起混用,只需遵守一條規(guī)則:位置參數(shù)在有名參數(shù)前面。因此 swap 的調(diào)用有以下幾種情況:
swap(x , y);
swap(A => x , B => y);
swap(B => y , A => x);
swap(x, B => Y);
上述四種情況是一樣的。下列兩種情況是非法的:
swap(y, A => x);---不合法
swap(A => x , y); ---不合法
在聲明某個(gè)子程序時(shí),我們也可以使參數(shù)具有默認(rèn)值,如下例:
000 -- filename:putlines.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
003 procedure putlines is
004 procedure putline(lines: integer:=1) is<> 005 begin
006 for count in 1..lines loop
007 New_Line;
008 end loop;
009 end putline;
010 Line :Integer;
011 begin
012 Put ("Print Lines :"); Get (Line);
013 putline;
014 end putlines;
實(shí)際上[012]可有可無(wú),因?yàn)檎{(diào)用輸出行函數(shù) putline 時(shí),沒(méi)用參數(shù)。而 putline 在聲明時(shí)賦予了參數(shù) lines 一個(gè)默認(rèn)值 1,這樣的話如果調(diào)用 putline 沒(méi)用參數(shù),就以 1 作為參數(shù)值。上例也就只輸出一個(gè)空行。如果putline有參數(shù),如putline(Line),則輸出的行數(shù)取決于 Line 的數(shù)值。
子程序重載
實(shí)際上通過(guò)先前的一些例子,細(xì)心的朋友可能發(fā)現(xiàn),過(guò)程 Put 能處理不能類型的參數(shù),不像 C 下的 printf 要選擇輸出類型,這就涉及到子程序重載:只要參數(shù)不一樣,子程序可以有相同的名稱。如在程序包Ada.Text_IO里的兩個(gè)過(guò)程:
procedure Put (Item : in Character);
procedure Put (Item : in String);
編譯器會(huì)自動(dòng)選擇合適的子程序,如果Put后面的參數(shù)為 Character類型,則調(diào)用procedure Put (Item : in Character);為 String 類型,則調(diào)用procedure Put (Item : in String)。這樣在用戶層上使用子程序簡(jiǎn)便了許多,很多常見(jiàn)的子程序:Get,Put_Line,Line, Page都是這樣實(shí)現(xiàn)的----雖然在預(yù)定義程序包內(nèi)針對(duì)不同參數(shù)都有一個(gè)子程序與之相對(duì)應(yīng),用戶卻只要記住一個(gè)名稱就可以了。
運(yùn)算符重載
運(yùn)算符重載應(yīng)該說(shuō)時(shí)時(shí)刻刻都在----不同的數(shù)據(jù)類型都擁有相同的運(yùn)算符:+,-,*,/等。它的原理和子程序重載是一樣的,在 Ada 里,運(yùn)算符也是通過(guò)子程序形式來(lái)實(shí)現(xiàn)。下面就給出一個(gè)“+”和 put 重載的例子:
000 -- filename: overload.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
003 procedure overload is
004 type Vector is array (1 .. 5 ) of Integer;
005 a, b, c :Vector;
006 function "+"(left,right:Vector) return Vector is
007 result : Vector ;
008 begin
009 for i in left'range loop
010 result(i) := left(i) + right(i);
011 end loop;
012 return result;
013 end "+";
014 procedure Put (Item : Vector) is
015 begin
016 for i in Item'range loop
017 Put (Item(i));
018 end loop;
019 end Put;
020 begin
021 a := (1,2,3,4,5);
022 b := (1,2,3,4,5);
023 c := a + b;
024 Put (c);
025 end overload;
上例為了簡(jiǎn)化問(wèn)題,有些實(shí)際中應(yīng)該有的代碼去除了----如檢測(cè)所操作數(shù)的類型。但其它類型的運(yùn)算符和重載子程序?qū)崿F(xiàn)原理也和上例一樣。
Ada 還允許子程序分成多個(gè)部份,而不是像以前的例子一樣都塞在同一文件里,如將上例分成兩個(gè)文件:
第一個(gè)文件:
000 -- filename: overload.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
003 procedure overload is
004 type Vector is array (1 .. 5 ) of Integer;
005 a, b, c :Vector;
006 function "+"(left,right:Vector) return Vector is
007 result : Vector ;
008 begin
009 for i in left'range loop
010 result(i) := left(i) + right(i);
011 end loop;
012 return result;
013 end "+";
014 procedure Put (Item : Vector) is separate;
015 begin
016 a := (1,2,3,4,5);
017 b := (1,2,3,4,5);
018 c := a + b;
019 Put (c);
020 end overload;
第二個(gè)文件:
000 --filename:overload-put.adb
001 separate (overload) -- *注意結(jié)尾沒(méi)有分號(hào);
002 procedure Put (Item : Vector) is
003 begin
004 for i in Item'range loop
005 Put (Item(i));
006 end loop;
007 end Put;
這個(gè)程序和先前那個(gè)完全一樣,只是"分了家"而已。這樣分離程序有時(shí)能更好的分解程序的任務(wù),使程序結(jié)構(gòu)更為清楚。注意一下overload.adb的[014] 和 overload-put.adb的 [001],這兩句就是分離子程序的主要語(yǔ)句。
子程序可以在調(diào)用地點(diǎn)被內(nèi)嵌擴(kuò)展,以提高程序效率,它的格式為:
pragma Inline(name);
如果 name 是一個(gè)可調(diào)用的實(shí)體,子程序或類屬子程序(見(jiàn)第11章),那么 pragma Inline 指示在所有調(diào)用該實(shí)體的地方要求對(duì)該實(shí)體進(jìn)行內(nèi)嵌擴(kuò)展。這在封裝其它語(yǔ)言的接口時(shí),使用的比較多,以提高效率。
更多建議: