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にて定義し直すのはあまり良くないと思いましたので、
変数にて定義したいと思います。


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



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