2008年9月23日火曜日

任意桁数の実数計算


#module
#defcfunc comp_h int a,int b
if a<b :return b
return a
#defcfunc comp_l int a,int b
if a<b :return a
return b

#deffunc fteki var keka_,var size1_,var ten1_
k1=size1_-ten1_-1-1
sdim keka_2,size1_
sik=0
sij=0
repeat
if peek(keka_,k1+ten1_+1)=0:sik+:else:break
k1-
loop
k1=-ten1_-1
repeat
if peek(keka_,k1+ten1_+1)=0:sij+:else:break
k1+
loop

size1_-=sik+sij
ten1_=sij

memcpy keka_2,keka_,size1_,0,sij
memcpy keka_,keka_2,size1_,0,0

return
#deffunc fzetai var hiki2_,int size2_,int ten2_,int sehu2_, var hiki3_,int size3_,int ten3_,int sehu3_
size1_=comp_h(ten2_+1,ten3_+1)+comp_h(size2_-ten2_-1,size3_-ten3_-1)+1
ten1_=comp_h(ten2_,ten3_)+1


k1=size1_-ten1_-1-1

repeat

st1=0
st2=0
if k1<=size2_-ten2_-1-1&&k1>=-ten2_-1{

st1=((sehu2_!1)*2-1)*peek(hiki2_,k1+ten2_+1)

}
if k1<=size3_-ten3_-1-1&&k1>=-ten3_-1{
st2=((sehu3_!1)*2-1)*peek(hiki3_,k1+ten3_+1)
}
st3=st1+st2+kuri
kuri=0
if st3>=10:st3-=10:kuri=1
if st3<0:st3+=10:kuri=-1


k1-
if k1<-(ten1_+1):break
loop

if kuri!=0:return 1
return


return
#deffunc fplus var keka_3,var size1,var ten1,var sehu1, var hiki2,int size2,int ten2,int sehu2, var hiki3,int size3,int ten3,int sehu3

fzetai hiki2, size2, ten2, sehu2, hiki3, size3, ten3, sehu3
han=1
if stat=1:han=-1

size1=comp_h(ten2+1,ten3+1)+comp_h(size2-ten2-1,size3-ten3-1)+1
ten1=comp_h(ten2,ten3)+1
sdim keka_3,size1
sdim keka,size1
k1=size1-ten1-1-1
kuri=0
repeat

st1=0
st2=0
if k1<=size2-ten2-1-1&&k1>=-ten2-1{

st1=han*((sehu2!1)*2-1)*peek(hiki2,k1+ten2+1)

}
if k1<=size3-ten3-1-1&&k1>=-ten3-1{
st2=han*((sehu3!1)*2-1)*peek(hiki3,k1+ten3+1)
}
st3=st1+st2+kuri
kuri=0
if st3>=10:st3-=10:kuri=1
if st3<0:st3+=10:kuri=-1
poke keka,k1+ten1+1,st3

k1-
if k1<-(ten1+1):break
loop


sehu1=((han+1)/2!1)

fteki keka ,size1 ,ten1

;if kuri!=0:dialog "エラー"
memcpy keka_3,keka,size1,0,0
return
#global
a=""
size2=30
ten2=0//1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
sdim suti1,size2
//配列にデータをいれます (π)
poke suti1,0,3
poke suti1,1,1
poke suti1,2,4
poke suti1,3,1
poke suti1,4,5
poke suti1,5,9
poke suti1,6,2
poke suti1,7,6
poke suti1,8,5
poke suti1,9,3
poke suti1,10,5
poke suti1,11,8
poke suti1,12,9
poke suti1,13,0
poke suti1,14,9
poke suti1,15,3
poke suti1,16,2
poke suti1,17,3
poke suti1,18,8
poke suti1,19,4
poke suti1,20,6
poke suti1,21,2
poke suti1,22,6
poke suti1,23,4
poke suti1,24,3
poke suti1,25,3
poke suti1,26,8
poke suti1,27,3
poke suti1,28,0
poke suti1,29,0

size3=2
sdim suti3,size3
poke suti1,0,3
ten3=0
sehu3=0

sehu2=0


//fplus 代入される変数,サイズ,小数点位置 足す変数,サイズ,小数点位置 足される変数,サイズ,小数点位置
fplus suti,size,ten,sehu,suti1,size2,ten2,sehu2,suti3,size3,ten3,sehu3
//結果はデバッグウィンドウのメモリダンプで・・・

mes size1
mes ten1

2008年9月21日日曜日

自作RADツール(HSP) 途中断念・・・ 再開の可能性あり?

RADツールを製作していましたが行き詰っていました。
ソースを公開します
ソースを実行するときは main_test.hsp を実行してください。
EXEを実行するときは !試作!.exe を実行して下さい。

ダウンロード ->http://begriff.web.fc2.com/radtool.zip

式評価とポーランド記法化


screen 0,700,600
;mes 12 + 24 * limit ( 68 ,36+48*sin(85), 120+64 ) * 59 +( 63>=23)
buf="12 + 24 * limit ( 68+89 ,36+48*sin(85), 120+64 ) * 59 +( 63>=23)"
;buf="24 * limit ( 68+89 ,48*aa(85+77,99*2), 120+64 )"
mes buf
len=strlen(buf)
sdim buf2,len

repeat
data=peek(buf,c)
if (data=' '||data=9)=0{
poke buf2,c2,data
c2+
}

c+
if c=len:c=0:c2=0:break
loop//--------------------------

mes buf2

len=strlen(buf2)
sdim buf,len
buf=buf2
sdim buf2,len

repeat
data=peek(buf,c)
if data='+'||data='-'||data='*'||data='/'||data='\\'||data='|'||data='&'||data='^'||data='='||data='>'||data='<'||data='!'{
poke buf2,c,'C'
}else : if data='('{
poke buf2,c,'B'
}else : if data=')'{
poke buf2,c,'D'
}else : if data=','{
poke buf2,c,'K'
}else : poke buf2,c,'A'
c+
if c=len:c=0:break
loop//--------------------------

mes buf2

len=strlen(buf2)

repeat
data=peek(buf2,c)
if data='A'{
c2=c
func=0
repeat
data=peek(buf2,c2)
if data!='A'{
if data='B':func=1
break
}
c2+
if c2=len:break
loop
c2=0

if func{
repeat
data=peek(buf2,c)
if data ! 'A':break
poke buf2,c,'F'
c+
if c=len:c=0:break
loop
}
}

c+
if c>=len:c=0:break
loop//--------------------------
mes "シンボル化"
mes buf2

len=strlen(buf2)
sdim buf3,len
sdim ad,len,len
sdim cd,len,len

repeat
data=peek(buf2,c)
if data='A'{
poke buf3,c3,'A'
c3+
repeat
if peek(buf2,c+c2)!'A':break
data2=peek(buf,c+c2)
poke ad(ac),c2,data2
c2+
loop
c2-
c=c+c2
c2=0
ac+
}else :if data='C'{
poke buf3,c3,'C'
c3+
repeat
if peek(buf2,c+c2)!'C':break
data2=peek(buf,c+c2)
poke cd(cc),c2,data2
c2+
loop
c2-
c=c+c2
c2=0
cc+
}else : if data='F'{
poke buf3,c3,'F'
c3+
repeat
if peek(buf2,c+c2)!'F':break
data2=peek(buf,c+c2)
poke cd(cc),c2,data2
c2+
loop
c2-
c=c+c2
c2=0
cc+
}else {
poke buf3,c3,data
c3+
}
c+
if c>=len:c=0:break
loop//--------------------------
c3=0
cc=0
ac=0

buf2=buf3
mes "シンボル簡易化"
mes buf2

len=strlen(buf2)
dim bk,len
dim ck,len


repeat//--------------------------
data=peek(buf2,c)
if data='B':lv+

if data='C'||data='F'{
ck(cc)=lv
cc+
}
if data='B'||data='D'||data='K'{
bk(bc)=lv
bc+
}
if data='D':lv-
c+
if c>=len:c=0:break
loop
bc=0
cc=0


dim cy,len
dim ch,len
repeat//--------------------------
data=peek(buf2,c)
if data='C'{
data2=cd(cc)
h=0
if data2="*":cy(cc)=5:ch(cc)=2:h=1
if data2="/":cy(cc)=5:ch(cc)=2:h=1
if data2="\\":cy(cc)=5:ch(cc)=2:h=1
if data2="+":cy(cc)=4:ch(cc)=2:h=1
if data2="-":cy(cc)=4:ch(cc)=2:h=1
if data2="<<":cy(cc)=3:ch(cc)=2:h=1
if data2=">>":cy(cc)=3:ch(cc)=2:h=1
if data2="=":cy(cc)=2:ch(cc)=2:h=1
if data2="==":cy(cc)=2:ch(cc)=2:h=1
if data2="!":cy(cc)=2:ch(cc)=2:h=1
if data2="!=":cy(cc)=2:ch(cc)=2:h=1
if data2=">":cy(cc)=2:ch(cc)=2:h=1
if data2="<":cy(cc)=2:ch(cc)=2:h=1
if data2=">=":cy(cc)=2:ch(cc)=2:h=1
if data2="<=":cy(cc)=2:ch(cc)=2:h=1
if data2="&":cy(cc)=1:ch(cc)=2:h=1
if data2="&&":cy(cc)=1:ch(cc)=2:h=1
if data2="|":cy(cc)=1:ch(cc)=2:h=1
if data2="||":cy(cc)=1:ch(cc)=2:h=1
if data2="^":cy(cc)=1:ch(cc)=2:h=1
if h=0:dialog "式の記述が無効です。 不明な演算子 \" "+data2+" \""
cc+
}
if data='F'{
cy(cc)=6
cc+
}
c+
if c>=len:c=0:break
loop
h=0
fhm=0
cc=0
dim cf,len
repeat//--------------------------
data=peek(buf2,c)
if data='B'||data='D'||data='K'{
bc+
}
if data='F'{
k=bk(bc)
c2=2
repeat
data2=peek(buf2,c+c2)
if data2='B'||data2='D'||data2='K'{
bc2+


}
if k=bk(bc+bc2){
if data2='A':d=1
if data2='K':fh+
if data2='D':break
}
c2+
if c+c2>=len:c2=0:break
loop
bc2=0
c2=0
fh+
if d=0:fh=0
d=0
if fhm<fh:fhm=fh
ch(cc)=fh
cf(cc)=1
fh=0
cc+
poke buf2,c,'C'
}
if data='C'{
cf(cc)=0
cc+
}
c+
if c>=len:c=0:break
loop
cc=0
bc=0
mes buf2

sdim buf3,len
dim c_st,len
dim ca,len
c_sa=0
c3=0
repeat//--------------------------
data=peek(buf2,c)
if data='C'{
data2=peek(buf2,c+1)
repeat
if c_sa!0&&(ck(c_st(c_sa))>ck(cc)||((ck(c_st(c_sa))=ck(cc)&&cy(c_st(c_sa))>=cy(cc)))){
ca(c4)=c_st(c_sa)
poke buf3,c3,'C'
c3+
c4+
c_sa-
}else : break
loop
if data2='A'{
poke buf3,c3,'A'
c3+
c+
data2=peek(buf2,c+1)
}
if data2='B'{
c_sa+
c_st(c_sa)=cc
}
if data2='C'{
if (ck(cc+1))>ck(cc)||(ck(cc+1)=ck(cc)&&cy(cc+1)>=cy(cc)){
c_sa+
c_st(c_sa)=cc
}else{
ca(c4)=cc
poke buf3,c3,'C'
c3+
c4+
}
}
if data2='K'||data2='D'||data2=0{
ca(c4)=cc
poke buf3,c3,'C'
c3+
c4+
}

cc+
}

if data='K'||data='D'||data=0{
lv=bk(bc)
if data=0:lv=0
repeat
if c_sa!0&&lv=ck(c_st(c_sa)){
ca(c4)=c_st(c_sa)
poke buf3,c3,'C'
c3+
c4+
c_sa-
}else :break
loop
}

if data='B'||data='K'||data='D'{
bc+
}

if data='A'{
poke buf3,c3,'A'
c3+
}
c+
if c>=len+1:c=0:break
loop
bc=0
c2=0
c3=0
c4=0
cc=0
mes "\n逆ポーランド記法化(シンボル)"
mes buf3
/*いらない↓*/
sdim buf4,512
len=strlen(buf3)
repeat//--------------------------
data=peek(buf3,c)
if data='A'{
buf4+=ad(ac)+" "
ac+
}
if data='C'{
buf4+=cd(ca(cc))
if cf(ca(cc)):buf4+="()"
buf4+=" "
cc+
}
c+
if c>=len+1:c=0:break
loop
mes "\n逆ポーランド記法化(人間が認識できるようにするだけなので内部処理的にはいらない 上と同じ)"
mes buf4
/*いらない↑*/
cc=0
ac=-1
dim a_st,len//各数値がどのスタックにあるか
sdim st_st,fhm//引数に渡す値の配列
sdim buf5,512
st2=0//引数の順番
ac=-1
c2=0

repeat//--------------------------
data=peek(buf3,c)
if data='A'{

ac+
}
if data='C'{
retn=ch(ca(cc))
st_itiml=0
st_itims=0
st2=0

syu=0
repeat retn//引数に渡す値を配列に収納

st_iti=a_st(ac-c2)
if st_iti=0{

st_st(st2)=ad(ac-c2)
st2+
c2+

}else{

st_st(st2)="st"+a_st(ac-c2)
st2+
c2+
if st_itims>st_iti || st_itims=0:st_itims=st_iti
if st_itiml<st_iti:st_itiml=st_iti
;dialog st_itims
}
repeat
if (ac-c2)<0:syu=1:break
st_iti2=a_st(ac-c2)

if st_iti2=0:break
if st_iti!=st_iti2:break
c2+
loop
if syu=1:break

loop

if st_itims=0{
st+
}else{
st=st_itims
}

repeat c2
a_st(ac-cnt)=st
loop

buf5+="st"+st+" = "
if cf(ca(cc)){
buf5+=cd(ca(cc))+"( "
repeat retn
if retn!1&&cnt!0 :buf5+=", "
f=retn-cnt
buf5+=st_st(retn-cnt-1)
loop
buf5+=" )"
}else{
buf5+=st_st(1)+" "+cd(ca(cc))+" "+st_st(0)

}
buf5+="\n"
c2=0
st2=0
cc+
}

c+
if c>=len:c=0:break
loop
buf5+="ans = st1"

mes "\n\n変換前の数式"
mes buf
mes "\n変換後の数式\n"
mes buf5

2008年9月20日土曜日

ベジェ曲線


#module
#deffunc Beziers int x1,int y1,int x2, int y2, int x3 ,int y3,int x4,int y4,double rate
t=0.0
line x1,y1,x1,y1
repeat
x=(1.0-t)*(1.0-t)*(1.0-t)*x1+3.0*(1.0-t)*(1.0-t)*t*x2+3.0*(1.0-t)*t*t*x3+t*t*t*x4
y=(1.0-t)*(1.0-t)*(1.0-t)*y1+3.0*(1.0-t)*(1.0-t)*t*y2+3.0*(1.0-t)*t*t*y3+t*t*t*y4
line x,y
t+=rate
if t>1:break
loop
line x4,y4
line x4,y4,x4,y4
return
#global

k=4
f=4

onclick gosub *click

x(0)=300:y(0)=300
x(1)=300:y(1)=100
x(2)=100:y(2)=300
x(3)=100:y(3)=100

gosub *draw

stop
*click
i=0
repeat 4
if x(i)-k< mousex&&mousex< x(i)+k&&y(i)-k< mousey&&mousey< y(i)+k{
repeat
x(i)=mousex
y(i)=mousey
gosub *draw
getkey key,1
if key=0:break
wait 0
loop
}
i+
loop
return
*draw
redraw 0
color 255,255,255
boxf

color 192,192,255
line x(0),y(0),x(1),y(1)
line x(2),y(2),x(3),y(3)
color 0,0,0

Beziers x(0),y(0),x(1),y(1),x(2),y(2),x(3),y(3),0.01

color 255,,
circle x(0)-f,y(0)-f,x(0)+f,y(0)+f,0
circle x(3)-f,y(3)-f,x(3)+f,y(3)+f,0

color ,,255
circle x(1)-f,y(1)-f,x(1)+f,y(1)+f,0
circle x(2)-f,y(2)-f,x(2)+f,y(2)+f,0
redraw 1
return

2008年9月13日土曜日

難航^^

自作言語について色々と思いめぐらせるこのごろです。
初期案は変数と言う概念を持たず
直接メモリアドレスを参照すると言う形でした。
しかし問題が出てきました。
たとえばユーザー関数を別ファイルで汎用化させようとした場合、
関数間でメモリエリアの干渉が起こってしまうのです。
つまり、現状のままでは変数と言う概念が必要不可欠なのです。

言語仕様を一掃しようと思います。
まず言語的にサポートする機能は最低限のものであるというコンセプトは残します。
ではその機能を列挙します。

一般文

変数定義
ラベル定義
演算文(一項式)
条件分岐
無条件分岐

プリプロセス文

インクルード
ディファイン
外部DLL指定 外部関数指定