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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0718
ヂオン#constl なるプリプロセッサ命令がほしい12解決


ヂオン

リンク

2012/7/18(Wed) 01:59:54|NO.47755

贅沢かもしれませんが、#const に さまざまなカウント値を定義するプリプロセッサ命令がほしいです。
命令名は、仮に #constl とします。


#define txt "てすと" #define arr 1,2,3,4,5,6,7 #constl lent txt // 展開すると #const lent 6 #constl lena arr // 展開すると #const lena 7



この記事に返信する


YSR

リンク

2012/7/18(Wed) 08:17:06|NO.47758

そんなん#enumでええやんけ……


#enum lent=6 #enum lena mes lent mes lena


│実行



6 7



spider

リンク

2012/7/18(Wed) 09:59:52|NO.47762

実装するには
プリプロセッサの前に処理しなければならない。
プリプリプロセッサ命令か?



spider

リンク

2012/7/18(Wed) 15:09:49|NO.47764

ん?
でもそうすると、txtとか
認識できないぞ。そうか、
プリプロセス→プリプリプロセス(仮)→プリプロセス
っとすればいいのか。



check

リンク

2012/7/18(Wed) 17:12:04|NO.47766

プリプリプロセスとか別に必要ではない。
文字列や配列を定数として扱えば、(少なくとも文字列は定数だ)
コンパイラ側がその長さを計算することができる。
ただし、そのサイズをスクリプト側で受け取る命令が必要になってくるが。
(C/C++のsizeofのような。)

まあ実装されることはないだろうけれど。



YSR

リンク

2012/7/18(Wed) 22:57:28|NO.47772

>checkさん
あなたのレスでやっと質問者の意図を知りましたorz
要するに、
「#defineした配列・文字列の長さをとるプリプロセッサ命令が欲しい」
ってことなのか……要るのか、それ?



ヂオン

リンク

2012/7/19(Thu) 02:39:43|NO.47775

問題は有って無い様なものですが、
処理効率や、実行ファイル化された後のサイズなどをつきつめてゆくと、strlen や length では、満足できなくなるのです。

>>M さん

length はともかく、strlen と 定数では、かなりの差が生じると思います。
strlen は 内部で Nullポインタ を検索する処理をしています。要するに以下のような処理が行われているということです。


// このスクリプトは例です #module #defcfunc slen str tx_ , local rt_ , local v_ v_=tx_ repeat if(peek(v_,cnt)==0):rt_=cnt:break loop return rt_ #global mes slen("18と表示されるはず") mes strlen("18と表示されるはず")

この処理を全て省けるんじゃないかということです。


#include "gdi32.as" #define txt "18と表示されるはず" #constl len txt TextOut hdc,0,0,txt,len

このスクリプトを展開すると、


#uselib "gdi32.dll" #func TextOutA "TextOutA" sptr,sptr,sptr,sptr,sptr TextOutA hdc,0,0,"18と表示されるはず",18

の様になれば便利だと思います。
自分で、数えて打ち込む方法もありますが、色々と面倒ですし。

この方法が有れば

tx = "18と表示されるはず"
TextOutA hdc,0,0,tx,strlen(tx)

の様にやらなくてもいいのではないでしょうか



check

リンク

2012/7/19(Thu) 03:21:24|NO.47776

常に文字列のサイズが変わるかもしれないインタプリタ言語にそんなものを求めてられてもなぁ。
#constl len txt の対象となったtxtの内容がスクリプト実行中に変わったらどうするんだ?

便利といえば便利かもしれないが、その実装に時間を費やすのであれば
「個人的には」ほかの機能に時間をまわしてほしいと思うわ。
別のスクリプトに同じ文字列を打ち込んでその長さをmes strlen(text)とでも表示させる、
という手段があるのだから。



ヂオン

リンク

2012/7/19(Thu) 03:54:13|NO.47777

実は下のスクリプトに類する事をしたいだけだったりします。


#const fontsize 32 #define txt "freeze" #const len 6 // #constl len txt の展開後とする。 #const wndsizex 640 #const wndsizey 480 #const px (wndsizex-(fontsize/2*len)) / 2 #const py (wndsizey-fontsize) / 2 screen 0,wndsizex,wndsizey font msGothic,32 pos px,py mes txt

展開後はこんな感じに成って、幸せな気分になれます。


screen 0,640,480 font "MS ゴシック",32 pos 272,224 mes "freeze"



ヂオン

リンク

2012/7/19(Thu) 04:29:02|NO.47778

配列的な、カウントに関しては、引数の数によるプリプロセッサ分岐が出来たりするので
もしかしたら使い道が有るかも?



check

リンク

2012/7/19(Thu) 14:26:34|NO.47779

そもそもプリプロセッサで、スクリプトを実行しないと
分岐するかがどうか確定しない分岐処理をしようとは普通思わない。
#if〜#endifなどのブロック単位でスクリプトを有効化するか無効化するかどうかだ。



レノス

リンク

2012/7/19(Thu) 15:07:51|NO.47780

C++でいうなら constexpr みたいなのですよね。
メタプログラミングはそもそもHSPの設計思想に合わないと思いますよ。

それに仕様はこんな感じの方が分かりやすくていいかと:

#const txt "てすと" #const len_text strlen(txt) ; 定数式を書ける #const arr 1, 2, 3 #const len_arr count_of(arr) ; count_of() : 引数の個数を返す関数



YSR

リンク

2012/7/20(Fri) 01:09:28|NO.47786

便利かも、とちょっと思えてきた
てか、あまりやり過ぎると初期化のコードがだいだいプリプロセッサに乗っちゃう・・・



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