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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0811
風の谷のウマシカ#deffuncの中でifを使うと・・・16解決


風の谷のウマシカ

リンク

2006/8/11(Fri) 07:20:30|NO.1944

皆さんいつもご教授有難うございます。また来ました。(T_T)
任意の文字列型の数字を、連続して日本語の文字に置き換える為に、
#deffunc〜if〜returnとやっていますが、エラーメッセージ30(無効なパラメーター)が出てしまいます。

デバッグウインドウを見ると、値を#deffuncに渡した途端に、変数の型をstrからintに
変えられたりしている様です。もちろん変数型は指定してあるのですが・・。
#deffuncの中でifを使う事はできないのでしょうか?
それとも何かまた別の勘違いが・・。簡略化するとこんな感じなのですが・・。



sdim FLootList_A FLootList_A(0)=りんご FLootList_A(1)=1 ;因みに、この配列は実際に制作中のツールの中では、要素が10個くらいあるので、多次元配列で片付けることはできません。 ;こう言う配列変数が数百個あります。 sdim FLootList_B FLootList_B(0)=りんご FLootList_B(1)=2 sdim FLootList_C FLootList_C(0)=ぶどう FLootList_C(1)=3 sdim FLootList_D FLootList_D(0)=ぶどう FLootList_D(1)=4 #deffunc SuouhinCodeHenKan str SuouhinnCode if SuouhinnCode=1 : HinnSyu="青森りんご"  ;この行で「#Error 30-->無効なパラメーターに指定されています」が出る if SuouhinnCode=2 : HinnSyu="秋田りんご" if SuouhinnCode=3 : HinnSyu="巨峰" if SuouhinnCode=4 : HinnSyu="マスカット" return SuouhinCodeHenKan FLootList_A(1) mes HinnSyu ;この繰り返しで、全てのFLootList_*(1)の商品コードを日本語の名前に置き換えるのが狙いなのですが・・。 stop


因みにデバッグウインドウを見ると変数名「FlootList_A」〜「FlootList_D」の型が全てintになっています。
それと、#Error 30は「実態のないエイリアスやローカル変数が参照された場合にも表示されることがあります。」
と、マニュアルに書かれている様です。しかしそもそも変数型が・・。



この記事に返信する


kz3

リンク

2006/8/11(Fri) 08:04:53|NO.1945




風の谷のウマシカ

リンク

2006/8/11(Fri) 09:07:36|NO.1947

「デバックをしろ」と言う事は、根本的な構文間違いや、仕様に関する、誤解は無い。
という事でしょうか。どうやら「ちょっとした勘違いに気付け」というヒントの様ですねえ。

デバックの仕方のところはもちろん読みました。と言って威張っている場合でも無いですが・・。

「青森リンゴ」の行で処理が止まっているのは明らかですが、何故止まるのでしょう。
むむむむ。



風の谷のウマシカ

リンク

2006/8/11(Fri) 09:31:24|NO.1948

変数の型に関係有るとしたら

if SuouhinnCode="1" : HinnSyu="青森りんご"

かな?最初から、これらの番号は文字列型配列変数の一部だし。
HinnSyu="青森りんご"は、これ以上どうしようもないし・・。



ゆちボン

リンク

2006/8/11(Fri) 09:49:24|NO.1950

思いっきり改造しましたが動くようになりました
「青森りんご」と表示されればいいんですよね?
「hinsyu」というモジュールを勝手に定義していますが、
モジュールを開始して、「#global」で戻るようにすると
エラーが発生しなくなりました。

ただ1つ注意点が定義したときより下でないといけないので、
別のファイルに分けて「#include」などで読み込むとかがいいです。
(ソースが長くなるので)


#module "hinsyu" #deffunc SCHK int SC Sdim Hinnsyu , 32000 if(SC=1) : HinnSyu = "青森りんご";この行で「#Error 30-->無効なパラメーターに指定されています」が出る if(SC=2) : HinnSyu = "秋田りんご" if(SC=3) : HinnSyu = "巨峰" if(SC=4) : HinnSyu = "マスカット" return Hinnsyu #global ;プログラム sdim FLootList_A FLootList_A(0)=りんご FLootList_A(1)=1 ;因みに、この配列は実際に制作中のツールの中では、要素が10個くらいあるので、多次元配列で片付けることはできません。 ;こう言う配列変数が数百個あります。 sdim FLootList_B FLootList_B(0)=りんご FLootList_B(1)=2 sdim FLootList_C FLootList_C(0)=ぶどう FLootList_C(1)=3 sdim FLootList_D FLootList_D(0)=ぶどう FLootList_D(1)=4 SCHK FLootList_A(1) mes refstr ;この繰り返しで、全てのFLootList_*(1)の商品コードを日本語の名前に置き換えるのが狙いなのですが・・。 stop



トホホッティー

リンク

2006/8/11(Fri) 09:49:45|NO.1951

こんにちは、トホホッティーです。


FLootList_A(0)=りんご FLootList_A(1)=1


FLootList_A(0)="りんご" FLootList_A(1)="1"
としてみてください。



同じ変数に文字型と数値型は混在できません。


FLootList_A(0)="りんご" FLootList_A(1)=1
とするとエラーになります。



かきしす

リンク

2006/8/11(Fri) 10:00:36|NO.1952


goto *main #deffunc SuouhinCodeHenKan str SuouhinnCode if SuouhinnCode="1" : HinnSyu="青森りんご" if SuouhinnCode="2" : HinnSyu="秋田りんご" if SuouhinnCode="3" : HinnSyu="巨峰" if SuouhinnCode="4" : HinnSyu="マスカット" return *main sdim FLootList_A FLootList_A(0)="りんご" FLootList_A(1)="1" ;因みに、この配列は実際に制作中のツールの中では、要素が10個くらいあるので、多次元配列で片付けることはできません。 ;こう言う配列変数が数百個あります。 sdim FLootList_B FLootList_B(0)="りんご" FLootList_B(1)="2" sdim FLootList_C FLootList_C(0)="ぶどう" FLootList_C(1)="3" sdim FLootList_D FLootList_D(0)="ぶどう" FLootList_D(1)="4" SuouhinCodeHenKan FLootList_A(1) mes HinnSyu ;この繰り返しで、全てのFLootList_*(1)の商品コードを日本語の名前に置き換えるのが狙いなのですが・・。 stop
#deffuncの部分は 通らないように迂回してあげると良いようです。
この辺、ヘルプだけじゃわかりづらいですが、
プログラムガイドのモジュールの部分でそれっぽい表記があります。

デバッグの仕方を提示されたのは、風の谷のウマシカさんの最近の質問を踏まえると 多分・・・
  ●試行錯誤が足りない。
    ●マニュアルの熟読が足りない。
      ●他の人のプログラムを色々見て参考にするのが足りない。
  ・・・という戒めではないかと思います。
  



トホホッティー

リンク

2006/8/11(Fri) 10:09:23|NO.1953


FLootList_A(0)=りんご
では「”」がないので「りんご」という日本語変数として処理され「りんご」変数には
値が入っていないので0がFLootList_A(0)に代入されます。

そして「りんご」変数は数値型なのでFLootList_A(0)も数値型に変わってしまってます。
なので、文字型と宣言してても変更されてました。

ということだとおもいます。



kz3

リンク

2006/8/11(Fri) 10:37:22|NO.1954

>「デバックをしろ」

「しろ」といわれなくても、デバッグしなければバグが取り除けないことは分かりますよね?

>と言う事は、根本的な構文間違いや、仕様に関する、誤解は無い。
>という事でしょうか。

思い込みを捨てて、デバッグに取り込んで下さいということです。
それにデバッグのためのコードも書いて下さい。自分でデバッグするために。

mesデバッグとか、dialogデバッグとか、stopデバッグとか実践しました?
初歩的過ぎて書いていられませんか?

sdim FLootList_A FLootList_A(0)=りんご FLootList_A(1)=1 ;因みに、この配列は実際に制作中のツールの中では、要素が10個くらいあるので、多次元配列で片付けることはできません。 ;こう言う配列変数が数百個あります。 /* 不要部分は削除 */ /* ;ここにstopを書くことで、変数を文字列型に初期化して、値を代入した結果が ;自分の意図した値で設定されているのかどうかを確認できます。 ;全ての原因はここで値を確認しないから。 ;「りんご」は文字列か?数値か?変数か? ;整数を代入したら変数の型はどうなるのか? stop */ #deffunc SuouhinCodeHenKan str SuouhinnCode /* ;ここにmesを書いてSuouhinnCodeを確認。 mes SuouhinnCode ; エラーの場合、SuouhinnCodeには適切な値が渡されていないことが分かる。 */ if SuouhinnCode=1 : HinnSyu="青森りんご" ;この行で「#Error 30-->無効なパラメーターに指定されています」が出る ;じゃぁその前にSuouhinnCodeの値を確認すればいい。何故しない? if SuouhinnCode=2 : HinnSyu="秋田りんご" if SuouhinnCode=3 : HinnSyu="巨峰" if SuouhinnCode=4 : HinnSyu="マスカット" return SuouhinCodeHenKan FLootList_A(1) ;strの引数にFLootList_A(1)を渡せる? mes HinnSyu ;この繰り返しで、全てのFLootList_*(1)の商品コードを日本語の名前に置き換えるのが狙いなのですが・・。 stop



風の谷のウマシカ

リンク

2006/8/11(Fri) 12:42:39|NO.1957

皆さん有難うございます。


トホホッティーさんにご指摘いただいた

FLootList_A(0)="りんご"
FLootList_A(1)="1"

のあたりは、考えたらすごく基本的なミスですね。面目ありません。
これでも、ウンウンうなってマニュアル読んだり考えたりしてるんですけどねー。
#deffuncにばかり気を取られていました。頭を冷やします。

これでもmesやstopは一応入れまくっていた積りでしたが、
FLootList_A(1)の値だけ確認して
FLootList_A(0)には全く関心を払っていませんでした。
「思い込みを捨てて」が出来てませんでした。ここんところは図星です。仰る通りです。
#deffuncの直前より後の所に適切な値が渡されていない事はデバッグして理解していましたが
その理由に気付くことができていませんでした。反省しまくっています。
ご指導感謝致します。



「#deffuncの部分は 通らないように迂回」これが分かりませんでした。教えて戴いてわかりました。
有難うございました。

「#module〜#global」の間に入れるやり方・・これは私も試したんですけど、
他の所もおかしかったので、うまく行ってなかったようです。
ただ、いずれにしても構文の書き方は、私が思っていたのと大分違う様です。



実はゆちポンさんに教えて戴いたやり方だけ、まだ全部理解できていません。
大方は解決したんですけど、もうちょっと、マニュアル読んで
ちゃんとわかってから「解決」にしますね・・。ここだけ、もうちょっと作戦タイムです・・。



かきしす

リンク

2006/8/12(Sat) 07:44:11|NO.1970

どうも良くわからないんですが・・・
とりあえず前半のコードには、ラベル(*main)が抜けていて
実行すると『致命的なエラー』が出ます。
#deffuncブロックの『return』 の後の行に『*main』ラベルが必要ですね。
(でも風の谷のウマシカさんは、
  この前半で『4つ全て表示する事に成功しました。』って言っているんですよね・・・)

で、後半。
『かきしすさんバージョンをそのままコピペする感じで、#deffuncの場所だけ移動しました』
・・・って言う割に、ゆちボンさんの方法を中途半端に取り入れてます。

僕のバージョンと、ゆちボンさんのバージョンの違いを良く確かめてください。



風の谷のウマシカ

リンク

2006/8/12(Sat) 07:48:20|NO.1971

とりあえず、変数の型が間違っている所は全部直して
かきしすさんに教えて頂いたやり方で、品種の名前を4つ全て表示する事に成功しました。
「果物の在庫一覧表」の値を入れ替えても、ifが正しい判定をしている事も確認しました。


;果物の商品コード一覧表 goto *main #deffunc SyouHinnCodeHenKan str SyouHinnCode if SyouHinnCode="1" : HinnSyu="青森りんご" if SyouHinnCode="2" : HinnSyu="秋田りんご" if SyouHinnCode="3" : HinnSyu="巨峰" if SyouHinnCode="4" : HinnSyu="マスカット" return *main ;果物の在庫一覧表 sdim FLootList_A FLootList_A(0)="りんご" FLootList_A(1)="1" sdim FLootList_B FLootList_B(0)="りんご" FLootList_B(1)="2" sdim FLootList_C FLootList_C(0)="ぶどう" FLootList_C(1)="3" sdim FLootList_D FLootList_D(0)="ぶどう" FLootList_D(1)="4" ;商品コードを品種名に変換 SyouHinnCodeHenKan FLootList_A(1) FlootList_A_HinnSyu=HinnSyu SyouHinnCodeHenKan FLootList_B(1) FlootList_B_HinnSyu=HinnSyu SyouHinnCodeHenKan FLootList_C(1) FlootList_C_HinnSyu=HinnSyu SyouHinnCodeHenKan FLootList_D(1) FlootList_D_HinnSyu=HinnSyu ;お客様向けの、お品書き mes FlootList_A_HinnSyu mes FlootList_B_HinnSyu mes FlootList_C_HinnSyu mes FlootList_D_HinnSyu stop


実用面ではこれで解決なのですが、ゆちポンさんに教えて頂いたやり方も、
変数型の間違いを直して、作り直してみる事にしました。

マニュアルのモジュールの所を読み直したりして、
「今の所、変数名やラベルが重複する所はないので、本質的には同じ」という理解をしました。
(もしかしたら、これ間違ってますか?)

余分なタイプミスがあるといけないので、かきしすさんバージョンを
そのままコピペする感じで、#deffuncの場所だけ移動しましたが、上手く行きません。
どうしてでしょう・・

とにかくmesを入れまくってみました。


;果物の商品コード一覧表 #module "CodeItiRannHyou" #deffunc SyouHinnCodeHenKan str SyouHinnCode if SyouHinnCode="1" : HinnSyu="青森りんご" : mes "\n(処理順9-1)"+HinnSyu////////////////OK if SyouHinnCode="2" : HinnSyu="秋田りんご" : mes "\n(処理順10-1)"+HinnSyu///////////////OK if SyouHinnCode="3" : HinnSyu="巨峰" : mes "\n(処理順11-1)"+HinnSyu/////////////////////OK if SyouHinnCode="4" : HinnSyu="マスカット" : mes "\n(処理順12-1)"+HinnSyu///////////////OK return #global ;果物の在庫一覧表 sdim FLootList_A FLootList_A(0)="りんご" : mes "(処理順1)"+FLootList_A(0)///////////////////////////////OK FLootList_A(1)="1" : mes "(処理順2)"+FLootList_A(1)////////////////////////////////////OK sdim FLootList_B FLootList_B(0)="りんご" : mes "(処理順3)"+FLootList_B(0)///////////////////////////////OK FLootList_B(1)="2" : mes "(処理順4)"+FLootList_B(1)////////////////////////////////////OK sdim FLootList_C FLootList_C(0)="ぶどう" : mes "(処理順5)"+FLootList_C(0)///////////////////////////////OK FLootList_C(1)="3" : mes "(処理順6)"+FLootList_C(1)////////////////////////////////////OK sdim FLootList_D FLootList_D(0)="ぶどう" : mes "(処理順7)"+FLootList_D(0)///////////////////////////////OK FLootList_D(1)="4" : mes "(処理順8)"+FLootList_D(1)+"\n"///////////////////////////////OK ;商品コードを品種名に変換 SyouHinnCodeHenKan FLootList_A(1) : mes "(処理順9-2)"+HinnSyu//////////////////////////NG 値が「0」になっている。デバックウインドウでは変数型がint FlootList_A_HinnSyu=Hinnsyu : mes "(処理順9-3)"+HinnSyu+FlootList_A_HinnSyu////////////NG HinnSyuもFlootList_A_HinnSyuも値が0になっている。デバックウインドウでは変数型がint SyouHinnCodeHenKan FLootList_B(1) : mes "(処理順10-2)"+HinnSyu/////////////////////////当然NG FlootList_B_HinnSyu=HinnSyu : mes "(処理順10-3)"+HinnSyu+FlootList_B_HinnSyu///////////当然NG SyouHinnCodeHenKan FLootList_C(1) : mes "(処理順11-2)"+HinnSyu/////////////////////////当然NG FlootList_C_HinnSyu=HinnSyu : mes "(処理順11-3)"+HinnSyu+FlootList_C_HinnSyu///////////当然NG SyouHinnCodeHenKan FLootList_D(1) : mes "(処理順12-2)"+HinnSyu/////////////////////////当然NG FlootList_D_HinnSyu=HinnSyu : mes "(処理順12-3)"+HinnSyu+FlootList_D_HinnSyu///////////当然NG ;お客様向けの、お品書き・・・mesが増えるとデバッグが、ややこしいので、一旦無効化。 ; ; mes FlootList_A_HinnSyu ; mes FlootList_B_HinnSyu ; mes FlootList_C_HinnSyu ; mes FlootList_D_HinnSyu stop


見落しの出ないデバッグのやり方は、たぶん自信が付いて来ました。しかし・・

module内の処理はうまく行っているのですが、(処理順 9-2・3 10-2・3 11-2・3 12-2・3)が全滅です。
だからreturnに失敗しているということですね。returnの後に"Hinnsyu"を入れてrefstrで取り出そうとしましたが
このスクリプトで無理矢理そんな事は出来ないようです。
「ユーザー定義命令」を「モジュール定義命令」として分離しただけなのに、何故こうなるのか理解できていないと無意味だし。
どうもデバッグだけの問題ではなくて、私の場合「拡張文法」自体の理解に致命的な勘違いがあるとしか思えないのですが・・。



風の谷のウマシカ

リンク

2006/8/12(Sat) 07:53:15|NO.1972

すいません。コメント1969の *mainが抜けているところは、

コピペした時に漏れていたので、再アップしましたが、時間差でかきしすさんに
レスを戴きました。



風の谷のウマシカ

リンク

2006/8/12(Sat) 07:57:22|NO.1973

どうも私がわかっていないのは

>僕のバージョンと、ゆちボンさんのバージョンの違いを良く確かめてください。

のところの様です。

>本質的には同じ

という理解が、やっぱり間違ってるんですね。



かきしす

リンク

2006/8/12(Sat) 08:06:02|NO.1974

ちなみに
> returnの後に"Hinnsyu"を入れてrefstrで取り出そうとしましたが
> このスクリプトで無理矢理そんな事は出来ないようです。
・・・とありますが、出来ませんでしたか?

もしや、

return "Hinnsyu"
 と書いたとか・・・?

やるとしたら、

return Hinnsyu
ですからね。



kz3

リンク

2006/8/12(Sat) 08:58:02|NO.1975

>>本質的には同じ
>という理解が、やっぱり間違ってるんですね。

そうですね。本質的に違います。(何を本質とするか?)
まずはマニュアルの「モジュール定義命令」を読んでみてください。

>通常のサブルーチン呼び出しと考えると、変数aの名前がtest1の中でも使用されているため、正しく動作しないはずです。しかし、モジュール定義命令を使ってソースが分離されているため、モジュールの中にある変数aと、外にある変数aが別なものとして扱われているので、上のスクリプトは正しく動作します。

という記述を見つけられましたか?

何が違うかというと、#module〜#global(以下、モジュール)で括った中身はモジュールの外からでは通常見えないことです。
モジュールの中で変数Hinnsyuに文字列を代入していますが、この変数は外からは見えません。
外で同名の変数を書くと外だけで使える変数Hinnsyuという新しい変数が出来ます。

デバッグウィンドウの「モジュール」をチェックして変数名を確認してみてください。



風の谷のウマシカ

リンク

2006/8/12(Sat) 09:47:29|NO.1976

かきしすさんへ 有難うございました。

「return "Hinnsyu"」を「return Hinnsyu」に直すと、成功しました。
これもつまらない間違いですね。有難うございました。



一番大事な事がわかっていなくて、場当たりの試行錯誤で、つまらない間違いをして、
ご指摘戴くまで気付いていませんでした。



kz3さんへ 有難うございました。

一番大事な事が、やっとわかりました。「return Hinnsyu〜refstrで取り出し」で成功したものの
「じゃあなぜ、コメント1971の前半のやり方では、#Moduleブロックから出た途端に、値がintの0になるのか」
わからずに、頭を抱えていた所です。

マニュアルは何度も読み返していましたが
「#module〜#global(以下、モジュール)で括った中身はモジュールの外からでは通常見えない」が
理解できていませんでした。「変数やラベルがカブっても平気」という理解だけで終っていました。
そのためにrefstrやrefdvalを、ちょっとしたオマケの命令程度にしか思っておらず、かきしすさんに
ご指摘戴くまで、ミスを直せば成功していた事にも気付いていませんでした。
デバッグウィンドゥの「モジュール」の所が何の為に有るかも、これでわかりました。


やっと、疑問が全部解けました。「動いたからもうイイヤ」にしなくて良かったです。
最後までお付き合い戴き有難うございました。

その他の皆さんも有難うございました。とても勉強になりました。



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