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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0913
Okay配列変数の文字列型変数への初期化13解決


Okay

リンク

2015/9/13(Sun) 17:55:42|NO.71646

題名の通り、
dim a,10
と初期化した後、
a(5)
を文字列として定義したいとき、
a(5)=""
とするしかないのでしょうか。
sdim a(5),10
とすると、エラーになってしまいます。

だれか、教えてください!



この記事に返信する


Noap

リンク

2015/9/13(Sun) 17:58:33|NO.71647

sdim a,初期化したい長さ,10
としてください



Noap

リンク

2015/9/13(Sun) 18:01:15|NO.71648

部分的に配列の型を変更することはわたしの知る限りではできません
もし
dim a,10
a(5)=""
としてもエラーになります
間違っていればごめんなさい



(´ω`)

リンク

2015/9/14(Mon) 17:44:02|NO.71670

逆の発想で、配列は文字列で初期化しておいて、
必要な時だけ数値として扱うというやり方はいかがでしょうか。(´ω`)

a = "","2","null","4","5" a(0) = str(int(a(1))+int(a(3)))
a(0)の中身は6になります。
疑似的にですが、1つの配列内で文字列も数値も扱うテクとして。



Noap

リンク

2015/9/14(Mon) 17:48:53|NO.71671

逆に数字を文字として扱うのもいいかもしれません


a.0=1 a.1='A' a.2='a' a.3='b' sdim buf poke buf,0,lpeek(a,4) mes buf



KA

リンク

2015/9/14(Mon) 19:15:49|NO.71673

Noap さん

発想は良いのですが穴だらけです。



さか

リンク

2015/9/14(Mon) 20:23:09|NO.71676

多言語も含めて配列変数は複数の同じ型を扱うためのものです。

具体的にどういう用途で使用したいのかわかりませんが数字と文字を混在したいの
ならば通常は以下のように文字型で定義しておき、数字として使用したいときに数
字型へ変換すると思います。

sdim a,3
a="a","2","c"
i=int(a(1))+10
mes ""+i

なにが困るのか具体的に明記するとアドバイスもらえると思いますよ。



Noap

リンク

2015/9/14(Mon) 20:34:35|NO.71677

すみません。急いでいたものでなおざりに書いてしまいました。確かにすきまだらけでムダどころではありません。
どうして急いでいるときに書き込んだのかはわかりませんが書き直しました。


suuji=1, 3, 5, 6, 7, 8//24バイトの配列 poke suuji,4,"あいうえ"//8バイト sdim buf memcpy buf,suuji,8,,4 print buf



Noap

リンク

2015/9/14(Mon) 21:51:22|NO.71682

へんなことを書いてすみません。数字の配列をそのまま文字列として扱えるようにするモジュールを書いてみました。(文字列への直接代入は不可)


#module #defcfunc getvarsize var varget, local varsizinf, local varsizeptr, local hspctxstrr, local pvaladr, local pvala if vartype(varget)==vartype("str"){ varsizeptr=varptr(varget) dupptr varsizinf,varsizeptr-16,4 return varsizinf } mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 dupptr pvala,pvaladr,48,vartype("str") return lpeek(pvala,24) #global #module #deffunc suujimojihenkan var p1, local yousoookisa, local varsizeptr, local hspctxstrr, local pvaladr, local pvala, local varsizinf, local hensuutype//, local yousosuu if vartype(p1)==vartype("str") : return 0 hensuutype=vartype(p1) /*yousosuu=length(p1) if length2(p1)>0{ yousosuu*=length2(p1) if length3(p1)>0{ yousosuu*=length3(p1) if length4(p1)>0 : yousosuu*=length4(p1) } }*/ mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 dupptr pvala,pvaladr,48,vartype("str") yousoookisa=lpeek(pvala,24) wpoke pvala,0,vartype("str") lpoke pvala,24,4 dupptr varsizinf,lpeek(pvala,28)-16,4 varsizinf=yousoookisa //終了時に使う if i==0{ pvaladrbak=pvaladr yousoookisabak=yousoookisa hensuutypebak=hensuutype i++ }else{ pvaladrbak.i=pvaladr yousoookisabak.i=yousoookisa hensuutypebak.i=hensuutype i++ } return 1 #deffunc hensuumodosu onexit, local pvala, local varsizinf, local j//変数の種類はもとに戻さないとエラーになる if i<=0 : end//変換を一回もしていない時 j=i *kurikaeshi//ループ命令は使えない j-- dupptr pvala,pvaladrbak.j,48,vartype("str") dupptr varsizinf,lpeek(pvala,28)-16,4 varsizinf=64 lpoke pvala,24,yousoookisabak.j wpoke pvala,0,hensuutypebak.j if j>0 : goto *kurikaeshi end #global ddim a,3 buf="あいう" memcpy a,buf,6 mes "数字 : "+a mes "種類"+vartype(a) mes "大きさ"+getvarsize(a) suujimojihenkan a //a="あい" //直接代入はできない mes "文字列: "+a mes "種類"+vartype(a) mes "大きさ"+getvarsize(a) mes strmid(a,0,2)//文字列操作はできるよう buf="い" : memcpy a,buf,2//代入の際はmemcpyで mes a dim b,1,2,2 suujimojihenkan b//複数変換も可能 poke b,0,"ちくわ" mes "b="+b



Noap

リンク

2015/9/14(Mon) 22:15:23|NO.71684

追記
一度変換した変数をdimやsdimやssdimで確保しなおす
直接代入をする(a="" a=0など)
でエラーになります
(それ以外は多分問題はありません)



Noap

リンク

2015/9/14(Mon) 23:07:53|NO.71689

dim、sdim、dimtypeは使えるようにしました
直接代入はシステムエラーになります

#undef dim #undef dimtype #undef sdim #module #defcfunc getvarsize var varget, local varsizinf, local varsizeptr, local hspctxstrr, local pvaladr, local pvala if vartype(varget)==vartype("str"){ varsizeptr=varptr(varget) dupptr varsizinf,varsizeptr-16,4 return varsizinf } mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 dupptr pvala,pvaladr,48,vartype("str") return lpeek(pvala,24) #global #module #deffunc suujimojihenkan var p1, local yousoookisa, local varsizeptr, local hspctxstrr, local pvaladr, local pvala, local varsizinf, local hensuutype, local j//, local yousosuu if vartype(p1)==vartype("str") : return 0 hensuutype=vartype(p1) /*yousosuu=length(p1) if length2(p1)>0{ yousosuu*=length2(p1) if length3(p1)>0{ yousosuu*=length3(p1) if length4(p1)>0 : yousosuu*=length4(p1) } }*/ mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 dupptr pvala,pvaladr,48,vartype("str") yousoookisa=lpeek(pvala,24) wpoke pvala,0,vartype("str") lpoke pvala,24,4 dupptr varsizinf,lpeek(pvala,28)-16,4 varsizinf=yousoookisa //空いていないかさがす if i>0{ j=i repeat j-- if pvaladrbak.j<=0 : break if j<=0 : j=-1 : break loop }else{ j=-1 } //終了時に使う if j==-1{ if i==0{ pvaladrbak=pvaladr yousoookisabak=yousoookisa hensuutypebak=hensuutype i++ }else{ pvaladrbak.i=pvaladr yousoookisabak.i=yousoookisa hensuutypebak.i=hensuutype i++ } }else{ pvaladrbak.j=pvaladr yousoookisabak.j=yousoookisa hensuutypebak.j=hensuutype } return 1 #deffunc hensuumodosu onexit//変数の種類はもとに戻さないとエラーになる if i<=0 : end//変換を一回もしていない時 j=i *kurikaeshi//ループ命令は使えない j-- if pvaladrbak.j!=0{ dupptr pvala,pvaladrbak.j,48,vartype("str") dupptr varsizinf,lpeek(pvala,28)-16,4 varsizinf=64 lpoke pvala,24,yousoookisabak.j wpoke pvala,0,hensuutypebak.j } if j>0 : goto *kurikaeshi end #deffunc dim var q1, int q2, int q3, int q4, int q5, local hspctxstrr, local pvaladr, local pvalan, local varsizinfn, local jn if i<=0 : dim@hsp q1,q2,q3,q4,q5 : return mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 jn=i repeat jn-- if pvaladrbak.jn==pvaladr{ dupptr pvalan,pvaladr,48,vartype("str") dupptr varsizinfn,lpeek(pvalan,28)-16,4 varsizinfn=64 lpoke pvalan,24,yousoookisabak.jn wpoke pvalan,0,hensuutypebak.jn pvaladrbak.jn=0 break } if jn<=0 : break loop dim@hsp q1,q2,q3,q4,q5 return #deffunc dimtype var r1, int r2, int r3, int r4, int r5, int r6, local hspctxstrr, local pvaladr, local pvalan, local varsizinfn, local jn if i<=0 : dimtype@hsp r1,r2,r3,r4,r5,r6 : return mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 jn=i repeat jn-- if pvaladrbak.jn==pvaladr{ dupptr pvalan,pvaladr,48,vartype("str") dupptr varsizinfn,lpeek(pvalan,28)-16,4 varsizinfn=64 lpoke pvalan,24,yousoookisabak.jn wpoke pvalan,0,hensuutypebak.jn pvaladrbak.jn=0 break } if jn<=0 : break loop dimtype@hsp r1,r2,r3,r4,r5,r6 return #deffunc sdim var s1, int s2, int s3, int s4, int s5, int s6, local hspctxstrr, local pvaladr, local pvalan, local varsizinfn, local jn if i<=0 : sdim@hsp s1,s2,s3,s4,s5,s6 : return mref hspctxstrr,68 dupptr pvaladr,hspctxstrr.207,4 jn=i repeat jn-- if pvaladrbak.jn==pvaladr{ dupptr pvalan,pvaladr,48,vartype("str") dupptr varsizinfn,lpeek(pvalan,28)-16,4 varsizinfn=64 lpoke pvalan,24,yousoookisabak.jn wpoke pvalan,0,hensuutypebak.jn pvaladrbak.jn=0 break } if jn<=0 : break loop sdim@hsp s1,s2,s3,s4,s5,s6 return #global ddim c,3,2 dupptr a,varptr(c),3*2*8 buf="あいう" memcpy a,buf,6 mes "数字 : "+a mes "種類"+vartype(a) mes "大きさ"+getvarsize(a) suujimojihenkan a //a="あい" //直接代入はできない print "文字列: "+a print "種類"+vartype(a) print "大きさ"+getvarsize(a) print strmid(a,0,2)//文字列操作はできるよう buf="い" : memcpy a,buf,2//代入の際はmemcpyで print a dim b,1,2,2 suujimojihenkan b//複数変換も可能 poke b,0,"ちくわ" print "複数変換も可能: b="+b dupptr d,varptr(b),7,vartype("str") print "duptrでクローン作成: "+d dup d,b print "dupでクローン作成: "+d dim b print "dimで初期化して普通の変数に: "+b suujimojihenkan b poke b,0,"A" print "再度変換: b="+b //dimtype b,vartype("double") ddim b,1 print "ddimで初期化して普通の変数に: "+b suujimojihenkan b poke b,0,"A" print "再度変換: b="+b sdim b,1 b="a" print "sdimで初期化して普通の変数に: "+b dim e suujimojihenkan e mes e



Noap

リンク

2015/9/14(Mon) 23:11:49|NO.71690

書いてみて思いましたがdupptr a,varptr(b),getvarsize(b),vartype("str")のようにすればよかったです



Okay

リンク

2015/9/19(Sat) 16:08:03|NO.71796

みなさん、ありがとうございました。
とても参考になりました。



Okay

リンク

2015/9/23(Wed) 18:00:11|NO.71881

解決済み



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