HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0712
は?配列の大きさを知りたい2解決


は?

リンク

2022/7/12(Tue) 10:16:01|NO.96787

配列の大きさを調べる関数を作ろうと思いました
とりあえず関数化せず次のようにしました


#global dim zzz, 2, 3 i = 0 repeat a = zzz(0, i) onerror *loopnuke i = i + 1 loop *loopnuke mes i

「3」が出力されました 正解です
2次元配列なので横方向の大きさを知りたければ
a = zzz(1, 0)
とします

関数にしたいのて


#defcfunc TTTT array aaa i = 0 repeat a = aaa(0, i) onerror *loopnuke i = i + 1 loop *loopnuke return i end #global dim zzz, 2, 3 a = TTTT(zzz) mes a stop

としたところ無限ループにはまり帰ってきません
(論理エラーは出ません 表示ウインドウは出ますが,ウインドウを消すこともできません 安易に実行しないで下さい 私はタスクマネージャで止めました)
なぜでしょう
よろしくご教授ください

環境 Windows10 HSP3.6



この記事に返信する


沢渡

リンク

2022/7/12(Tue) 12:42:13|NO.96788

配列の大きさを調べるだけならlength系の関数を使えば良いのですが、
(ヘルプでlengthで検索してください)
今回のコードで無限ループになる理由について、

これは、モジュール内でgoto系の割り込み(今回のケースではgosubの付かないonerror)
が発生したせいでサブルーチンネストがリセットされ、
その結果「サブルーチン外のreturnは無効です」エラーが発生し、
無限に*loopnukeにジャンプし続けているせいです。
(*loopnukeの後にonerror 0とすればわかります)
サブルーチンやユーザー定義関数やユーザー定義命令の中で
goto系の割り込みを発生させるのは禁物です。

それからonerrorですが、ヘルプに書いてある通りこれは
「エラー後の処理を終えたらすぐに終了させる」ことが前提のものなので、
「エラー後も処理を続ける」ことを前提にして使用するのは避けた方が無難です。

あと細かい点ですが、実際のコードでは冒頭に「#module」は付いているのでしょうか?
「#module」と「#global」で挟まれた部分がモジュールとして扱われるので、念のため。



は?

リンク

2022/7/13(Wed) 07:12:04|NO.96796

早速のご教授ありがとうございます ヘルプを読み直します



ONION software Copyright 1997-2023(c) All rights reserved.