ADAプログラムインスタンス(文字列タイプとその簡単な処理)

4629 ワード

ADA言語に組み込まれた文字列タイプは定長タイプであり,ほぼCに相当する静的文字配列に近い.ADAにとって、Stringも完全に文字配列の厳密な定義によって派生したものである(Wikibooks ADAタイプシステムのエントリについて参照;ADAの複雑なタイプシステムについては別途記述する必要がある).固定長文字タイプに対応するオペレーションパッケージはAda.Strings.Fixedにある.またStringタイプにもこのタイプのAttributeが多い.このような文字列は通常コンパイル期間中に長さを決定する(その限界パラメータによって指定された値または添付された値によって決定される)が、ADAの場合、この長さ決定は、文字列がすべてのデータ変数インスタンスと同様に変数定義領域に定義され、長さを限定することなく、1つの関数によって返される文字列によって決定されることができる.一方、サブルーチン変数定義領域の文字列については、1つの数値で変更することができる量は、実行時に構成する長さであり、これは拡張後のC言語のスタック空間割り当てのようなものです.(実はバックグラウンドでの動作メカニズムもそうですが、この特性はADAの他の配列Arrayにも適用されます).文字列がパラメータとしてサブルーチンに渡される場合、このパラメータのタイプは長さノードを含まずstringとして定義されなければなりません.これも分かりやすいです.これで、一般的な文字列処理については、このスタック空間割り当ての特性を十分に利用し、合理的に文字変数を作成します.この固定文字列タイプで十分です.
またADAのクラスライブラリにも文字列タイプが用意されており、1つの文字列オブジェクトに相当し、主に2つあります.1つはBounded(境界)タイプ、もう1つはUnbounded(境界なし)タイプ.Boundedタイプの使用には、定義された汎用パケットをインスタンス化する必要がありますが、この汎用パケットのパラメータは数値にすぎません.このパケットが提供するBounded文字列の最大長を指定するために使用されます.これにより、パケット内の機能がこの長さに基づいて記憶準備やポリシー構成などを行うと推定されますが、このパケットは各文字列インスタンスの長さを生成しません.この限界を超えられる.無境界タイプは、この指定を必要とせず、文字列も無限に増加します.
ADA文字列オペレータは、すでに見られた乗算が列をコピーするために使用されるほか、文字列接続には&,一般的な言語で使われている+ではありません(もちろんユーザーは変更することができますが、これはADAの一般的な実践に合致しません).注意しなければならないのは、2つの定長文字タイプ変数を接続し、1つの定長タイプ変数に値を付与すると、この変数はこの2つの接続された文字列の長さにきちんと合わなければならないなど、これは面倒ですが、これは仕方がありません.接続のほかに、ADAはいくつかの字を提供しています符号関数の挿入置換操作等(Replace_Slice,Overwrite,Insertなど)も便利です.ADAの定長タイプ求サブ文字列は配列の下付き文字列で指定するだけですが、文字列オブジェクト上で行うと、ADAは配列の下付き文字の演算子のリロードをサポートしないため、Slice/Replace_Sliceのような関数を使用して設定サブ列やElement/Replace_Elementを抽出して設定を抽出する必要があります1文字です.そしてstring,Bounded_StringとUnbounded_String間の変換は現在stringと後者の間の相互回転のみを提供しているようで、これらのADAライブラリについては拡張が更新される可能性があります.
with Ada.Text_IO;
use Ada.Text_IO;

with Ada.Strings.Fixed;
use Ada.Strings.Fixed;

with Ada.Strings.Bounded;
with Ada.Strings.Unbounded;

with Ada.Command_Line;

procedure adastrings is
  
  package CL renames Ada.Command_Line; -- shorten the package name
  package Bounded is new Ada.Strings.Bounded.Generic_Bounded_Length(Max => 128);
  use Bounded;
  use Ada.Strings.Unbounded;

  fixed_str_without_sizespec : string := "size determined by designated value";
  fixed_str_from_cmd_line : string := CL.Argument(1);
  fixed_str : string(1..32) := 32 * "0"; -- has to be 32
  fixed_str2 : string(1..32) := 32 * "1";
  fixed_str3 : string(1..64);
  bounded_str : Bounded_String;
  unbounded_str : UnBounded_String;
    
  -- create a string 'dynamically' by duplicating a string given times
  function duplicate_string(str: string; occurs : integer) return string is
    result : string := occurs * str;
  begin
    return result;
  end duplicate_string;
  
  -- create a string 'dynmically' by returning a string of any length 
  -- specified at run time
  function produce_blank_string(length : integer) return string is
    result : string(1..length) := length * ' ';
  begin
    return result;
  end produce_blank_string;

  procedure print_string (str : string) is
  begin
    put_line(str);
  end print_string;

  procedure print_string (bounded_str : bounded_string) is
  begin
    put_line(To_String(bounded_str));
  end print_string;

  procedure print_string (unbounded_str : unbounded_string) is
  begin
    put_line(To_String(unbounded_str));
  end print_string;

begin
  print_string("demo program for ada string types");
  print_string(fixed_str);

  fixed_str3 := fixed_str2 & fixed_str;

  print_string(fixed_str3);

  print_string(fixed_str2(1..16));

  fixed_str := Overwrite(fixed_str, 17, fixed_str2(1..16));

  print_string(fixed_str);
  print_string(fixed_str_without_sizespec);
  print_string(fixed_str_from_cmd_line);

  bounded_str := bounded_str & fixed_str;

  print_string(bounded_str);

  unbounded_str := To_Unbounded_String(To_String(bounded_str));
  unbounded_str := unbounded_str & "123";

  print_string(unbounded_str);

  Replace_Slice(unbounded_str, 3, 10, "replaced");
  print_string(unbounded_str);
 
  print_string(duplicate_string("Sample", 5));
  print_string(produce_blank_string(12));
  
end adastrings;
実行結果:
> adastrings.exe argument1
demo program for ada string types
00000000000000000000000000000000
1111111111111111111111111111111100000000000000000000000000000000
1111111111111111
00000000000000001111111111111111
size determined by designated value
argument1
00000000000000001111111111111111
00000000000000001111111111111111123
00replaced0000001111111111111111123
SampleSampleSampleSampleSample