|
|
2007/9/16(Sun) 12:12:38|NO.11080
#module
#defcfunc reverseStr str st,local st2,local st3
st2=""
st3=st
repeat 64
poke st2,cnt,peek(st3,63-cnt)
loop
repeat 64
dialog ""+cnt+":"+peek(st2,cnt)
loop
//↑うまくいっている
return st2
#global
a = reverseStr("12345")
repeat 64
dialog ""+cnt+":"+peek(a,cnt)
loop
//↑うまくいってない
上記は文字列を逆にする("ABCDE" なら "EDCBA" など、全角文字は考慮しません)関数とそのテストなんですが、
reverseStr関数の中では処理はうまくいってるんですが、
それを戻り値として返して変数aを見てみるとうまくいってません(全部0になっている)。
これは、なぜなのでしょうか?
また、どうすれば正しく戻り値を受け取ることができるのでしょうか?
よろしくお願いします。
|
|
2007/9/16(Sun) 12:49:20|NO.11081
Dripです。
ますさん、こんにちは。
提示されたプログラムの問題点は、関数にではなく、
a = reverseStr("12345")
の部分(変数への代入の方法)にあります。
これでは最初にNullが検出され、a=""を実行しているのと同じ結果になります。
下に参考のためのスクリプトを用意しましたので実際に実行して考えてみてください。
//a = reverseStr("12345")
//の部分に着目し、このプログラムの表示結果をご覧ください。
pos 20,20:mes "誤ったメモリコピー\n"
sdim a,4
sdim b,4
poke a,3,65
b=a //bに 「 Null Null Null A 」というデータを渡したつもり
mes "ますさんの期待値"
mes "0 0 0 65"
mes "実際の値"
repeat 4
mes ""+peek(b,cnt)+" ":pos ginfo_cx+ginfo_mesx,ginfo_cy-ginfo_mesy
loop
pos 20,200:mes "正しいメモリコピー\n"
sdim a,4
sdim b,4
poke a,3,65
memcpy b,a,4 //bに 「 Null Null Null A 」というデータを渡す
mes "予想される期待値"
mes "0 0 0 65"
mes "実際の値"
repeat 4
mes ""+peek(b,cnt)+" ":pos ginfo_cx+ginfo_mesx,ginfo_cy-ginfo_mesy
loop
|
|
2007/9/16(Sun) 13:49:14|NO.11082
>ますさん
文字列でないところを文字列として扱っているところが間違ってるの。
関数を使わなくてもますさんと同じことをすればこうなっちゃうの。
; 動作確認プログラム
ss = "Hot Soup Processor ver.3.1 Onion Software dapyon :-P"
ds = ""
mes "ss=\""+ss+"\""
px = ginfo_cx: py = ginfo_cy
repeat 64
wait 20: redraw 0
/* メッセージの表示 */
color 255, 255,255: boxf px, py
color 0
pos px, py
mes "ssの"+cnt+"byte目の文字は"+strf("%c",peek(ss,cnt))
mes "ssの"+cnt+"byte目をdsの"+(63-cnt)+"byte目に入れる"
poke ds, (63-cnt), peek(ss,cnt)
/* メモリダンプ */
mm = ""
mes "dsの中身:"
repeat 64
if cnt>0 & cnt\16=0: mm += "\n"
mm += strf("%02x ",peek(ds,cnt))
loop
mes mm
redraw 1
loop
mes "ds="+ds
if ds="": mes "dsは空の文字列です"
文字列だけを入れ替えるようにすればうまくいくよ。
(HSP3のインストールフォルダ)/docs/hsp3str.htmの文字列の秘密を読んでみるといいよ。
がんばってp(^-^*)q
|
|
2007/9/16(Sun) 14:12:37|NO.11083
pipipp-yyo → pipipp
a = "pipipp-yyo"
poke a, 6, 0 ; 0 は文字列の終わりのコード
mes a
#module
#defcfunc rvstr str st
n = strlen(st)
sdim st2, n + 1
sdim st3, n + 1
st3 = st
repeat n
poke st2, cnt, peek(st3, n-cnt-1)
loop
return st2
#global
mes rvstr("12345")
|
|
2007/9/16(Sun) 14:46:11|NO.11084
メ`ゝ')=つ)'ロ`)ノノ
|
|
2007/9/16(Sun) 14:59:10|NO.11085
皆様、ありがとうございます。意味がわかりました。
とりあえず、
#module
#deffunc reverseStr var st,local st2
st2=""
repeat 64
poke st2,cnt,peek(st,63-cnt)
loop
memcpy st,st2,64,0,0
return
#global
a = "12345"
reverseStr a
repeat 64
dialog ""+cnt+":"+peek(a,cnt)
loop
のようにすることで解決しました。
本当にありがとうございました。
|
|
2007/9/16(Sun) 15:07:16|NO.11086
見た瞬間鼻水吹いた(注:マジ
俺が考えていた「文字列の反転」とは、違う結果が必要だったという事か。
まあ、解決だと言うのならそれ以上言う事は無い。
解決おめでとう!
|
|
2007/9/16(Sun) 15:13:57|NO.11087
Σ(゚ロ゚;
|
|
2007/9/16(Sun) 16:39:32|NO.11090
必要ないかもしれないけど。
#module
#uselib "kernel32.dll"
#cfunc zenhan "IsDBCSLeadByte" sptr
#defcfunc reverseStr str st
st3 = str(st):len = strlen(st3):sdim st2, len
while len > count
ss=len-2-count
if ss<0:ss=0:hh=0:else:hh=peek(st3, ss)
if zenhan(hh)=0{
if zenhan(peek(st3, len-1-count))=0{
poke st2, count2, peek(st3, len-1-count)
count2++:count++
}else{
wpoke st2,count2,wpeek(st3, len-1-count)
count2+=2:count++
}}else{
count++
}
wend
count = 0:count2 = 0:return st2
#global
a = reverseStr("あaいiうuえeおo")
mes a
|
|
2007/9/16(Sun) 17:22:03|NO.11092
全角文字は考慮しないって最初に言ってますよ。
|
|
2007/9/16(Sun) 17:29:15|NO.11093
(全角半角ができるという点で)
大は小をかねるって言うじゃないですか^^;(意味が若干違う気がするが)
まぁ気分で組んだので特に意味はありませんが。
結局価値なしってことですからあまり気にしないでください。
|
|
2007/9/16(Sun) 17:53:27|NO.11094
あ、それもそうでしたね!
|
|
2007/9/17(Mon) 20:56:22|NO.11101
やっぱりおかしいとは思ったんですが、いくすさんのコードはちゃんと判別できてないですね。
第一バイト(リード)か第二バイトかは文字列先頭から判別していかないといけないのに、途中から判別しちゃってるせいで、"="などのように第一バイトと第二バイトが重なる範囲の文字コードの時に不具合を起こします。
例:reverseStr("==")
|
|
2007/9/17(Mon) 21:40:57|NO.11102
あぁ 確かに…そうですね。
そういう文字もあるということを考えていませんでした。
|
|
2007/9/17(Mon) 22:45:06|NO.11103
No.11090を修正しました。(間違ったことを書いてしまったので。
#module
#uselib "kernel32.dll"
#cfunc zenhan "IsDBCSLeadByte" sptr
#defcfunc reverseStr str st
a=st: len=strlen(a): sdim b,len
while len > count
if zenhan(peek(a,count))=0{
poke b, len-1-count, peek(a,count)
count++
}else{
wpoke b, len-2-count, wpeek(a,count)
count+=2
}
wend
count = 0:return b
#global
mes reverseStr("==")
mes reverseStr("あいうえお")
mes reverseStr("ABCDabcd")
|
|
2007/9/18(Tue) 06:10:50|NO.11108
この罠、自分もひっかかった事があるなあ・・・。
|
|
2007/9/21(Fri) 22:04:27|NO.11146
結局、0を含むバイナリデータを返す関数の戻り値は受け取れないということですか?
|
|
2007/9/21(Fri) 23:16:29|NO.11148
文字列として扱うのなら、ちゃんと「文字列」のルールを守った値を返せ、という事だな。
>これでは最初にNullが検出され、a=""を実行しているのと同じ結果になります。
と、しょっぱなから端的に指摘されているとおりの話。
データ自体はちゃんと返ってきてる。
それを文字列扱いしたが為に、受け取る為の変数に受け取れてなかっただけ。
・・・あ、いや、一番最初のスクリプトは、値が返せてないんだったか。
データ自体はちゃんと「反転できている」。
それを文字列扱いしたが為に、受け取る為の変数に受け取れてなかっただけ。だな。
|
|
2007/9/21(Fri) 23:22:54|NO.11149
投稿してから気付いたが、なんか的外れな事を書いたな。ごめん。
|
|
2007/10/2(Tue) 16:50:56|NO.11339
そもそも0に限らず、「バイナリデータ」は関数の戻り値で返せないんだよ。
|
|