関数の戻り値に配列を指定するには?

解決


ヨッシー  2002-10-03 02:17:31  No: 1622

関数の戻り値を文字列の配列にしたくて、以下のようにコーディングしたのですが、
”識別子が必要な場所に'ARRAY'があります”というエラーになってしまいます。
どなたか、解決法がわかる方いましたら、回答お願いします。

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    Function ArrayFunc() : Array [1..3] of String;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
var
SArr : Array [1..3] of String;
begin
    SArr := ArrayFunc();
end;

Function ArrayFunc() : Array [1..3] of String
begin
    ArrayFunc[1] := 'Name';
    ArrayFunc[2] := 'Address';
    ArrayFunc[3] := 'Tel';
end;

end.


hatena  2002-10-03 02:53:07  No: 1623

Delphi(Pascal)は型に厳格な言語なので、

type TMyArray = array[1..3] of String;

と型宣言してから、

Function ArrayFunc() : TMyArray;

などと関数宣言します。

使うときも、

var
  SArr : Array [1..3] of String;
begin
  SArr := ArrayFunc();
end;

などとすると、型が違いますと起こられます。

var
  SArr : TMyArray;
begin
  SArr := ArrayFunc();
end;

と同じ型の変数に代入しないとダメなんです。


たかみちえ  URL  2002-10-03 03:07:27  No: 1624

配列を戻り値に持つ関数を作るときは、そういう方法もありますけど、
オープン配列を変数のひとつに、varで指定する方法もあります。
ただ、オープン配列パラメータは、SetLengthで大きさを変更することができないので、
ちょっと面倒ですけど、準備用関数で、配列が用意すべきサイズを返すといいです。

  うちのホームページのうら、おんぷむらのうらに、stdMenuItemという、
TMeinMenuの配列を作成するユニットがあります。
参考にしてみてください。
http://TakamiChie.tripod.co.jp/(おんぷ村のうらへの直接のリンク)
おんぷ村倉庫>Delphiユニット>stdMenuItem.pas  です。

  配列の大きさが固定されたものは、試していませんけど、
同じ要領でできると思います。

procedure ArrayFunc(var Str:Array [1..3] of String);
begin
    Str[1] := 'Name';
    Str[2] := 'Address';
    Str[3] := 'Tel';
end;

とか。


hatena  2002-10-03 22:36:47  No: 1625

>procedure ArrayFunc(var Str:Array [1..3] of String);
>begin
>    Str[1] := 'Name';
>    Str[2] := 'Address';
>    Str[3] := 'Tel';
>end;

残念ながら、これはコンパイル通りません。
オープン配列パラメータは、大きさは指定できません。

procedure ArrayFunc(var Str:Array of String);
としないとダメです。しかし、これだと要素数が3以外の
配列でも渡せてしまうので、あまり使い勝手がよくないと
思います。

やはり型宣言してから、引数にする方がバグに強いコードに
なります。

type TMyArray = array[1..3] of String;

procedure  ArrayFunc(var MyArray: TMyArray);


ヨッシー  2002-10-08 02:43:59  No: 1626

みなさん、回答ありがとうございました。
以下のようにプログラムを変更してみましたが、
TMyArray = array[1..3] of String;
のところで、":が必要ですが、=が見つかりました"というエラーになってしまいました。
そこで、"="の部分を":"に変えてみたら、今度は"識別子が必要ですが、ARRAYが見つかりました"というエラーになってしまいました。
お手数ですが、対処法が分かる方がいましたら、またご教授お願いします。

type
  TForm1 = class(TForm)
    TMyArray = array[1..3] of String;
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    Function ArrayFunc() : TMyArray;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
var
SArr : TMyArray;
begin
        SArr := ArrayFunc();
end;

Function ArrayFunc():TMyArray;
var
SArr : TMyArray;
begin
        SArr[1] := 'Name';
        SArr[2] := 'Address';
        SArr[3] := 'Tel';
        ArrayFunc := SArr;
end.


にしの  2002-10-08 07:54:19  No: 1627

type
  TForm1 = class(TForm)
    TMyArray = array[1..3] of String;
の部分が間違っています。
type
  TMyArray = array[1..3] of String;
  TForm1 = class(TForm)
です。
type以降に型やクラスの定義がきますが、TForm1の定義は、最初のend;までです。
もし、TMyArrayをTForm1の後に定義するのであれば、end;の後に入れる必要があります。
# 今回は、Function ArrayFunc() : TMyArray;で使っているのでTForm1の前に入れないとだめです


hatena  2002-10-09 10:03:50  No: 1628

あと、ArrayFuncをTForm1のメソッドとして宣言してますので、

implementation部での実装は、TForm1. がいりますね。

Function TForm1.ArrayFunc():TMyArray;
         ^^^^^^^

TForm1 に依存しないのなら、

type
  TMyArray = array[1..3] of String;
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
Function ArrayFunc() : TMyArray;

というように、TForm1 の外にだせば、実装でTForm1.は
いらなくなります。


ヨッシー  2002-10-09 23:10:06  No: 1629

ありがとうございました。
解決しました。


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








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