2016-12-01 16 views
0

私はAdaにとって非常に新しいので、なぜポインタを使って手続きを呼び出すためにAcc.all、またはd.allを書く必要があるのだろうかと思います。私は.allがレコードのためのものであると思った。それは他のレコードの値と等しいレコードの値を設定できるからだ。同時に私はなぜ私がその関数を呼び出すときにそうする必要がないのだろうと思っています。私のコードを参考にしてください。 AnimalPKG.Animals(Total、3,2,1)を忘れてください。パッケージをインポートする方法を練習中です。Ada。プロシージャをポインタから呼び出すためにはなぜ<< procedurename.all >>が必要ですか?

with AnimalPKG, Ada.Text_IO, Ada.Integer_Text_IO; 
    use Ada.Text_IO, Ada.Integer_Text_IO; 

    procedure Main is 

     procedure thisisaccess is 
      begin 
      Put("thisisaccess"); 

      end thisisaccess; 

     Type accessprocedure is access procedure; 

     procedure passinfunction(d : accessprocedure) is 
      begin 
     d.all; 
     end passinfunction; 

     function times5(a : Integer) return Integer is 
      begin 
      return a*5; 
     end times5; 

     Type times5access is access function(x : Integer) return Integer; 

     B : times5access := times5'Access; 

     Acc : accessprocedure; 
     Acc2 : accessprocedure; //Modification 

    Total : Integer; 


begin 

    Acc := thisisaccess'Access; //Modification 
    Acc2 := Acc; //Modification 
    Acc2.all; //Modification 

     AnimalPKG.Animals(Total, 3,2,1); 
     Put(Total); 
     Acc.all; 
     passinfunction(Acc); 
     Put(B(3)); 
    end Main; 

答えて

2

.all構成体は、明示的に逆参照される。コンパイラはPaccess procedureタイプ)の場合はポインタを、それ以外の場合はと呼びます。 Adaでは、プロシージャを呼び出すときに空の括弧は必要ないことに注意してください。従って、Pはポインタそのものとして理解され、P.allが呼び出されます。

+0

それは感謝します、ありがとう。参考のため、オリジナル投稿のコードを少し修正しました。 –

関連する問題

 関連する問題