2016-10-14 3 views
0
 when 'B' |'b' => 
      cons.Put_Line("Enter text - less than 20 chars: "); 
      cons.Get_Line(Item => st, 
         Last => m); 

      --buffer_ser'Write(st,m); 

      ser.Write(Port => S_Port, 
        Buffer => buffer_ser); 

Stream_element_arrayする文字列:基本的に、私はシリアルコマンドに基づいて、ビデオストリームをオーバーレイ古いデバイスを動作させるために、非常にポータブルアプリケーションを必要とADA、シリアルポート、として定義され

package cons renames gnat.IO; 
    package ser renames gnat.Serial_Communications; 

    S_Port : gnat.Serial_Communications.Serial_Port; 
    buffer_ser: ada.Streams.Stream_Element_Array(1..20); 
    x : Ada.Streams.Stream_Element_Offset; 
    m : Integer; 
    st : string(1..20) := (others => ASCII.NUL); 
    ComPort : GNAT.Serial_Communications.Port_Name(1..5); 

を。私は他の何かのためにそれを学んでいたので、私はエイダを試してみることにしました。

AdaのString(1..20)からStream_element_array(1..20)に変換するにはどうすればよいですか?私は明らかな答えを試してきました、そして、私は完全に立ち往生しています!ダウン私に投票した人のために要求されるように編集された

...

+1

のようなものを持っている

を**とイメージとしてではありません。 http://stackoverflow.com/help/how-to-ask –

+0

このスニペットをMCVE http://stackoverflow.com/help/mcveに変換してください –

+0

私はMCVEガイドを読んだだけです。それは私が最小限の部分を壊すことなくそれを作ることができるほど良いものです。 – DonkeyOaty

答えて

2

まず、MCVEが必要です。

with gnat.IO; 
with ada.Streams; 
with gnat.Serial_Communications; 

procedure MCVE is 

    package cons renames gnat.IO; 
    package ser renames gnat.Serial_Communications; 

    S_Port : gnat.Serial_Communications.Serial_Port; 
    buffer_ser: ada.Streams.Stream_Element_Array(1..20); 
    x : Ada.Streams.Stream_Element_Offset; 
    m : Integer; 
    st : string(1..20) := (others => ASCII.NUL); 
    ComPort : GNAT.Serial_Communications.Port_Name(1..5); 

begin 
      cons.Put_Line("Enter text - less than 20 chars: "); 
      cons.Get_Line(Item => st, 
         Last => m); 

      --buffer_ser'Write(st,m); 

      ser.Write(Port => S_Port, 
        Buffer => buffer_ser); 

end MCVE; 

それが正常にコンパイルし、エラー

で失敗はGNAT.SERIAL_COMMUNICATIONS.SERIAL_ERRORを提起:書き込み:ポートがない が

を開いたストリームにはほとんど読書は答えていることを示して実際の質問:

どうすればよいですかStream_element_arrayにert(1..20)

は:通常、あなたはしません。ストリームがあなたのためにそれを世話します。

それぞれの修正のカップル、:

  • S_Portは、我々が実際にストリーム
  • としてシリアルポートを開いて、不要な中間変数
  • を(redirectableストリームが書き込みできるようにする)のアクセスを取得し、削除することができますので、エイリアス作ります

などのストリームに直接文字列を書きます
S_Port : aliased gnat.Serial_Communications.Serial_Port; 
-- buffer_ser: ada.Streams.Stream_Element_Array(1..20); 
-- x : Ada.Streams.Stream_Element_Offset; 
... 
gnat.Serial_Communications.Open(S_Port,ComPort); 
String'Write(S_Port'access, st(1..m)); 
--buffer_ser'Write(st,m); 
--ser.Write(Port => S_Port, Buffer => buffer_ser); 

しかし、適切でないときに固定長の文字列を使用することは悪い考えです。文字列を正しい長さと宣言し、さらに単純化しましょう。これには、Gnat.IOパッケージが提供しないGet_Lineの関数形式が必要です。代わりに、移植性の高いAda.Text_IOを代わりに使用しましょう。 (そして...シリアルポート名を初期化し、実際に名前を変更したパッケージを使用)、あなたの質問に**コードを含めてください、私たちが完了したら、我々は

with Ada.Text_IO; 
with ada.Streams; 
with gnat.Serial_Communications; 

procedure MCVE is 

    package cons renames Ada.Text_IO; 
    package ser renames gnat.Serial_Communications; 

    S_Port : aliased ser.Serial_Port; 
    ComPort : ser.Port_Name := "COM1"; 

begin 
      ser.Open(S_Port,ComPort); 

      cons.Put_Line("Enter text : "); 
      declare 
       st : String := cons.Get_Line; 
      begin 
       String'Write(S_Port'access, st); 
      end; 
end MCVE; 
+0

MCVEのドキュメンテーションは皮肉なことに、はっきりしている必要があります。 – DonkeyOaty

+0

これはループの内部にあります - 繰り返される再宣言は問題の原因になりますか?手動で解放する必要がありますか?またはループの最後に自動消去されますか? – DonkeyOaty

+0

これは宣言ブロックの美しさです。「うまくいく」ことです。変数はループごとに異なるサイズにすることができますが、それらは 'end'で範囲外に出て自動的に解放されます(スタック割り当ては必須ではありませんが、通常の実装です。 。手動alloc/deallocや別々の "length"引数を持つ固定長文字列、または他の妥協解決策などのトリックが必要なことは少なくなりますが、見つけなければならないバグは少なくなります。 –

関連する問題