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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0907
yen3.0aと3.1で動作が違うプログラム5解決


yen

リンク

2007/9/7(Fri) 19:32:19|NO.10906

dim	test,6,8		;----	変数初期化
goto *start *dialogHyouji ;---- テスト用に挿入したdialog表示 sa = ""+k@m0 repeat 8 i = cnt: sb = "" repeat 6 sb += " " + test@.cnt.i loop sa += "\n"+ sb loop dialog sa return #module ;---- モジュール ---- #deffunc scr_load repeat 8 ;---- 代入 ---- test@.0.k = rnd(256) test@.1.k = rnd(256) test@.2.k = rnd(256) test@.3.k = rnd(256) test@.4.k = rnd(256) test@.5.k = rnd(256) gosub *dialogHyouji@ k++ loop return #global *start scr_load ;---- テキストのロード関数 gosub *dialogHyouji stop

あまりスマートなプログラムではありませんがorz
このプログラムを3.1でコンパイルすると 変数k の内容を無視して(代入先を 変数test.*.0 として)
代入処理が行われてしまいます
関数をモジュールの外に出してやるとまともに機能するので、何かしらのバグのように思えるのですが
生来思い込みが激しい上に凡ミスばかり行うような人間ですので、単純な記述ミスか
重要な仕様変更の見落としをしているのかもしれません
無論ヘルプの変更点は目を通しましたが、ぴんとくるものがありませんでした

自分の側でも、もう一度ヘルプを精読し、HSPを再インストールしてテストする等して検証はしますが
どなたかお時間のある方の問題箇所の指摘や、動作報告が頂けると幸いです



この記事に返信する


tks

リンク

2007/9/7(Fri) 20:48:07|NO.10914

とりあえず方法だけ。
test@(0,k) = rnd(256)
test@(1,k) = rnd(256) test@(2,k) = rnd(256) test@(3,k) = rnd(256) test@(4,k) = rnd(256) test@(5,k) = rnd(256)
としてみてください。



Drip

リンク

2007/9/7(Fri) 20:53:10|NO.10915

Dripです。

 yenさん、こんにちは。
これはかなりぎょっとするプログラムですね;
モジュールは、あらゆるプログラムから読み込まれた場合でも外部のプログラムに
干渉することなく正常に動作する、いわゆるオブジェクト指向によるプログラムを目的とした
システムです。つまり、yenさんの書かれたscr_loadという命令は、
どこかの誰かが書いたプログラム上で読み込んでも正常に動作しなくてはなりません。
本来ならyenさんのモジュールを使用した下のプログラムでエラーは発生しないべきです。

#module ;---- モジュール ---- #deffunc scr_load repeat 8 ;---- 代入 ---- test@.0.k = rnd(256) test@.1.k = rnd(256) test@.2.k = rnd(256) test@.3.k = rnd(256) test@.4.k = rnd(256) test@.5.k = rnd(256) gosub *dialogHyouji@ k++ loop return #global scr_load ;---- テキストのロード関数
 しかし「ラベルが存在しない」というエラーが発生してしまうと思います。
これはモジュールから、親の持つラベルに直接ジャンプしようとしているためです。
HSPではあらゆる変数やラベルを如何なる階層からでもアクセスできるようにしているため
このような混乱が起きやすいのですが、もしも子から親の変数やラベルを参照するような
構想があるのならば、モジュール機能は使わず、gosubを使用するようにしてください。

 ご報告されたスクリプトは確かに理論上HSPのバグのように振舞いますが、
プログラム的な視点で判断するならば、プログラムが悪いとしか思えません。



tks

リンク

2007/9/7(Fri) 21:46:18|NO.10921

私のスクリプト、途中の空行は要りません。ミスです。

調べてみたところ、3.1RC1と3.1正式版との間で変化がおきています。

モジュール空間内で指数付きのフォーマットを使用するとエラーになる
不具合を修正。(HSPBT#177)

あたりが引っかかっているのかと。



yen

リンク

2007/9/8(Sat) 01:11:09|NO.10944

>Drip氏
申し訳ありません
実は(も何も、提示したプログラムは何の益にもならない物であることは明らかですが)
ゲームの画像処理を行う上で組み上げていたプログラムをシェイプし
問題部分のみを切り出した物で、dialogで変数内容を確認する部分をgosubで急造したのです
無論の事、本来ならばこのような愚行はしません。
数年前からHSP周りのコミュニティも覗かず
マニュアルとにらめっこしながら我流で場数を踏んできたため
やはりプログラマとしての常識が欠けているようです。
急造とはいえこのような軽薄なプログラムを提示し
当惑させてしまった事をお詫びします。そして丁寧なアドバイス、有難うございます

>tks氏
発言を聞いて初めて配列変数の指定方法がC似のこの方式に変更されていることを知りました
3.1正式版のマニュアルの配列変数の項にもしっかり書いてありますね
自分の環境では何故か従来の方式しか通じないようですが……
HSPBT#177、というのはバグトラッキングの177番の記事の事、でよろしいでしょうか?
自分の知識の程度では今一つ理解したとは言えませんが、感覚として
新旧の仕様が混在する過渡期に必然する"仕様”としてあきらめた方が良さそうだと思いました
わざわざ調査までして頂き、有難うございます。

現状作ってるソフトは3.0の仕様に合せて製作しているものなので
自分としては3.0でコンパイルすれば解決、なのですが
この際なので判り易い(そして不可解な要素の無い)
検証用のプログラムを目指して改めて組んでみました

;----	テスト用フラグの定義
;#const global repeatUseF ;---- 直接指定していたところをrepeatのcntで指定する ;#const global numUseF ;---- 変数kで指定していたところを変数numで指定する dim test,4,4 ;---- 本文 goto *start #deffunc dialogHyouji ;---- テスト用に挿入したdialog表示 string = "" repeat 4: i = cnt: strLine = "" repeat 4: strLine += " " + test@.cnt.i: loop string += "\n"+ strLine loop dialog string return #module #deffunc dainyuTest repeat 4 #ifdef repeatUseF repeat 4: test@.cnt.k = rnd(256): loop #endif #ifndef repeatUseF #ifdef numUseF test@.0.num = rnd(256): test@.1.num = rnd(256): test@.2.num = rnd(256): test@.3.num = rnd(256) #endif #ifndef numUseF test@.0.k = rnd(256): test@.1.k = rnd(256): test@.2.k = rnd(256): test@.3.k = rnd(256) #endif #endif dialogHyouji #ifdef numUseF num++ #endif #ifndef numUseF k++ #endif loop return #global *start dainyuTest: dialog "最終結果" :dialogHyouji end

プリプロセッサ命令で余計にごちゃごちゃになってしまったような気も致しますがorz
「どこまで無駄を省けるか」と追求していく内に、私が当初訴えていた「バグのような現象」が
非常に稀な現象である事が改めて判りました。
テスト用フラグのどちらか一つ(両方つけると意味の無い挙動しかしません)を定義した場合
正式版(と私の環境)でも目論見どおりの動作をします
状況があまりに特殊ですし、バグとして取り除く必要もなさそうだと私個人としては思います

本当にありがとうございました
解決表示にしていますが、支障が無ければ引き続き、指摘等があればしっかり拝見させて頂きます



yen

リンク

2007/9/8(Sat) 01:48:08|NO.10945

またうっかり……追記させていただきます
#module は #deffunc dialogHyouji の上に置いた方がmoduleの在り方としては正しいですね



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