Ada子程序的調(diào)用

2018-11-20 10:00 更新

調(diào)用子程序(Calling Subprograms)

    調(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ù)(Named Parameter)

    我們也可以不按照參數(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); ---不合法

默認(rèn)參數(shù)值(Default Parameter Values )

    在聲明某個(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ù)值。

重載(Overload)

子程序重載

    實(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)原理也和上例一樣。

分離子程序(Separating Subprogram)

    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ǔ)句。

子程序的內(nèi)嵌擴(kuò)展(Inline Expansion of Subprograms)

  子程序可以在調(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í),使用的比較多,以提高效率。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)