引数/戻り値に配列をNo.01374
さん 00/05/16 22:31
 
…使用できるといいのですけど、やってみた限りでは無視されてるようです。
サブルーチンから配列を返すことは無理で、グローバル変数にした配列に入れるしか
ないんでしょうか?
いちいち初期化する手間が省けるもので、ローカル変数でないと嫌だったりします。

なお、PC-PJ1-98 /Windows 98 で使っています。

[ ]
RE:01374 引数/戻り値に配列をNo.01377
杉浦 まさき さん 00/05/16 23:53
 
流 さん、こんばんは。
杉浦 まさき です。

>サブルーチンから配列を返すことは無理で、
>グローバル変数にした配列に入れるしかないんでしょうか?

無理だと思います&やれたらいいですね、確かに。
C++ の参照渡しみたいな感じで何とかならないかなぁ…(下記参照)。

  $$a[0] = "1st"; $$a[1] = "2nd";
 call sub $$a;
  $$b = $$return;
  ..
  sub:
    $$1[0] = "最初"; $$1[1] = "その次";
    return $$1; // これは値(のコピー)渡しになるんでしょうねぇ…。
                // てなわけでオーバーヘッドが心配(^^;。

#ま、でもこれは以前にあった「整数型と浮動小数点型両方欲しい」と
 同じで物事を複雑にするだけのような気もしますが(^^;。


[ ]
RE:01377 引数/戻り値に配列をNo.01380
さん 00/05/17 21:42
 
流です。やっぱり無理ですか…
これができると、再帰呼び出しに配列を用いてクイックソートが可能なんですが、残
念ですね。
INIファイルからメニュー項目を読み出して田楽サーバに渡す処理を書いていて

AddNewMenu:
ddepoke "newmenu", $$1;
while (##mcount < ##2){
##mcount = ##mcount + 1;
$$menu = getinistr($menufile, $$3, str(##mcount));
ddepoke "menuitem", $$menu;
}
return;

思ったのですけど、せっかくここで配列をつくっているのだから

AddNewMenu:
ddepoke "newmenu", $$1;
while (##mcount < ##2){
##mcount = ##mcount + 1;
$$menu = getinistr($menufile, $$3, str(##mcount));
ddepoke "menuitem", $$menu;
$$menuarray[##mcount - 1] = $$menu;
}
return $$menuarray;

と返してやることができれば、メニューの結果を

$$item = $$menuarray[val(rightstr(result, 1))];

という具合に、表示されたとおりの文字列で受け取れるので便利ではないかと。
できないんなら、しようがありませんかねえ。

[ ]
RE:01380 引数/戻り値に配列をNo.01382
ENCODINGSHIFTJIS さん 00/05/18 11:09
 
>これができると、再帰呼び出しに配列を用いてクイックソートが可能なんですが、
>残念ですね。

アルゴリズムの話ですが、クイックソートは再帰を使わなくとも実装できます。
大昔は、FortranW でも書いてました。区間情報ののスタックを自分で配列で
作りループします。  ただ再帰を使うと簡潔に書けると言うだけです。

再帰を使うアルゴリズムのほとんどは、再帰無しに書き直せる、というのもあります。

__E__

[ ]