|
|
2015/9/13(Sun) 17:55:42|NO.71646
題名の通り、
dim a,10
と初期化した後、
a(5)
を文字列として定義したいとき、
a(5)=""
とするしかないのでしょうか。
sdim a(5),10
とすると、エラーになってしまいます。
だれか、教えてください!
|
|
2015/9/13(Sun) 17:58:33|NO.71647
sdim a,初期化したい長さ,10
としてください
|
|
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つの配列内で文字列も数値も扱うテクとして。
|
|
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
|
|
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
なにが困るのか具体的に明記するとアドバイスもらえると思いますよ。
|
|
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
|
|
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
| |
|
2015/9/14(Mon) 22:15:23|NO.71684
追記
一度変換した変数をdimやsdimやssdimで確保しなおす
直接代入をする(a="" a=0など)
でエラーになります
(それ以外は多分問題はありません)
|
|
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
| |
|
2015/9/14(Mon) 23:11:49|NO.71690
書いてみて思いましたがdupptr a,varptr(b),getvarsize(b),vartype("str")のようにすればよかったです
|
|
2015/9/19(Sat) 16:08:03|NO.71796
みなさん、ありがとうございました。
とても参考になりました。
|
|
2015/9/23(Wed) 18:00:11|NO.71881
解決済み
|
|