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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0916
ます関数の戻り値がおかしい19解決


ます

リンク

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になっている)。
これは、なぜなのでしょうか?
また、どうすれば正しく戻り値を受け取ることができるのでしょうか?

よろしくお願いします。



この記事に返信する


Drip

リンク

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



kz3

リンク

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")



kz3

リンク

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
のようにすることで解決しました。
本当にありがとうございました。



f

リンク

2007/9/16(Sun) 15:07:16|NO.11086

見た瞬間鼻水吹いた(注:マジ

俺が考えていた「文字列の反転」とは、違う結果が必要だったという事か。
まあ、解決だと言うのならそれ以上言う事は無い。

解決おめでとう!



kz3

リンク

2007/9/16(Sun) 15:13:57|NO.11087

Σ(゚ロ゚;



Begriff -いくす-

リンク

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



kz3

リンク

2007/9/16(Sun) 17:22:03|NO.11092

全角文字は考慮しないって最初に言ってますよ。



Begriff -いくす-

リンク

2007/9/16(Sun) 17:29:15|NO.11093

(全角半角ができるという点で)
大は小をかねるって言うじゃないですか^^;(意味が若干違う気がするが)
まぁ気分で組んだので特に意味はありませんが。
結局価値なしってことですからあまり気にしないでください。



kz3

リンク

2007/9/16(Sun) 17:53:27|NO.11094

あ、それもそうでしたね!



kz3

リンク

2007/9/17(Mon) 20:56:22|NO.11101

やっぱりおかしいとは思ったんですが、いくすさんのコードはちゃんと判別できてないですね。
第一バイト(リード)か第二バイトかは文字列先頭から判別していかないといけないのに、途中から判別しちゃってるせいで、"="などのように第一バイトと第二バイトが重なる範囲の文字コードの時に不具合を起こします。
例:reverseStr("==")



Begriff -いくす-

リンク

2007/9/17(Mon) 21:40:57|NO.11102

あぁ 確かに…そうですね。
そういう文字もあるということを考えていませんでした。



Begriff -いくす-

リンク

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")



f

リンク

2007/9/18(Tue) 06:10:50|NO.11108

この罠、自分もひっかかった事があるなあ・・・。



ANTARES

リンク

2007/9/21(Fri) 22:04:27|NO.11146

結局、0を含むバイナリデータを返す関数の戻り値は受け取れないということですか?



f

リンク

2007/9/21(Fri) 23:16:29|NO.11148

文字列として扱うのなら、ちゃんと「文字列」のルールを守った値を返せ、という事だな。

>これでは最初にNullが検出され、a=""を実行しているのと同じ結果になります。

と、しょっぱなから端的に指摘されているとおりの話。

データ自体はちゃんと返ってきてる。
それを文字列扱いしたが為に、受け取る為の変数に受け取れてなかっただけ。


・・・あ、いや、一番最初のスクリプトは、値が返せてないんだったか。

データ自体はちゃんと「反転できている」。
それを文字列扱いしたが為に、受け取る為の変数に受け取れてなかっただけ。だな。



f

リンク

2007/9/21(Fri) 23:22:54|NO.11149

投稿してから気付いたが、なんか的外れな事を書いたな。ごめん。



n

リンク

2007/10/2(Tue) 16:50:56|NO.11339

そもそも0に限らず、「バイナリデータ」は関数の戻り値で返せないんだよ。



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