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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0220
Area39#defineを再定義しようとすると重大なエラーが発生する2解決


Area39

リンク

2024/2/20(Tue) 00:14:46|NO.101261

以下の#defineを使ったスクリプトですが、実行すると重大なエラーが発生してしまいます。


// 最小角度の指定1〜359にて指定 #define MIN_ANG 370//30 // 角度パラメーターのチェック #if ( MIN_ANG > 360 ) tmp = MIN_ANG #undef MIN_ANG #define MIN_ANG tmp\360 #endif #if ( MIN_ANG < 0 ) tmp = MIN_ANG #undef MIN_ANG #define MIN_ANG abs(tmp) #endif #if ( MIN_ANG == 0 ) #undef MIN_ANG #define MIN_ANG 360 #endif dialog MIN_ANG end

やりたいこととしては、MIN_ANGを誤って360よりも大きい数字を入れてしまった場合
360での割り算の余りを代入、
0より小さければ整数へ、0であれば360に、といった動作をしたいと思い記述しました


変数で代用すればいいような気もしますし、あまり美しい記述方法ではないような
気もしますが、技術的になぜエラーとなるのか教えていただけるとありがたいです。

よろしくお願いいたします。



この記事に返信する


沢渡

リンク

2024/2/20(Tue) 02:31:00|NO.101263

MIN_ANGは370なので、まず「#define MIN_ANG tmp\360」が適用されることに
なりますが、この時のMIN_ANGには「10」ではなく「tmp\360」という記述が入ります。
そのせいで、次の「#if ( MIN_ANG < 0 )」で「変数tmp」という
「プリプロセッサ命令にとってはあずかり知らないもの」を参照し計算しろと命じられ、
「そんなものわかりません」とエラーを吐くのでしょう。
(プリプロセッサ命令はプログラム実行時ではなく、それよりも前のコンパイル時に実行されるものなので)
以下のように、「#defineではなく#constを使う」「tmpも#constで定義する」
という風にすればどうでしょう?

// 最小角度の指定1〜359にて指定 #const MIN_ANG 370 //30 // 角度パラメーターのチェック #if ( MIN_ANG > 360 ) #const tmp MIN_ANG #undef MIN_ANG #const MIN_ANG tmp\360 #undef tmp #endif #if ( MIN_ANG < 0 ) #const tmp MIN_ANG #undef MIN_ANG #const MIN_ANG tmp*-1 //const内では関数は使えないので #undef tmp #endif #if ( MIN_ANG == 0 ) #undef MIN_ANG #const MIN_ANG 360 #endif dialog MIN_ANG end
ただ、「角度を正規化する」というコンセプトであれば、
角度の範囲は「0超、360以下」ではなく「0以上、360未満」にして、
マイナスの値の修正方法も変えた方がよさげです。

#const MIN_ANG 370 //30 #const tmp MIN_ANG #undef MIN_ANG #const MIN_ANG tmp\360 //この時点でMIN_ANGの範囲は「-360超、360未満」となる #undef tmp #if ( MIN_ANG < 0 ) #const tmp MIN_ANG #undef MIN_ANG #const MIN_ANG tmp+360 #undef tmp #endif dialog MIN_ANG end



Area39

リンク

2024/2/20(Tue) 21:54:55|NO.101269

沢渡 さま

原因について理解することが出来ました、ありがとうございます。
何度もdefineにて定義し直すのはあまり良くないと思いましたので、
変数にて定義したいと思います。


ありがとうございました!!



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101261への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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