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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1115
YSRバイナリデータを扱っていたら詰んだでござるの巻5解決


YSR

リンク

2012/11/15(Thu) 23:38:02|NO.50690

まずはこれを実行してみてください。

sdim a,256 sdim b,256 for k,0,256 poke a,k,k next b=a assert
assertで出たデバッグウィンドウを見ると、bにaのバイナリデータがきちんとコピーされていないことが分かります。
「memcpy使えよ」? もっともな意見です。
でも、memcpyはヘルプに、
>memcpy p1,p2,p3,p4,p5
>
>p1 : コピー先の変数
>p2 : コピー元の変数
>p3 : コピーするサイズ(1byte単位)
>p4 : コピー先の変数メモリオフセット(省略時=0)
>p5 : コピー元の変数メモリオフセット(省略時=0)
と明記されていることから分かるように、p1とp2が両方「変数」でないと使えません。
何が言いたいかというと、

「モジュール関数or命令で、strでバイナリデータを渡して(内部でコピーして)『変数として』処理することができない」

と言うことです。もちろんvarで参照渡しすればいいのですが、そうなるとstr版とvar版を両方作製する必要があり(var版に"abcde"とかいった形式で渡せないため)、明らかに不便です。
上手い解決策はないものでしょうか……。ご教示お願いします。



この記事に返信する


fortunehill

リンク

2012/11/16(Fri) 01:30:46|NO.50694

/*最初がnullだからそれ以降が無視されたのでは?*/

sdim a,256 sdim b,256 for k,0,256 poke a,k,k next poke a,0,65 ;最初のnull文字をAに書き換えた b=a repeat 256 pos cnt\20*30,cnt/20*30 mes strf("%3d",peek(b,cnt)) loop



KA

リンク

2012/11/16(Fri) 04:24:32|NO.50695

>>「モジュール関数or命令で、strでバイナリデータを渡して(内部でコピーして
>>)『変数として』処理することができない」

結局どう使いたいのか分からない。



あり

リンク

2012/11/16(Fri) 12:05:50|NO.50700

var版だけあれば十分な気がするのですがやりたい事の要点を得ません。
そのバイナリデータがどういうものでどう扱いたいのかを説明して貰えれば
解決しやすいかと思います。



レノス

リンク

2012/11/16(Fri) 18:25:30|NO.50702

よくわかりませんが「var版に"abcde"とかいった形式で渡」す方法ならこちら

#module #defcfunc __strvar_impl str s __strvar@ = s : return 0 #define global ctype strvar(%1 = "") __strvar@( __strvar_impl(%1) ) // Call-in-Index pattern #global sdim __strvar@ // 文字列型でなければならない // 例 #module #defcfunc f var bindata // var を受け取る mes bindata return peek(bindata) #global x = f( strvar("abcde") ) // あたかもリテラルが渡ったかのように



YSR

リンク

2012/11/19(Mon) 21:08:48|NO.50766

>NO.50695,NO.50700
例:

#module #deffunc test1 var string mes peek(string,0) return #deffunc test2 str string mes peek(string,0) return #global string="abcde" test1 string test2 string stop
 これを実行すると、

#Error 23 in line 6 (???) -->変数名が指定されていません
と表示されるよね。もちろん引数指定がアレなせいで、

#deffunc test2 str string string_=string mes peek(string_,0) return
と書き換えればエラーは出ない。でも、"="はあくまで文字列のコピーだから、
NO.50694のようにNULL文字とかに弱い。じゃあmemcpyとか使えば、と思うけど、
そいつも「変数を引数にしないとエラーが出る」といった問題がある。
要するに、「一般のバイナリデータはver指定じゃないと関数・命令の引数にできない」ってこと。
例えばBase-64を計算する関数「base64」があったとして、

base64("abcde") ;文字列 base64(binary) ;binaryはバイナリデータ
みたいな記述ができないと不便だよね?
そういった話だったんだけど、伝わりにくかったならすまない。

>NO.50702
なるほど……そんな方法がありましたか。ありがとうございます。



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