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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0119
itoeincludeに関して、あるファイルでは動作するのに別のファイルでは動作しない17解決


itoe

リンク

2013/1/19(Sat) 09:16:01|NO.51944

includeに関して奇妙な現象に遭遇しています。

main.hspから以下のようなinclude文を書いた場合は問題無く動くのですが、


#ifndef _INDEXHSP #include "utils\\_index.hsp" #endif #ifndef _HUNIT #include "test\\_hunit.hsp" #endif #include "module.hsp"

main.hspと同じディレクトリにあるtest.hspに同じものを書いた場合、
以下のようなエラーが出てしまいます。

module.hsp(166) : error 2 : 文法が間違っています (166行目)
--> setwindowpos h@utils,-1,0,0,0,0, $40|$1|$2

main.hspではsetwindowposの部分は普通に呼び出せています。
test.hspには上記のinclude文以外は何も書いていません。

「あるファイルでは動くのに別のファイルでは動かない」という現象が起きているように見えます。
何が悪いのか全くわからず、お手上げ状態です。

ここが悪いかもとか、ここ調べてみたらとか、ヒント等ありましたら教えてください。



この記事に返信する


itoe

リンク

2013/1/19(Sat) 09:17:21|NO.51945

環境情報を書くのを忘れていました…。
hspのバージョンは3.3、OSはWin7 Home(64ビットオペレーティングシステム)です。



KA

リンク

2013/1/19(Sat) 10:19:33|NO.51946

MAIN.HSPとTEST.HSPは同じ内容と言う事でしょうか。
質問からでは、どういう関係なのか理解しづらいです。



itoe

リンク

2013/1/19(Sat) 10:43:09|NO.51947

>KAさん
わかりにくくて申し訳ありません。
具体的に書くとこんな感じです。

[MAIN.HSP]

#ifndef _INDEXHSP #include "utils\\_index.hsp" #endif #ifndef _HUNIT #include "test\\_hunit.hsp" #endif #include "module.hsp" 色々処理を書いている(includeしたモジュールも使っている)

[TEST.HSP]

#ifndef _INDEXHSP #include "utils\\_index.hsp" #endif #ifndef _HUNIT #include "test\\_hunit.hsp" #endif #include "module.hsp"

includeの部分は共通していて、mainにはその後で色んな処理を書いていて、testでは何も書いていないという感じです。



KA

リンク

2013/1/19(Sat) 12:07:53|NO.51948

ああ、以降の内容があるかないかの違いと言う事ですね。

MAIN.HSPをTEST.HSPにリネーム、およびその逆をやってみましょう。
内容の有無に関係するのかが判断できます。



itoe

リンク

2013/1/19(Sat) 12:21:18|NO.51949

>KAさん

>MAIN.HSPをTEST.HSPにリネーム、およびその逆をやってみましょう。
mainをtestにリネームし、testをmainにリネームしてから実行してみました。
リネーム後のtestは普通に動き、リネーム後のmainは前述と同じエラーが出ました。

仰るとおり、以降の内容の有無に関係してそうな挙動です。
以降の内容があれば問題無く動き、無ければエラーが出ます。
(内容が無ければ問題無く動いて、あればエラーが出るというのならわかるのですが、逆なのがいまいちピンと来ません…)



KA

リンク

2013/1/19(Sat) 16:54:46|NO.51953

_index.hsp も _hunit.hsp も module.hsp も、標準では付属してい
ないようなので詳しくは分かりませんが、そのエラーが示している部

>>module.hsp(166) : error 2 : 文法が間違っています (166行目)
>>--> setwindowpos h@utils,-1,0,0,0,0, $40|$1|$2
か、その近辺に問題が有るのかもしれません。

確かにピンと来ない現象ですね。



test

リンク

2013/1/19(Sat) 23:19:56|NO.51960

内容の有無が関係していることが分かっているのですから、
main.hspの内容を少しずつ削っていくか、あるいはlogmesなどを使って、main.hspのどこがエラーを起こす原因なのか突き止めるといいかもしれません。



レノス

リンク

2013/1/20(Sun) 00:28:11|NO.51961

hsp には使われていない #module を自動的に削除する機能があり、
削除されるモジュールの中はエラーチェックされません。

#module a // 文法違反 #global // コンパイル可能

main の残りのスクリプトが module.hsp の何らかのモジュールを使用するために、
そのモジュールの中にある文法エラーが表示されている、のかもしれません。



itoe

リンク

2013/1/20(Sun) 08:20:41|NO.51964

>皆様
返信ありがとうございます。
main.hspのどこが原因なのかを、少しずつ削っては実行することを繰り返して特定しました。
「エラーが起きている箇所のモジュール内」の命令を呼び出している部分を消したら、エラーが出ました。

レノスさんの仰る通りであれば、
モジュールは使われてなければ削除されて文法エラーもチェックされないとのことですが、
この挙動を見た限りではそうではないようです。
もしそうだとしたらエラーは出ないはずなので。

モジュールを使っている時はエラーが出ない(つまり文法的にも正しい)のに、
使わなければそのモジュール内で文法エラーが出る…という、やはりよくわからない状態が起きているように思えます。
少し試してみたところ、モジュールによってはこの現象が起きないこともあるので、なおさらよくわかりません。

とりあえず「新しく作ったモジュールは必ず使う」ことで回避できる、と認識しています。

このスレッドをこのまま解決にするのはちょっと強引なので、
返信待ちも兼ねて、もうちょっとこちらでも調べてから解決にしたいと思います。



KA

リンク

2013/1/20(Sun) 14:38:53|NO.51969

どちらにしても呼び出している **.hsp の内容が分からない
と、他人では検証出来ないと思われます。それと配置場所は
HSPのcommonフォルダという認識で良いのかな。



774

リンク

2013/1/20(Sun) 14:52:58|NO.51970

モジュール内で「SetWindowPos」の外部DLL呼び出し登録を行っているのではないでしょうか?
レノスさんの仰るケースでモジュールが削除された場合、
モジュール内の外部DLL呼び出し登録も無効になってしまう模様です。

結果、無効な命令を呼び出そうとした事による文法エラー扱いかと思います。



暇人

リンク

2013/1/20(Sun) 15:23:25|NO.51971

TEST.HSPの先頭に

#cmpopt optcode 0
を追加して確かめてみれば?



itoe

リンク

2013/1/20(Sun) 20:04:38|NO.51975

>KAさん
配置場所はcommonフォルダではありません。
全く別のフォルダです。
仰る通り、スクリプトの内容を載せるのが一番良いのですが、
ファイル数も行数も膨大なためあえて割愛させていただいています。

>774さん
>モジュール内で「SetWindowPos」の外部DLL呼び出し登録を行っているのではないでしょうか?
モジュール内ではなく、別のファイルで行っています。
フォルダ構造を書くと、こんな感じです。

utils
|---_index.hsp ←utils内のhspファイル全て(uselib.hspを含む十数個くらい)をincludeしています
|---uselib.hsp ←ここで外部DLL呼び出し登録を行っています
module.hsp
main.hsp
test.hsp

私の理解違いだったら申し訳ないのですが、
仰られている現象ではないように思います。

>暇人
そのようなオプションがあるのですね。勉強になりました。
試してみたところ、エラーはなくなりました。


レノスさんに774さん、とお二人とも同じ見解を出されている一方で、
私の理解はお二人のものとは違ったものになっているので、
これはたぶん私の方に非がある(何か勘違いをしている等)のだと思っています。
なので、いったん解決にして、詳しく調べてみるつもりです。
色々とありがとうございました。



暇人

リンク

2013/1/20(Sun) 21:21:25|NO.51976

エラーを再現するとこうなる

#module #uselib "USER32.DLL" #func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr #deffunc tes return #global //tesのコメントアウトを外せばエラーは出ない ;tes SetWindowPos hwnd, 0, 400, 400, 200, 200,0
#func をglobalで登録するなら#module〜#global外に置いた方が良い
そうしないとモジュール内のdeffunc登録命令等を使わない場合モジュールごと削除される



itoe

リンク

2013/1/20(Sun) 21:37:01|NO.51978

>暇人さん

再現ありがとうございます。が、

>#func をglobalで登録するなら#module〜#global外に置いた方が良い
困ったことに、既にglobalに置いているんです…。
GREPで調べたりもしたので間違いありません。

今直面している現象を、同じような再現で書くなら、

#uselib "USER32.DLL" #func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr #module #deffunc tes SetWindowPos hwnd, 0, 400, 400, 200, 200,0 return #global //tesのコメントアウトを外せばエラーは出ない ;tes

こんな感じです。
# この再現ではエラーは出ませんが。

今回の場合、

この部分と

#uselib "USER32.DLL" #func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr

この部分と

#module #deffunc tes SetWindowPos hwnd, 0, 400, 400, 200, 200,0 return #global

この部分、

//tesのコメントアウトを外せばエラーは出ない ;tes

それぞれが別ファイルになっていて、
mainからのincludeにて一つに取り込んでいるという形になっています。



暇人

リンク

2013/1/20(Sun) 22:07:09|NO.51979

># この再現ではエラーは出ませんが。
再現できないと推測しか出来ないので他人が解決するのは難しい
#cmpopt optcode 0でエラーが出ないって事は
MAIN.HSPで使っててTEST.HSPで使われてない新規登録命令等を調べてみれば良い
TEST.HSPの方に命令を追加していってエラーが出なくなるのを探すとか



暇人

リンク

2013/1/21(Mon) 00:04:58|NO.51981

>TEST.HSPの方に命令を追加していってエラーが出なくなるのを探すとか
モジュール毎(includeファイル毎ではなく)に1個だけ調べれば良いから楽



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