調(diào)用子程序最簡單的方式就是按照子程序聲明的格式調(diào)用,如前例的procedure swap(A:Integer;B:Integer),只要填入的參數(shù)是Integer類型,便能直接使用 swap (A,B)。注意調(diào)用子程序時參數(shù)之間用“,”隔開;同類型的參數(shù)在聲明時也可簡化,如procedure swap(A,B:Integer)。但使用參數(shù)時還有下列幾種特殊情況.
我們也可以不按照參數(shù)順序調(diào)用子程序。如調(diào)用 swap 也可以這樣: swap(B => Y, A => X),這時是使用有名參數(shù),明確聲明每個變量的值,可以不按照子程序聲明中的參數(shù)順序賦值。這樣的做的話可讀性是好了一點,比較適合參數(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); ---不合法
在聲明某個子程序時,我們也可以使參數(shù)具有默認值,如下例:
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;
實際上[012]可有可無,因為調(diào)用輸出行函數(shù) putline 時,沒用參數(shù)。而 putline 在聲明時賦予了參數(shù) lines 一個默認值 1,這樣的話如果調(diào)用 putline 沒用參數(shù),就以 1 作為參數(shù)值。上例也就只輸出一個空行。如果putline有參數(shù),如putline(Line),則輸出的行數(shù)取決于 Line 的數(shù)值。
子程序重載
實際上通過先前的一些例子,細心的朋友可能發(fā)現(xiàn),過程 Put 能處理不能類型的參數(shù),不像 C 下的 printf 要選擇輸出類型,這就涉及到子程序重載:只要參數(shù)不一樣,子程序可以有相同的名稱。如在程序包Ada.Text_IO里的兩個過程:
procedure Put (Item : in Character);
procedure Put (Item : in String);
編譯器會自動選擇合適的子程序,如果Put后面的參數(shù)為 Character類型,則調(diào)用procedure Put (Item : in Character);為 String 類型,則調(diào)用procedure Put (Item : in String)。這樣在用戶層上使用子程序簡便了許多,很多常見的子程序:Get,Put_Line,Line, Page都是這樣實現(xiàn)的----雖然在預定義程序包內(nèi)針對不同參數(shù)都有一個子程序與之相對應,用戶卻只要記住一個名稱就可以了。
運算符重載
運算符重載應該說時時刻刻都在----不同的數(shù)據(jù)類型都擁有相同的運算符:+,-,*,/等。它的原理和子程序重載是一樣的,在 Ada 里,運算符也是通過子程序形式來實現(xiàn)。下面就給出一個“+”和 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;
上例為了簡化問題,有些實際中應該有的代碼去除了----如檢測所操作數(shù)的類型。但其它類型的運算符和重載子程序?qū)崿F(xiàn)原理也和上例一樣。
Ada 還允許子程序分成多個部份,而不是像以前的例子一樣都塞在同一文件里,如將上例分成兩個文件:
第一個文件:
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;
第二個文件:
000 --filename:overload-put.adb
001 separate (overload) -- *注意結(jié)尾沒有分號;
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;
這個程序和先前那個完全一樣,只是"分了家"而已。這樣分離程序有時能更好的分解程序的任務,使程序結(jié)構(gòu)更為清楚。注意一下overload.adb的[014] 和 overload-put.adb的 [001],這兩句就是分離子程序的主要語句。
子程序可以在調(diào)用地點被內(nèi)嵌擴展,以提高程序效率,它的格式為:
pragma Inline(name);
如果 name 是一個可調(diào)用的實體,子程序或類屬子程序(見第11章),那么 pragma Inline 指示在所有調(diào)用該實體的地方要求對該實體進行內(nèi)嵌擴展。這在封裝其它語言的接口時,使用的比較多,以提高效率。
更多建議: