ArrayofWString = array of WideString;

解決


DSC  2007-10-17 04:31:14  No: 28020

勉強のためにとあるコードを見ていたらtype節に「ArrayofWString = array of WideString;」というコードが書かれていました。

ただ残念な事にそれ以降のコードでこの「ArrayofWString 」が利用されていないため利用方法がわかりません。

例えば、
  var
    a : ArrayofWString;
としてやることでvarで定義はできる(エラーメッセージが出ない)のですが、
実際にbeginの後でどの様に利用すれば良いのでしょうか?

具体的には、「a」にString型の文字列を入れたり、逆に「a」に入っている文字列をshowmessegeで出す方法を知りたいです。

よろしくお願いいたします。


DSC  2007-10-17 05:33:37  No: 28021

それから、
type節に「ArrayOfWString = array of WideString;」
とすることの利点は何なんでしょうか??

どなたか、ご教示お願いいたします。


うんと  2007-10-17 07:55:00  No: 28022

たんなる WideString の動的配列の型の別名定義(エリアス)です。

type
ArrayOfWString = array of WideString;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: ArrayOfWString;
begin
  SetLength(a, 2);
  a[0] := 'Hello, Delphi!';
  a[1] := 'あいうえお';
  Caption := a[0];
  Button1.Caption := a[1];
end;

>とすることの利点は何なんでしょうか??

この場合は、なんの利点もないですね。プログラマの趣味の問題でしょう。

わたしだったらこんな醜い定義はしませんね。


まあ...  2007-10-17 09:51:14  No: 28023

>>とすることの利点は何なんでしょうか??
>この場合は、なんの利点もないですね。プログラマの趣味の問題でしょう。
>わたしだったらこんな醜い定義はしませんね。

「醜い定義」であるかどうかは主観の問題ですが、動的配列を引数にする場合には、
この↓定義は「利点がある」、というより「必須」です。

type
  ArrayOfWString = array of WideString;

procedure hoge(var a: ArrayOfWString);
begin
  SetLength(a, 2);
  a[0] := 'Hello Delphi!';
  a[1] := 'あいうえお';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: ArrayOfWString;
begin
  hoge(a);
  Caption := a[0] + a[1];
end;


DSC  2007-10-17 18:03:42  No: 28024

ようやく理解できました。
お二方、ありがとうございました。


うんと  2007-10-17 19:39:37  No: 28025

解決済みですが

まあ...さん

>「醜い定義」であるかどうかは主観の問題ですが、動的配列を引数にする場合には、
>この↓定義は「利点がある」、というより「必須」です。

おお、そうでした。忘れてました。すみません。
これはオープン配列パラメータと、見かけ上同じであることを防ぐためですね。

実際は、関数中でのパラメータが SetLength() でオープン配列パラメータと
見なされるためコンパイルできないのを防ぐためです。配列の長さを変更しなければ、array of WideString のままでもよいですね。

動的配列は、Delphi に後付けされたものなので、言語上、特殊で醜い仕様と
言えるかもしれません。すごく便利ですが。


DSC  2007-10-17 20:49:49  No: 28026

>うんとさん
追加説明ありがとうございます。

動的配列とオープン配列パラメータ。
初めての言葉でしたのでググって勉強してきました。
・動的配列
  http://www.wwlnk.com/boheme/delphi/tips/tec1050.htm
・オープン配列パラメータ
  http://kakinotane.s7.xrea.com/delphi/d2/d028.html

>実際は、関数中でのパラメータが SetLength() でオープン配列パラメータと
>見なされるためコンパイルできないのを防ぐためです。配列の長さを変更し>なければ、array of WideString のままでもよいですね。

この部分の説明について、私の知識が少なく理解できていないため、
もしまだご覧になっていらっしゃるようでしたら確認させていただきたいのですが、
以下のような考え方で合っていますでしょうか。

procedure hoge(var a: array of WideString);  
としてしまうとオープン配列パラメータとして認識される。
しかし関数内部で「SetLength(a,2) 」と出てくるとこれは動的配列を意味し、
整合が取れないためコンパイル時にエラーが出てくる。

これを回避するためには、つまり動的配列として認識させるために、
type
  ArrayOfWString = array of WideString;
とする必要がある。


うんと  2007-10-17 22:55:53  No: 28027

そうだ、と思います。

オープン配列パラメータはサイズが異なる場合でも、同じ形式で
関数が同じ型の複数の引数を受け取れる便利な仕組みです。
普通の配列も、動的配列も受け取れます。また、値を並べた
だけでも、自動的に配列として受け取れます。

動的配列は、Delphi4 か 5 で、はじめて実装されたもので、
このとき、型宣言で

array of WideString

のような、オープン配列パラメータと同じ形式にしたのですね。

個人的にはこのとき、キーワードを一つ増やして、

dynamicarray of WideString

のようにすべきだった、と思います。そうすれば、型宣言を
関数のパラメータにそのまま使えない、というような言語上の
例外がないのに加えて、コンパイラはちゃんと区別できたのに、
と思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加