Ada子程序概述

2018-11-20 09:00 更新

概述 (Overview)

    一個(gè)程序是由一個(gè)或更多的子程序組成,以一個(gè)主過程(main procedure)為根本,主過程類似與 C 下的 main 函數(shù)。子程序包括過程(proceudre)和函數(shù)(function)兩類,兩者區(qū)別在于,過程沒有返回值,而函數(shù)有返回值。

     子程序,包括函數(shù)和過程,以及下一章所講述的程序包,是構(gòu)成 Ada 程序的基礎(chǔ)。Ada 提供了一些和 C、Pascal 不同的新特性,如重載、參數(shù)模式、分離程序等。

過程(Procedure)

    過程我們以前已經(jīng)見過了,但那些都是主過程(main procedure),即程序的主體部體,作用和C下的 main 函數(shù)相似。一般情況下,Ada 程序的主程序名應(yīng)當(dāng)和該主程序所在的文件名相同。過程的聲明格式如下:

procedure procedure_name (parameter_specification);

    它的執(zhí)行部份則為:

procedure procedure_name (parameter_specification) is
    declarations;
begin
    statements;
end procedure_name ;

    procedure_name 為該過程的名稱;parameter_specification 是這個(gè)過程所要使用的參數(shù),是可選的;declarations 是聲明一些局部的新類型、變量、函數(shù)、過程;statements 則是該過程要執(zhí)行的語句。

   下例創(chuàng)建一個(gè)比較兩數(shù)大小,并輸出較大值的過程

procedure compare (A:Integer; B :Integer) is 
begin 
   if A > B then 
      Put_Line ("A > B");
   elsif A = B then 
      Put_Line ("A = B");
   else 
       Put_ine ("A <B"); 
   end if;
end compare;

    下例則是完整的程序:

000 -- filename:comp.adb;
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure comp is 
004     procedure compare (A:Integer; B :Integer) is 
005     begin 
006        if A > B then 
007            Put_Line ("A > B.");
008        elsif A = B then 
009            Put_Line ("A = B.");
010        else
011            Put_ine ("A < B.");
012        end if;
013     end compare;
014 X,Y:Integer;
015 begin
016     Put ("Enter A:"); Get (X);
017     Put ("Enter B:"); Get (Y);
018    compare (X,Y);
019 end comp;

    通過上例,對(duì)過程的用法應(yīng)該會(huì)有基本的了解了。因?yàn)?compare 的執(zhí)行部分是在 comp 內(nèi)部,所以我們無須給出單獨(dú)的 compare 聲明,如果要加一句"procedure compare (A:Integer; B :Integer);",程序還是老樣子。聲明部份和執(zhí)行部份一般在使用程序包時(shí)分離。其中Put_Line,Get也都是預(yù)定義的過程。

函數(shù) (Function)

   函數(shù)和過程也很像,只是它還要有返回值,和 C 很相似,也用 return 來返回函數(shù)值。聲明格式為:

function function_name (parameter_specificationreturn return_type;

執(zhí)行部份為:

function function_name (parameter_specificationreturn return_type is
   declarations;
begin

   statements;
   return return_value;
end
 function_name ;

 

    function_name 為該函數(shù)的名稱;parameter_specification 是這個(gè)函數(shù)所要使用的參數(shù),是可選的;declarations 是聲明一些局部的新類型、變量、函數(shù)、過程;statements則是該函數(shù)要執(zhí)行的語句。return 返回一個(gè)數(shù)據(jù)類型為return_typereturn_value。

    將上一節(jié)的 comp 程序改動(dòng)一下:

000 -- filename:comp.adb;
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure comp is 
004    function compare (A:Integer; B :Integer) return Integer is 
005    begin 
006       return (A - B);
007    end compare;
008 X,Y,Result:Integer;
009 begin
010     Put ("Enter A:"); Get (X);
011     Put ("Enter B:"); Get (Y);
012     Result := compare (X,Y);
013    case Result is
014       when Integer'First..-1 => Put_Line (" A < B.");
015        when 0 => Put_Line (" A = B.");
016       when 1..Integer'Last => Put_Line (" A > B.");
017       when others => null;
018    end case;
019 end comp;

    上例應(yīng)該還能說明函數(shù)的特點(diǎn)。因?yàn)楹瘮?shù)是返回一個(gè)值,所以在變量聲明中賦予初始值時(shí),也可用函數(shù)作為所要賦的值,如返回當(dāng)前時(shí)間的 Clock 函數(shù),可以直接在初始化某變量時(shí)作為要賦的值:Time_Now :Time:= Clock。與過程一樣,在上述情況下,單獨(dú)的函數(shù)聲明可有可無。還有一點(diǎn)就是函數(shù)、過程的嵌套,上面兩個(gè)例子就是過程包含過程,過程包含函數(shù),可以無限制的嵌套下去---只要編譯器別出錯(cuò)。

參數(shù)模式(Parameter Mode)

    在上面的例子中,我們對(duì)函數(shù)或過程的參數(shù)并沒做什么修飾,只是很簡(jiǎn)單的說明該參數(shù)的數(shù)據(jù)類型,但有時(shí)候,我們要設(shè)置參數(shù)的屬性---函數(shù)和過程是否能修改該參數(shù)的值。一共有三種模式:in,out,in out。

in 模式

    默認(rèn)情況下,函數(shù)和過程的參數(shù)是 in 模式,它表示這個(gè)參數(shù)可能在子程序中被使用,但值不能被子程序改變。如我們寫一個(gè)略微像樣點(diǎn)的swap函數(shù):

000 filename:swap.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

003 procedure Swap is 
004    procedure Swap ( A: in Integer;B: in Integer) is
005        Temp :Integer;
006    begin
007        Temp := A; A:= B; B :=Temp;
008    end Swap; 
009 X,Y:Integer; 
010 begin
011    Put ("Enter A:"); Get (X); 
012    Put ("Enter B:"); Get (Y);
013    Put ("After swap:"); New_Line;
014    swap(X,Y);
015    Put ("A is "); Put (X); New_Line;
016    Put ("B is "); Put (Y); New_Line;
017 end Swap;

   上例的程序是無法編譯通過的,因?yàn)镾wap的兩個(gè)參數(shù) A 和 B 都是 in 模式,在這個(gè)子過程中無法修改X,Y的值,也就無法互換這兩個(gè)值。這時(shí)就要使用 in out 模式的參數(shù)。

in out 模式

   in out 模式表示該參數(shù)在這個(gè)子程序中既可修改又可使用。如只要將上例的[004]改為:procedure Swap ( A: in out Integer,B: in out Integer) is;該程序便能編譯通過,運(yùn)行正常。

out 模式

   單純的 out 模式表示該參數(shù)在這個(gè)子程序中可以修改,但不能使用。如求和的 add 過程:

procedure Add (Left ,Right : Integer; Result : out Integer) is
begin
   Result := Left + Right;
end Add;

   這個(gè)過程沒問題,但假如還有個(gè)輸出過程為:

procedure PutResult ( Result : out Integer) is
    Temp : Integer := Result;

begin
    Put (Temp);
end PutResult;

   則會(huì)產(chǎn)生問題,雖然編譯可能通過,但結(jié)果是不定的,最起碼不是所指望的結(jié)果,因此 out 模式的參數(shù)不能賦值給其它變量。單獨(dú)的 out 模式一般也不會(huì)出現(xiàn)。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)