ページ 1 / 2
DimやGetの書き方
Posted: 2006年10月31日(火) 20:53
by 斉藤圭佑
MS-DOS上で動くBASICをWindows上で動かせるように編集しています。
プログラムの内容の概要は「バイナリデータをテキストデータに変換する」
です。編集を行ってる際に
・Get #1,○,○ の○の中に何を記述すればよいか
1090 1790 2390 2990行目
・Dim () As Double のカッコ内に文字を使いたいがどうしたらいいか
1710 2320 2930行目
の2項目でつまづいてしまいました。
また、エラー表示にはなっていませんが、
Field #1,128 As X$ 1070行目
Field #1,128 As Y$ 1071行目
と同じ#1を2行に分けて表現しているのですが大丈夫でしょうか。
BASIC自体も初心者で非常に初歩的な質問であるとは思いますが
よろしくお願いします。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#N88BASIC
1000 '****************************************************
1010 ' FFTANA.BAS
1020 '*
1030 '************************************************************
1040 DIM D(256) As Double '型が合っているかどうか
1041 DIM PNT As Double
1042 DIM X$ As Double
1043 DIM Y$ As Double
1044 DIM N As Double
1045 DIM M As Double
1050 PNT=400 'PNTは何を意味するのか point?
1060 OPEN "DAT3-14.FRK" As #1 ' FILE NAME
1070 FIELD #1,128 As X$ ' DATA BUFFER
1071 FIELD #1,128 As Y$ 'この辺あってるか不安
1080 '
1090 GET #1 '表現がわからない
1100 FOR N=1 TO 128
1110 M=N
1120 D(M)=Asc(Mid$(X$,N,1))
1130 NEXT
1140 FOR N=1 TO 128
1150 M=N+128
1160 D(M)=Asc(Mid$(Y$,N,1))
1170 NEXT
1180 CLOSE
1190 GOTO 1210
1200 '
1210 '************ ADRESS OF<Gaa> DATA *******************
1211 DIM STBAA As Long
1212 DIM DTBAA As Long
1220 STBAA=D(147)*256+D(148) ' START BLOCK NO.
1230 DTBAA=(D(150)*256+D(151))*256+D(152) ' DATA1 BYTE NO.
1231 DIM X1 As Long
1232 DIM X2 As Long
1233 DIM X3 As Long
1234 DIM X4 As Long
1240 X1=D(153) :X2=D(154)
1250 X3=D(155) :X4=D(156)
1251 DIM SIGN As Double
1252 DIM EXPO1 As Double
1253 DIM EXPO# As Double
1254 DIM FRAC# As Double
1255 DIM SCL# As Double
1256 DIM RE As Double
1257 DIM RE# As Double
1258 DIM SCLAA As Double
1260 SIGN=(-1)^((X1 AND 128)/128)
1270 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1280 EXPO#=2^EXPO1
1290 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1300 SCL#=SIGN*EXPO#*FRAC#
1310 IF Abs(RE#)<=1E-38 THEN RE=0
1320 SCLAA=SCL#/10^6
1330 GOTO 1350
1340 '
1350 '************* ADRESS OF <Gbb> DATA *****************
1351 DIM STBBB As Double
1352 DIM DTBBB As Double
1353 DIM SCLBB As Double
1360 STBBB=D(163)*256+D(164) ' START BLOCK NO.
1370 DTBBB=(D(166)*256+D(167))*256+D(168) ' DATA BYTE NO.
1380 '
1390 X1=D(169) :X2=D(170)
1400 X3=D(171) :X4=D(172)
1410 SIGN=(-1)^((X1 AND 128)/128)
1420 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1430 EXPO#=2^EXPO1
1440 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1450 SCL#=SIGN*EXPO#*FRAC#
1460 IF Abs(RE#)<=1E-38 THEN RE=0
1470 SCLBB=SCL#/10^6
1480 GOTO 1500
1490 '
1500 ' *********** ADRESS OF <Gbb> DATA ******************
1501 DIM STB As Double
1502 DIM DTB As Double
1503 DIM KK As Long
1504 DIM SCLAB As Double
1510 STB=D(179)*256+D(180) ' START BLOCK NO.
1520 DTB=(D(182)*256+D(183))*256+D(184) ' DATA3 BYTE NO.
1530 KK=2
1540 X1=D(185) :X2=D(186)
1550 X3=D(187) :X4=D(188)
1560 SIGN=(-1)^((X1 AND 128)/128)
1570 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1580 EXPO#=2^EXPO1
1590 FRAC#=(X2 OR 128)/128*X3/(128*256)+X4/(128*256*256)
1600 SCL#=SIGN*EXPO#*FRAC#
1610 IF Abs(RE#)<=1E-38 THEN RE=0
1620 SCLAB=SCL#/10^6
1630 GOTO 1650
1640 '
1650 '
1660 D(256)=0
1670 '
1680 '
1690 '
1691 DIM LOOP As Double 'LOOPで定義するのはよくないかも.色が変わってる
1692 DIM DTM As Long
1700 LOOP=Int(DTB/256)+1
1710 DIM DD(DTB+300) As Double '()内をどう表現するか.文字はまずいらしい
1720 DIM BB(420) As Double
1730 DIM AF(420) As Double
1740 DIM AI(420) As Double
1741 DIM AR(420) As Double
1742 DIM I As Double
1750 OPEN "DAT3-14.FRK" As #1 'FILE NAME
1760 FIELD #1,128 As X$ 'DATA BUFFER
1761 FIELD #1,128 As Y$ 'DATA BUFFER
1770 FOR I=1 TO LOOP 'LOOPを他の文字に変えて表現しなくていいのか?
1780 '
1790 GET #1,STB+I
1800 FOR N=1 TO 128
1810 M=256*(I-1)+N
1820 DD(M)=Asc(Mid$(X$,N,1))
1830 NEXT
1840 FOR N=1 TO 128
1850 M=256*(I-1)+N+128
1860 DD(M)=Asc(Mid$(Y$,N,1))
1870 NEXT
1880 NEXT
1890 CLOSE #1
1900 '
1910 '
1911 DIM P As Long
1712 DIM W As Long
1713 DIM S As Long
1714 DIM REAB As Double
1920 OPEN "DAT-GAB.DAT" FOR OUTPUT As #2
1930 P=KK*4
1940 W=0
1950 S=0
1960 FOR N=1 TO DTB STEP P
1970 X1=DD(N) :X2=DD(N+1)
1980 X3=DD(N+2) :X4=DD(N+3)
1990 '
2000 SIGN=(-1)^((X1 AND 128)/128)
2010 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2020 EXPO#=2^EXPO1
2030 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2040 RE#=SIGN*EXPO#*FRAC#
2050 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2090
2060 RE=RE#/10^6
2070 REAB=RE*SCLAB
2080 '
2090 '
2100 '
2101 DIM X5 As Long
2102 DIM X6 As Long
2103 DIM X7 As Long
2104 DIM X8 As Long
2105 DIM IM As Double
2106 DIM IM# As Double
2107 DIM IMAB As Double
2108 DIM R As Double
2109 DIM CISO As Double
2110 X5=DD(N+4) :X6=DD(N+5) ' IMAG DATA READ
2120 X7=DD(N+6) :X8=DD(N+7)
2130 SIGN=(-1)^((X5 AND 128)/128)
2140 EXPO1=((X5 AND 127)*2+(X6 AND 128)/128)-127
2150 EXPO#=2 ^ EXPO1
2160 FRAC#=(X6 OR 128)/128+X7/(128*256)+X8/(128*256*256)
2170 IM#=SIGN*EXPO#*FRAC#
2180 IF Abs(IM#)<=1E-38 THEN IM=0 :GOTO 2240
2190 IM=IM#/10^6
2200 IMAB=IM*SCLAB
2210 R=Sqr(RE*RE+IM*IM)
2220 AI(S)=IM
2221 AR(S)=RE
2230 CISO=IM/RE
2231 AF(S)=180/3.1415*Atn(CISO)
2232 BB(S)=R
2233 '
2234 '
2235 '
2236 '
2237 '
2240 S=S+1
2250 PRINT #2 ,W,REAB,IMAB
2260 W=W+0.25
2270 NEXT N
2280 CLOSE #2
2290 '
2300 '
2310 LOOP=Int(DTBAA/256)+1
2320 DIM DD#(DTBAA+300) As Double
2330 DIM BB#(420) As Double
2340 '
2350 OPEN "DAT3-14.FRK" As #1
2360 FIELD #1,128 As X$
2361 FIELD #1,128 As Y$
2370 FOR I=1 TO LOOP
2380 '
2390 GET #1,STBAA+I
2400 FOR N=1 TO 128
2410 M=256*(I-1)+N
2420 DD#(M)=Asc(Mid$(X$,N,1))
2430 NEXT
2440 FOR N=1 TO 128
2450 M=256*(I-1)+N+128
2460 DD#(M)=Asc(Mid$(Y$,N,1))
2470 NEXT
2480 '
2490 NEXT
2500 '
2510 CLOSE #1
2520 OPEN "DAT-GAA.DAT" FOR OUTPUT As #2
2530 '
2540 S=0
2550 W=0
2560 P=4
2570 FOR N=1 TO DTBAA STEP P
2580 X1=DD#(N) :X2=DD#(N+1)
2590 X3=DD#(N+2) :X4=DD#(N+3)
2600 SIGN=(-1)^((X1 AND 128)/128)
2610 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2620 EXPO#=2^EXPO1
2630 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2640 RE#=SIGN*EXPO#*FRAC#
2650 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2700
2660 RE=RE#/10^6
2661 DIM GAA As Double
2670 GAA=SCLAA*RE
2680 BB#(S)=1/RE
2690 S=S+1
2700
2710 PRINT #2 ,W,GAA
2720 W=W+0.25
2730 NEXT N
2740 '
2750 CLOSE #2
2760 '
2761 DIM GAI As Double
2762 DIM GAIN As Double
2763 DIM GAINY As Double
2764 DIM GAINN As Double
2765 DIM GAIN# As Double
2766 DIM FASE As Double
2770 OPEN "GAIN.DAT" FOR OUTPUT AS #2
2780 W=0.25
2790 FOR S=1 TO 400
2800 GAI=BB(S)*BB#(S)
2810 GAIN=Log(GAI)
2820 GAINY=Log(10)
2830 GAINN=GAIN/GAINY
2840 GAIN#=20*GAINN
2841 FASE=AF(S)
2842 IF AR(S)>0 AND AI(S)>0 THEN FASE=FASE
2843 IF AR(S)>0 AND AI(S)<0 THEN FASE=FASE
2844 IF AR(S)<0 AND AI(S)<0 THEN FASE=FASE-180
2845 IF AR(S)<0 AND AI(S)>0 THEN FASE=FASE+180
2850 PRINT #2,W,GAIN#,FASE
2860 W=W+0.25
2870 NEXT S
2880 CLOSE #2
2900 '
2910 '
2920 LOOP=Int(DTBBB/256)
2930 DIM DDD(DTBBB+300) As Double
2940 '
2950 OPEN "DAT3-14.FRK" As #1
2960 FIELD #1,128 As X$
2961 FIELD #1,128 As Y$
2970 FOR I=1 TO LOOP
2980 '
2990 GET #1 ,STBBB+I
3000 FOR N=1 TO 128
3010 M=256*(I-1)+N
3020 DDD(M)=Asc(Mid$(X$,N,1))
3030 NEXT
3040 FOR N=1 TO 128
3050 M=256*(I-1)+N+128
3060 DDD(M)=Asc(Mid$(Y$,N,1))
3070 NEXT
3080 '
3090 NEXT
3100 CLOSE #1
3110 '
2930 DIM GBB# As Double
2930 DIM GBB As Double
3111 OPEN "DAT-GBB.DAT" FOR OUTPUT As #2
3112 '
3113 W=0
3120 P=4
3130 FOR N=1 TO DTBBB STEP P
3140 X1=DDD(N) :X2=DDD(N+1)
3150 X3=DDD(N+2) :X4=DDD(N+3)
3160 SIGN=(-1)^((X1 and 128)/128)
3170 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
3180 EXPO#=2^EXPO1
3190 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
3200 GBB#=SIGN*EXPO#*FRAC#
3210 IF Abs(GBB#)<=1E-38 THEN GBB=0 :GOTO 3240
3220 GBB=SCLBB*GBB#/10^6
3230 '
3240 '
3250 PRINT #2 ,W,GBB
3251 W=W+0.25
3260 NEXT N
3270 CLOSE #2
3280 '
3290 END
Posted: 2006年10月31日(火) 21:13
by konisi
ぱっと見なので完全な答えにはなりませんがご了承。
まず、187::2320行目
DTBAAは31::1212行目でLong型として定義されてますが、これがそもそもの間違いです。
Dimのカッコ内に英文字を書くことは出来ますが、その文字が使われるより以前にConstで定義しておく必要があります。
この場合はファイルから読み取って判断しているようなので、旧N88BASICに出てくるような関数だけでは書き換えきれないと思います。
後でプログラムの意味を汲み取ってそこらへんを解決しようかと考えています。
それと、取り敢えず色々なことを踏まえて2ブロック書き換えてみます。
Dim等は省略するので後で書き足して置いてください。
コード: 全て選択
'PNT=400'取り敢えず放っておきます。
Open "DAT3-14.FRK" As #1
Field #1,1
Get #1,1,X$
Get #1,1,Y$
FOR N=1 TO 128
'M=N'無意味なので書き直します。
D(N)=Asc(Mid$(X$,N,1))
NEXT
FOR N=1 TO 128
'M=N+128'無意味なので書き直します。
D(N+128)=Asc(Mid$(Y$,N,1))
NEXT
Close #1
Goto 1210
1210 '略。
STBAA=D(147)<<8+D(148)'<<記号はシフト演算といって、2のべき乗となる数を掛けるのに都合がいいので書き直しています。ヘルプ参照。
DTBAA=D(150)<<16+D(151)<<8+D(152)
X1=D(153)
X2=D(154)
X3=D(155)
X4=D(156)
SIGN=(-1)^((X1 AND 128)/128)'言い忘れましたが、論理演算をする時は使う変数は整数型(この場合適切なのはByte型)で宣言してください。
'例
'Dim X1 As Byte
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
SCL#=SIGN*EXPO#*FRAC#
IF Abs(RE#)<=1E-38 THEN RE=0' Then RE#=0 だと思います。
SCLAA=SCL#/10^6
GOTO 1350
Re: DimやGetの書き方
Posted: 2006年10月31日(火) 21:21
by 7
> ・Dim () As Double のカッコ内に文字を使いたいがどうしたらいいか
> 1710 2320 2930行目
DIM DD(DTB+300) As Doubleってのはつまり動的に変数を確保したいっていうことですよね?。色々と考える必要が有ってたぶん難しいと思いますが以下のようにすると可能です。
コード: 全て選択
DIM DD As *Double
' この部分が肝心になります。
DD=calloc(SizeOf(Double)*(DTB+300))
' DD[DTB+300]までアクセス可能
DD[0]=0.1
DD[1]=0.2
free(DD)
Posted: 2006年10月31日(火) 21:50
by konisi
元がどう動いていたかはわからないので何ともいえませんが、取り敢えずコンパイルが通る形に書き換えが完了しました。不恰好だけどインデントとか変更したのとコンパイル通るのとが終わっているので、他の人にも難なく手伝えると思います。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#N88BASIC
DIM D(256) As Byte
DIM X$ As String
DIM Y$ As String
DIM N As Long
DIM M As Long
DIM STBAA As Long
DIM DTBAA As Long
DIM X1 As Long
DIM X2 As Long
DIM X3 As Long
DIM X4 As Long
DIM SIGN As Double
DIM EXPO1 As Double
DIM EXPO# As Double
DIM FRAC# As Double
DIM SCL# As Double
DIM RE# As Double
DIM SCLAA As Double
DIM STBBB As Double
DIM DTBBB As Double
DIM SCLBB As Double
DIM STB As Double
DIM DTB As Double
DIM KK As Long
DIM SCLAB As Double
DIM LOOPe As Double
DIM DTM As Long
DIM DD As BytePtr
DIM BB(420) As Double
DIM AF(420) As Double
DIM AI(420) As Double
DIM AR(420) As Double
DIM I As Double
DIM P As Long
DIM W As Long
DIM S As Long
DIM REAB As Double
DIM X5 As Long
DIM X6 As Long
DIM X7 As Long
DIM X8 As Long
DIM IM# As Long
DIM IMAB As Double
DIM R As Double
DIM CISO As Double
DIM GAA As Double
DIM DD# As BytePtr
DIM BB#(420) As Long
DIM GAI As Double
DIM GAIN As Double
DIM GAINY As Double
DIM GAINN As Double
DIM GAIN# As Double
DIM FASE As Double
DIM DDD As BytePtr
DIM GBB# As Double
OPEN "DAT3-14.FRK" As #1
FIELD #1,256
GET #1,,X$
FOR N=1 TO 256
D(N)=Asc(Mid$(X$,N,1))
NEXT
CLOSE #1
STBAA=D(147)*256+D(148)
DTBAA=(D(150)*256+D(151))*256+D(152)
X1=D(153)
X2=D(154)
X3=D(155)
X4=D(156)
SIGN=(-1)^((X1 AND 128)/128)
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
SCL#=SIGN*EXPO#*FRAC#
SCLAA=SCL#/10^6
STBBB=D(163)*256+D(164)
DTBBB=(D(166)*256+D(167))*256+D(168)
X1=D(169)
X2=D(170)
X3=D(171)
X4=D(172)
SIGN=(-1)^((X1 AND 128)/128)
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
SCL#=SIGN*EXPO#*FRAC#
SCLBB=SCL#/10^6
STB=D(179)*256+D(180)
DTB=(D(182)*256+D(183))*256+D(184)
KK=2
X1=D(185)
X2=D(186)
X3=D(187)
X4=D(188)
SIGN=(-1)^((X1 AND 128)/128)
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128*X3/(128*256)+X4/(128*256*256)
SCL#=SIGN*EXPO#*FRAC#
SCLAB=SCL#/10^6
D(256)=0
LOOPe=Int(DTB/256)+1
DD=calloc(DTB+300)
OPEN "DAT3-14.FRK" As #1
FIELD #1,256
FOR I=1 TO LOOPe
GET #1,STB+I,X$
FOR N=1 TO 256
M=256*(I-1)+N
DD(M)=Asc(Mid$(X$,N,1))
NEXT
NEXT
CLOSE #1
OPEN "DAT-GAB.DAT" FOR OUTPUT As #2
P=KK*4
W=0
S=0
FOR N=1 TO DTB STEP P
X1=DD(N)
X2=DD(N+1)
X3=DD(N+2)
X4=DD(N+3)
SIGN=(-1)^((X1 AND 128)/128)
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
RE#=SIGN*EXPO#*FRAC#
IF Abs(RE#)<=1E-38 THEN RE#=0 :GOTO *A
RE#=RE#/10^6
REAB=RE#*SCLAB
*A
X5=DD(N+4)
X6=DD(N+5)
X7=DD(N+6)
X8=DD(N+7)
SIGN=(-1)^((X5 AND 128)/128)
EXPO1=((X5 AND 127)*2+(X6 AND 128)/128)-127
EXPO#=2 ^ EXPO1
FRAC#=(X6 OR 128)/128+X7/(128*256)+X8/(128*256*256)
IM#=SIGN*EXPO#*FRAC#
IF Abs(IM#)<=1E-38 THEN
IM#=0
Else
IM#=IM#/10^6
IMAB=IM#*SCLAB
R=Sqr(RE#*RE#+IM#*IM#)
AI(S)=IM#
AR(S)=RE#
CISO=IM#/RE#
AF(S)=180/3.1415*Atn(CISO)
BB(S)=R
End If
S=S+1
PRINT #2 ,W,REAB,IMAB
W=W+0.25
NEXT N
CLOSE #2
LOOPe=Int(DTBAA/256)+1
DD#=calloc(DTBAA+300)
OPEN "DAT3-14.FRK" As #1
FIELD #1,256
FOR I=1 TO LOOPe
GET #1,STBAA+I,X$
FOR N=1 TO 256
M=256*(I-1)+N
DD#(M)=Asc(Mid$(X$,N,1))
NEXT
NEXT
CLOSE #1
OPEN "DAT-GAA.DAT" FOR OUTPUT As #2
S=0
W=0
P=4
FOR N=1 TO DTBAA STEP P
X1=DD#(N) :X2=DD#(N+1)
X3=DD#(N+2) :X4=DD#(N+3)
SIGN=(-1)^((X1 AND 128)/128)
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
RE#=SIGN*EXPO#*FRAC#
IF Abs(RE#)<=1E-38 THEN
RE#=0
Else
RE#=RE#/10^6
GAA=SCLAA*RE#
BB#(S)=1/RE#
S=S+1
End If
PRINT #2 ,W,GAA
W=W+0.25
NEXT N
CLOSE #2
OPEN "GAIN.DAT" FOR OUTPUT AS #2
W=0.25
FOR S=1 TO 400
GAI=BB(S)*BB#(S)
GAIN=Log(GAI)
GAINY=Log(10)
GAINN=GAIN/GAINY
GAIN#=20*GAINN
FASE=AF(S)
IF AR(S)<0 AND AI(S)<0 THEN FASE=FASE-180
IF AR(S)<0 AND AI(S)>0 THEN FASE=FASE+180
PRINT #2,W,GAIN#,FASE
W=W+0.25
NEXT S
CLOSE #2
LOOPe=Int(DTBBB/256)
DDD=calloc(DTBBB+300)
OPEN "DAT3-14.FRK" As #1
FIELD #1,256
FOR I=1 TO LOOPe
GET #1 ,STBBB+I,X$
FOR N=1 TO 256
M=256*(I-1)+N
DDD(M)=Asc(Mid$(X$,N,1))
NEXT
NEXT
CLOSE #1
OPEN "DAT-GBB.DAT" FOR OUTPUT As #2
W=0
P=4
FOR N=1 TO DTBBB STEP P
X1=DDD(N)
X2=DDD(N+1)
X3=DDD(N+2)
X4=DDD(N+3)
SIGN=(-1)^((X1 and 128)/128)
EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
EXPO#=2^EXPO1
FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
GBB#=SIGN*EXPO#*FRAC#
IF Abs(GBB#)<=1E-38 THEN
GBB#=0
Else
GBB#=SCLBB*GBB#/10^6
End If
PRINT #2 ,W,GBB#
W=W+0.25
NEXT N
CLOSE #2
free(DD)
free(DD#)
free(DDD)
END
Re: DimやGetの書き方
Posted: 2006年11月01日(水) 22:15
by 斉藤 圭佑
対応策を丁寧にアドバイスしていただき、ありがとうございます。
konisiさんが作成されたプログラムをこちらで編集せずそのまま走らせてみたのですが、実行画面は固まってしまい、ソース画面には
“スレッド(&HF64)でアクセス違反がありました(EPI=&H00402518)”
と表示が出てしまい実行ができませんでした。
また、konisiさんと7さんのアドバイスを元に自分なりにプログラムを作ってみました。
konisiさんと7さんのアドバイスのおかげでコンパイル時のエラーはなんとか消えたのですが、実行を行う際に実行画面が固まってしまいます。プログラムのどこかがおかしいのでしょうか。
具体的にどこがおかしいかも知れないというところが判らないので質問が漠然としてしまい申し訳ありません。
以下にプログラム上でOpenされるファイルと、MS-DOS上で正常に実行された場合に書き出されるデータをアップしています。
http://briefcase.yahoo.co.jp/bc/keisukk ... http%3a//b
自分なりに作成したプログラムソースです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#N88BASIC
1000 '****************************************************
1010 ' FFTANA.BAS
1020 '*
1030 '************************************************************
1040 DIM D(256) As Byte '型が合っているかどうか
'1041 DIM PNT As Double
1042 DIM X$ As String
1043 DIM Y$ As String
1044 DIM N As Long
1045 DIM M As Double
'1050 PNT=400 'PNTは何を意味するのか point?
1060 OPEN "DAT3-14.FRK" As #1 ' FILE NAME
1070 FIELD #1,128 ' DATA BUFFER
1080 Get #1,1,X$
1090 Get #1,1,Y$
1100 FOR N=1 TO 128
1120 D(N)=Asc(Mid$(X$,N,1))
1130 NEXT
1140 FOR N=1 TO 128
1160 D(N+128)=Asc(Mid$(Y$,N,1))
1170 NEXT
1180 Close #1
1190 GOTO 1210
1200 '
1210 '************ ADRESS OF<Gaa> DATA *******************
1211 DIM STBAA As Long
1212 DIM DTBAA As Long
1220 STBAA=D(147)*256+D(148) ' START BLOCK NO.
1230 DTBAA=(D(150)*256+D(151))*256+D(152) ' DATA1 BYTE NO.
1231 DIM X1 As Long
1232 DIM X2 As Long
1233 DIM X3 As Long
1234 DIM X4 As Long
1240 X1=D(153)
1241 X2=D(154)
1250 X3=D(155)
1251 X4=D(156)
1251 DIM SIGN As Double
1252 DIM EXPO1 As Double
1253 DIM EXPO# As Double
1254 DIM FRAC# As Double
1255 DIM SCL# As Double
1256 DIM RE As Double '1310行のREとRE#のこと.どちらかなのか両方定義するのかわからん
1257 DIM RE# As Double 'イマのところREとRE#を区別して両方定義している 2060参照 別の意味として扱ってるっぽい
1258 DIM SCLAA As Double
1260 SIGN=(-1)^((X1 AND 128)/128)
1270 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1280 EXPO#=2^EXPO1
1290 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1300 SCL#=SIGN*EXPO#*FRAC#
'1310 IF Abs(RE#)<=1E-38 THEN RE#=0
1320 SCLAA=SCL#/10^6
1330 GOTO 1350
1340 '
1350 '************* ADRESS OF <Gbb> DATA *****************
1351 DIM STBBB As Double
1352 DIM DTBBB As Double
1353 DIM SCLBB As Double
1360 STBBB=D(163)*256+D(164) ' START BLOCK NO.
1370 DTBBB=(D(166)*256+D(167))*256+D(168) ' DATA BYTE NO.
1380 '
1390 X1=D(169)
1391 X2=D(170)
1400 X3=D(171)
1401 X4=D(172)
1410 SIGN=(-1)^((X1 AND 128)/128)
1420 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1430 EXPO#=2^EXPO1
1440 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1450 SCL#=SIGN*EXPO#*FRAC#
'1460 IF Abs(RE#)<=1E-38 THEN RE=0 '上と同様のREとRE#について
1470 SCLBB=SCL#/10^6
1480 GOTO 1500
1490 '
1500 ' *********** ADRESS OF <Gbb> DATA ******************
1501 DIM STB As Double
1502 DIM DTB As Double
1503 DIM KK As Long
1504 DIM SCLAB As Double
1510 STB=D(179)*256+D(180) ' START BLOCK NO.
1520 DTB=(D(182)*256+D(183))*256+D(184) ' DATA3 BYTE NO.
1530 KK=2
1540 X1=D(185)
1541 X2=D(186)
1550 X3=D(187)
1551 X4=D(188)
1560 SIGN=(-1)^((X1 AND 128)/128)
1570 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127 'ANDの表現はこれでいいのか?
1580 EXPO#=2^EXPO1
1590 FRAC#=(X2 OR 128)/128*X3/(128*256)+X4/(128*256*256)
1600 SCL#=SIGN*EXPO#*FRAC#
'1610 IF Abs(RE#)<=1E-38 THEN RE=0 'RE#とREについて
1620 SCLAB=SCL#/10^6
1630 GOTO 1650
1640 '
1650 '
'1651 DIM ERASE As Double
1660 D(256)=0 '配列Dの消去という意味 やり方わからん
1670 '
1680 '
1690 '
1691 DIM LOOPe As Double 'LOOPで定義するのはよくないかも.色が変わってる
1692 DIM DTM As Long 'LOOPで定義するのはよくないかも.色が変わってる
1700 LOOPe=Int(DTB/256)+1
1710 DIM DD As *Double '()内をどう表現するか.文字はまずいらしい
1711 DD=calloc(SizeOf(Double)*(DTB+300))
1712 DD[0]=0.1
1713 DD[1]=0.2
1720 DIM BB(420) As Double
1730 DIM AF(420) As Double
1740 DIM AI(420) As Double
1741 DIM AR(420) As Double
1742 DIM I As Double
1750 OPEN "DAT3-14.FRK" As #1 'FILE NAME
1760 FIELD #1,128 'DATA BUFFER
'1760 FIELD #1,128 As X$ 'DATA BUFFER
'1761 FIELD #1,128 As Y$ 'DATA BUFFER
1770 FOR I=1 TO LOOPe 'LOOPを他の文字に変えて表現しなくていいのか?
1780 '
1790 GET #1,STB+I,X$ 'この辺から不安!!!!!!
1790 GET #1,STB+I,Y$
1800 FOR N=1 TO 128
1810 M=256*(I-1)+N
1820 DD(M)=Asc(Mid$(X$,N,1))
1830 NEXT
1840 FOR N=1 TO 128
1850 M=256*(I-1)+N+128
1860 DD(M)=Asc(Mid$(Y$,N,1))
1870 NEXT
1880 NEXT 'この辺まで不安!!!!!!
1890 CLOSE #1
1900 '
1910 '
1911 DIM P As Long
1712 DIM W As Long
1713 DIM S As Long
1714 DIM REAB As Double
1920 OPEN "DAT-GAB.DAT" FOR OUTPUT As #2
1930 P=KK*4
1940 W=0
1950 S=0
1960 FOR N=1 TO DTB STEP P
1970 X1=DD(N)
1971 X2=DD(N+1)
1980 X3=DD(N+2)
1981 X4=DD(N+3)
1990 '
2000 SIGN=(-1)^((X1 AND 128)/128)
2010 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2020 EXPO#=2^EXPO1
2030 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2040 RE#=SIGN*EXPO#*FRAC#
2050 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2090 'この辺から不安!!!!!
2060 RE#=RE/10^6
2070 REAB=RE*SCLAB 'この辺まで不安!!!!!!
2080 '
2090 '
2100 '
2101 DIM X5 As Long
2102 DIM X6 As Long
2103 DIM X7 As Long
2104 DIM X8 As Long
2105 DIM IM As Double
2106 DIM IM# As Long
2107 DIM IMAB As Double
2108 DIM R As Double
2109 DIM CISO As Double
2110 X5=DD(N+4)
2111 X6=DD(N+5) ' IMAG DATA READ
2120 X7=DD(N+6)
2121 X8=DD(N+7)
2130 SIGN=(-1)^((X5 AND 128)/128)
2140 EXPO1=((X5 AND 127)*2+(X6 AND 128)/128)-127
2150 EXPO#=2 ^ EXPO1
2160 FRAC#=(X6 OR 128)/128+X7/(128*256)+X8/(128*256*256)
2170 IM#=SIGN*EXPO#*FRAC#
2180 IF Abs(IM#)<=1E-38 THEN IM=0 :GOTO 2240 'この辺から不安!!!!!!!
2190 IM=IM#/10^6
2200 IMAB=IM*SCLAB
2210 R=Sqr(RE*RE+IM*IM)
2220 AI(S)=IM
2221 AR(S)=RE
2230 CISO=IM/RE
2231 AF(S)=180/3.1415*Atn(CISO)
2232 BB(S)=R 'この辺まで不安!!!!!!!!
2233 '
2234 '
2235 '
2236 '
2237 '
2240 S=S+1
2250 PRINT #2 ,W,REAB,IMAB
2260 W=W+0.25
2270 NEXT N
2280 CLOSE #2
2290 '
2300 '
2310 LOOPe=Int(DTBAA/256)+1 'この辺から不安!!!!!!
'2320 DIM DD#(DTBAA+300) As Double
2321 DIM DD# As *Double
2322 DD#=calloc(SizeOf(Double)*(DTBAA+300))
2323 DD#[0]=0.1
2324 DD#[1]=0.2
2330 DIM BB#(420) As Long
'2340 DD#=calloc(DTBAA+300)
2350 OPEN "DAT3-14.FRK" As #1
2360 FIELD #1,128
'2360 FIELD #1,128 AS X$
'2361 FIELD #1,128 AS Y$
2370 FOR I=1 TO LOOPe
2380 '
2390 GET #1,STBAA+I,X$
2390 GET #1,STBAA+I,Y$
2400 FOR N=1 TO 128
2410 M=256*(I-1)+N
2420 DD#(M)=Asc(Mid$(X$,N,1))
2430 NEXT
2440 FOR N=1 TO 128
2450 M=256*(I-1)+N+128
2460 DD#(M)=Asc(Mid$(Y$,N,1)) 'この辺まで不安!!!!!!
2470 NEXT
2480 '
2490 NEXT
2500 '
2510 CLOSE #1
2520 OPEN "DAT-GAA.DAT" FOR OUTPUT As #2
2530 '
2540 S=0
2550 W=0
2560 P=4
2570 FOR N=1 TO DTBAA STEP P
2580 X1=DD#(N) :X2=DD#(N+1)
2590 X3=DD#(N+2) :X4=DD#(N+3)
2600 SIGN=(-1)^((X1 AND 128)/128)
2610 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2620 EXPO#=2^EXPO1
2630 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2640 RE#=SIGN*EXPO#*FRAC#
2650 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2700
2660 RE=RE#/10^6 'この辺のREの区別が不安!!!!!!
2661 DIM GAA As Double
2670 GAA=SCLAA*RE
2680 BB#(S)=1/RE
2690 S=S+1
2700
2710 PRINT #2 ,W,GAA
2720 W=W+0.25
2730 NEXT N
2740 '
2750 CLOSE #2
2760 '
2761 DIM GAI As Double
2762 DIM GAIN As Double
2763 DIM GAINY As Double
2764 DIM GAINN As Double
2765 DIM GAIN# As Double
2766 DIM FASE As Double
2770 OPEN "GAIN.DAT" FOR OUTPUT As #2
2780 W=0.25
2790 FOR S=1 TO 400
2800 GAI=BB(S)*BB#(S)
2810 GAIN=Log(GAI)
2820 GAINY=Log(10)
2830 GAINN=GAIN/GAINY
2840 GAIN#=20*GAINN
2841 FASE=AF(S)
2842 IF AR(S)>0 AND AI(S)>0 THEN FASE=FASE 'この辺から不安!!!!!
2843 IF AR(S)>0 AND AI(S)<0 THEN FASE=FASE
2844 IF AR(S)<0 AND AI(S)<0 THEN FASE=FASE-180
2845 IF AR(S)<0 AND AI(S)>0 THEN FASE=FASE+180 'この辺まで不安!!!!!
2850 PRINT #2,W,GAIN#,FASE
2860 W=W+0.25
2870 NEXT S
2880 CLOSE #2
2900 '
2910 '
2920 LOOPe=Int(DTBBB/256)
2930 DIM DDD As *Double
2931 DDD=calloc(SizeOf(Double)*(DTBBB+300))
2932 DDD[0]=0.1
2933 DDD[1]=0.2
'2940 DDD=calloc(DTBBB+300)
2950 OPEN "DAT3-14.FRK" As #1 'この辺から不安!!!!!
2960 FIELD #1,128
'2960 FIELD #1,128 AS X$
'2961 FIELD #1,128 AS Y$
2970 FOR I=1 TO LOOPe
2980 '
2990 GET #1,STBBB+I,X$
2991 GET #1,STBBB+I,Y$
3000 FOR N=1 TO 128
3010 M=256*(I-1)+N
3020 DDD(M)=Asc(Mid$(X$,N,1))
3030 NEXT
3040 FOR N=1 TO 128
3050 M=256*(I-1)+N+128
3060 DDD(M)=Asc(Mid$(Y$,N,1)) 'この辺まで不安!!!!!
3070 NEXT
3080 '
3090 NEXT
3100 CLOSE #1
3110 '
2930 DIM GBB# As Double
2930 DIM GBB As Double
3111 OPEN "DAT-GBB.DAT" FOR OUTPUT As #2
3112 '
3113 W=0
3120 P=4
3130 FOR N=1 TO DTBBB STEP P
3140 X1=DDD(N)
3141 X2=DDD(N+1)
3150 X3=DDD(N+2)
3151 X4=DDD(N+3)
3160 SIGN=(-1)^((X1 and 128)/128)
3170 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
3180 EXPO#=2^EXPO1
3190 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
3200 GBB#=SIGN*EXPO#*FRAC#
3210 IF Abs(GBB#)<=1E-38 THEN GBB=0 :GOTO 3240
3220 GBB=SCLBB*GBB#/10^6
3230 '
3240 '
3250 PRINT #2 ,W,GBB
3251 W=W+0.25
3260 NEXT N
3270 CLOSE #2
3280 free(DD)
3281 free(DD#)
3282 free(DDD)
3290 END
Re: DimやGetの書き方
Posted: 2006年11月01日(水) 22:16
by 斉藤 圭佑
対応策を丁寧にアドバイスしていただき、ありがとうございます。
konisiさんが作成されたプログラムをこちらで編集せずそのまま走らせてみたのですが、実行画面は固まってしまい、ソース画面には
“スレッド(&HF64)でアクセス違反がありました(EPI=&H00402518)”
と表示が出てしまい実行ができませんでした。
また、konisiさんと7さんのアドバイスを元に自分なりにプログラムを作ってみました。
konisiさんと7さんのアドバイスのおかげでコンパイル時のエラーはなんとか消えたのですが、実行を行う際に実行画面が固まってしまいます。プログラムのどこかがおかしいのでしょうか。
具体的にどこがおかしいかも知れないというところが判らないので質問が漠然としてしまい申し訳ありません。
以下にプログラム上でOpenされるファイルと、MS-DOS上で正常に実行された場合に書き出されるデータをアップしています。
http://briefcase.yahoo.co.jp/bc/keisukk ... http%3a//b
自分なりに作成したプログラムソースです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#N88BASIC
1000 '****************************************************
1010 ' FFTANA.BAS
1020 '*
1030 '************************************************************
1040 DIM D(256) As Byte '型が合っているかどうか
'1041 DIM PNT As Double
1042 DIM X$ As String
1043 DIM Y$ As String
1044 DIM N As Long
1045 DIM M As Double
'1050 PNT=400 'PNTは何を意味するのか point?
1060 OPEN "DAT3-14.FRK" As #1 ' FILE NAME
1070 FIELD #1,128 ' DATA BUFFER
1080 Get #1,1,X$
1090 Get #1,1,Y$
1100 FOR N=1 TO 128
1120 D(N)=Asc(Mid$(X$,N,1))
1130 NEXT
1140 FOR N=1 TO 128
1160 D(N+128)=Asc(Mid$(Y$,N,1))
1170 NEXT
1180 Close #1
1190 GOTO 1210
1200 '
1210 '************ ADRESS OF<Gaa> DATA *******************
1211 DIM STBAA As Long
1212 DIM DTBAA As Long
1220 STBAA=D(147)*256+D(148) ' START BLOCK NO.
1230 DTBAA=(D(150)*256+D(151))*256+D(152) ' DATA1 BYTE NO.
1231 DIM X1 As Long
1232 DIM X2 As Long
1233 DIM X3 As Long
1234 DIM X4 As Long
1240 X1=D(153)
1241 X2=D(154)
1250 X3=D(155)
1251 X4=D(156)
1251 DIM SIGN As Double
1252 DIM EXPO1 As Double
1253 DIM EXPO# As Double
1254 DIM FRAC# As Double
1255 DIM SCL# As Double
1256 DIM RE As Double '1310行のREとRE#のこと.どちらかなのか両方定義するのかわからん
1257 DIM RE# As Double 'イマのところREとRE#を区別して両方定義している 2060参照 別の意味として扱ってるっぽい
1258 DIM SCLAA As Double
1260 SIGN=(-1)^((X1 AND 128)/128)
1270 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1280 EXPO#=2^EXPO1
1290 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1300 SCL#=SIGN*EXPO#*FRAC#
'1310 IF Abs(RE#)<=1E-38 THEN RE#=0
1320 SCLAA=SCL#/10^6
1330 GOTO 1350
1340 '
1350 '************* ADRESS OF <Gbb> DATA *****************
1351 DIM STBBB As Double
1352 DIM DTBBB As Double
1353 DIM SCLBB As Double
1360 STBBB=D(163)*256+D(164) ' START BLOCK NO.
1370 DTBBB=(D(166)*256+D(167))*256+D(168) ' DATA BYTE NO.
1380 '
1390 X1=D(169)
1391 X2=D(170)
1400 X3=D(171)
1401 X4=D(172)
1410 SIGN=(-1)^((X1 AND 128)/128)
1420 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1430 EXPO#=2^EXPO1
1440 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1450 SCL#=SIGN*EXPO#*FRAC#
'1460 IF Abs(RE#)<=1E-38 THEN RE=0 '上と同様のREとRE#について
1470 SCLBB=SCL#/10^6
1480 GOTO 1500
1490 '
1500 ' *********** ADRESS OF <Gbb> DATA ******************
1501 DIM STB As Double
1502 DIM DTB As Double
1503 DIM KK As Long
1504 DIM SCLAB As Double
1510 STB=D(179)*256+D(180) ' START BLOCK NO.
1520 DTB=(D(182)*256+D(183))*256+D(184) ' DATA3 BYTE NO.
1530 KK=2
1540 X1=D(185)
1541 X2=D(186)
1550 X3=D(187)
1551 X4=D(188)
1560 SIGN=(-1)^((X1 AND 128)/128)
1570 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127 'ANDの表現はこれでいいのか?
1580 EXPO#=2^EXPO1
1590 FRAC#=(X2 OR 128)/128*X3/(128*256)+X4/(128*256*256)
1600 SCL#=SIGN*EXPO#*FRAC#
'1610 IF Abs(RE#)<=1E-38 THEN RE=0 'RE#とREについて
1620 SCLAB=SCL#/10^6
1630 GOTO 1650
1640 '
1650 '
'1651 DIM ERASE As Double
1660 D(256)=0 '配列Dの消去という意味 やり方わからん
1670 '
1680 '
1690 '
1691 DIM LOOPe As Double 'LOOPで定義するのはよくないかも.色が変わってる
1692 DIM DTM As Long 'LOOPで定義するのはよくないかも.色が変わってる
1700 LOOPe=Int(DTB/256)+1
1710 DIM DD As *Double '()内をどう表現するか.文字はまずいらしい
1711 DD=calloc(SizeOf(Double)*(DTB+300))
1712 DD[0]=0.1
1713 DD[1]=0.2
1720 DIM BB(420) As Double
1730 DIM AF(420) As Double
1740 DIM AI(420) As Double
1741 DIM AR(420) As Double
1742 DIM I As Double
1750 OPEN "DAT3-14.FRK" As #1 'FILE NAME
1760 FIELD #1,128 'DATA BUFFER
'1760 FIELD #1,128 As X$ 'DATA BUFFER
'1761 FIELD #1,128 As Y$ 'DATA BUFFER
1770 FOR I=1 TO LOOPe 'LOOPを他の文字に変えて表現しなくていいのか?
1780 '
1790 GET #1,STB+I,X$ 'この辺から不安!!!!!!
1790 GET #1,STB+I,Y$
1800 FOR N=1 TO 128
1810 M=256*(I-1)+N
1820 DD(M)=Asc(Mid$(X$,N,1))
1830 NEXT
1840 FOR N=1 TO 128
1850 M=256*(I-1)+N+128
1860 DD(M)=Asc(Mid$(Y$,N,1))
1870 NEXT
1880 NEXT 'この辺まで不安!!!!!!
1890 CLOSE #1
1900 '
1910 '
1911 DIM P As Long
1712 DIM W As Long
1713 DIM S As Long
1714 DIM REAB As Double
1920 OPEN "DAT-GAB.DAT" FOR OUTPUT As #2
1930 P=KK*4
1940 W=0
1950 S=0
1960 FOR N=1 TO DTB STEP P
1970 X1=DD(N)
1971 X2=DD(N+1)
1980 X3=DD(N+2)
1981 X4=DD(N+3)
1990 '
2000 SIGN=(-1)^((X1 AND 128)/128)
2010 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2020 EXPO#=2^EXPO1
2030 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2040 RE#=SIGN*EXPO#*FRAC#
2050 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2090 'この辺から不安!!!!!
2060 RE#=RE/10^6
2070 REAB=RE*SCLAB 'この辺まで不安!!!!!!
2080 '
2090 '
2100 '
2101 DIM X5 As Long
2102 DIM X6 As Long
2103 DIM X7 As Long
2104 DIM X8 As Long
2105 DIM IM As Double
2106 DIM IM# As Long
2107 DIM IMAB As Double
2108 DIM R As Double
2109 DIM CISO As Double
2110 X5=DD(N+4)
2111 X6=DD(N+5) ' IMAG DATA READ
2120 X7=DD(N+6)
2121 X8=DD(N+7)
2130 SIGN=(-1)^((X5 AND 128)/128)
2140 EXPO1=((X5 AND 127)*2+(X6 AND 128)/128)-127
2150 EXPO#=2 ^ EXPO1
2160 FRAC#=(X6 OR 128)/128+X7/(128*256)+X8/(128*256*256)
2170 IM#=SIGN*EXPO#*FRAC#
2180 IF Abs(IM#)<=1E-38 THEN IM=0 :GOTO 2240 'この辺から不安!!!!!!!
2190 IM=IM#/10^6
2200 IMAB=IM*SCLAB
2210 R=Sqr(RE*RE+IM*IM)
2220 AI(S)=IM
2221 AR(S)=RE
2230 CISO=IM/RE
2231 AF(S)=180/3.1415*Atn(CISO)
2232 BB(S)=R 'この辺まで不安!!!!!!!!
2233 '
2234 '
2235 '
2236 '
2237 '
2240 S=S+1
2250 PRINT #2 ,W,REAB,IMAB
2260 W=W+0.25
2270 NEXT N
2280 CLOSE #2
2290 '
2300 '
2310 LOOPe=Int(DTBAA/256)+1 'この辺から不安!!!!!!
'2320 DIM DD#(DTBAA+300) As Double
2321 DIM DD# As *Double
2322 DD#=calloc(SizeOf(Double)*(DTBAA+300))
2323 DD#[0]=0.1
2324 DD#[1]=0.2
2330 DIM BB#(420) As Long
'2340 DD#=calloc(DTBAA+300)
2350 OPEN "DAT3-14.FRK" As #1
2360 FIELD #1,128
'2360 FIELD #1,128 AS X$
'2361 FIELD #1,128 AS Y$
2370 FOR I=1 TO LOOPe
2380 '
2390 GET #1,STBAA+I,X$
2390 GET #1,STBAA+I,Y$
2400 FOR N=1 TO 128
2410 M=256*(I-1)+N
2420 DD#(M)=Asc(Mid$(X$,N,1))
2430 NEXT
2440 FOR N=1 TO 128
2450 M=256*(I-1)+N+128
2460 DD#(M)=Asc(Mid$(Y$,N,1)) 'この辺まで不安!!!!!!
2470 NEXT
2480 '
2490 NEXT
2500 '
2510 CLOSE #1
2520 OPEN "DAT-GAA.DAT" FOR OUTPUT As #2
2530 '
2540 S=0
2550 W=0
2560 P=4
2570 FOR N=1 TO DTBAA STEP P
2580 X1=DD#(N) :X2=DD#(N+1)
2590 X3=DD#(N+2) :X4=DD#(N+3)
2600 SIGN=(-1)^((X1 AND 128)/128)
2610 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2620 EXPO#=2^EXPO1
2630 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2640 RE#=SIGN*EXPO#*FRAC#
2650 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2700
2660 RE=RE#/10^6 'この辺のREの区別が不安!!!!!!
2661 DIM GAA As Double
2670 GAA=SCLAA*RE
2680 BB#(S)=1/RE
2690 S=S+1
2700
2710 PRINT #2 ,W,GAA
2720 W=W+0.25
2730 NEXT N
2740 '
2750 CLOSE #2
2760 '
2761 DIM GAI As Double
2762 DIM GAIN As Double
2763 DIM GAINY As Double
2764 DIM GAINN As Double
2765 DIM GAIN# As Double
2766 DIM FASE As Double
2770 OPEN "GAIN.DAT" FOR OUTPUT As #2
2780 W=0.25
2790 FOR S=1 TO 400
2800 GAI=BB(S)*BB#(S)
2810 GAIN=Log(GAI)
2820 GAINY=Log(10)
2830 GAINN=GAIN/GAINY
2840 GAIN#=20*GAINN
2841 FASE=AF(S)
2842 IF AR(S)>0 AND AI(S)>0 THEN FASE=FASE 'この辺から不安!!!!!
2843 IF AR(S)>0 AND AI(S)<0 THEN FASE=FASE
2844 IF AR(S)<0 AND AI(S)<0 THEN FASE=FASE-180
2845 IF AR(S)<0 AND AI(S)>0 THEN FASE=FASE+180 'この辺まで不安!!!!!
2850 PRINT #2,W,GAIN#,FASE
2860 W=W+0.25
2870 NEXT S
2880 CLOSE #2
2900 '
2910 '
2920 LOOPe=Int(DTBBB/256)
2930 DIM DDD As *Double
2931 DDD=calloc(SizeOf(Double)*(DTBBB+300))
2932 DDD[0]=0.1
2933 DDD[1]=0.2
'2940 DDD=calloc(DTBBB+300)
2950 OPEN "DAT3-14.FRK" As #1 'この辺から不安!!!!!
2960 FIELD #1,128
'2960 FIELD #1,128 AS X$
'2961 FIELD #1,128 AS Y$
2970 FOR I=1 TO LOOPe
2980 '
2990 GET #1,STBBB+I,X$
2991 GET #1,STBBB+I,Y$
3000 FOR N=1 TO 128
3010 M=256*(I-1)+N
3020 DDD(M)=Asc(Mid$(X$,N,1))
3030 NEXT
3040 FOR N=1 TO 128
3050 M=256*(I-1)+N+128
3060 DDD(M)=Asc(Mid$(Y$,N,1)) 'この辺まで不安!!!!!
3070 NEXT
3080 '
3090 NEXT
3100 CLOSE #1
3110 '
2930 DIM GBB# As Double
2930 DIM GBB As Double
3111 OPEN "DAT-GBB.DAT" FOR OUTPUT As #2
3112 '
3113 W=0
3120 P=4
3130 FOR N=1 TO DTBBB STEP P
3140 X1=DDD(N)
3141 X2=DDD(N+1)
3150 X3=DDD(N+2)
3151 X4=DDD(N+3)
3160 SIGN=(-1)^((X1 and 128)/128)
3170 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
3180 EXPO#=2^EXPO1
3190 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
3200 GBB#=SIGN*EXPO#*FRAC#
3210 IF Abs(GBB#)<=1E-38 THEN GBB=0 :GOTO 3240
3220 GBB=SCLBB*GBB#/10^6
3230 '
3240 '
3250 PRINT #2 ,W,GBB
3251 W=W+0.25
3260 NEXT N
3270 CLOSE #2
3280 free(DD)
3281 free(DD#)
3282 free(DDD)
3290 END
Re: DimやGetの書き方
Posted: 2006年11月01日(水) 22:18
by 斉藤 圭佑
対応策を丁寧にアドバイスしていただき、ありがとうございます。
konisiさんが作成されたプログラムをこちらで編集せずそのまま走らせてみたのですが、実行画面は固まってしまい、ソース画面には
“スレッド(&HF64)でアクセス違反がありました(EPI=&H00402518)”
と表示が出てしまい実行ができませんでした。
また、konisiさんと7さんのアドバイスを元に自分なりにプログラムを作ってみました。
konisiさんと7さんのアドバイスのおかげでコンパイル時のエラーはなんとか消えたのですが、実行を行う際に実行画面が固まってしまいます。プログラムのどこかがおかしいのでしょうか。
具体的にどこがおかしいかも知れないというところが判らないので質問が漠然としてしまい申し訳ありません。
以下にプログラム上でOpenされるファイルと、MS-DOS上で正常に実行された場合に書き出されるデータをアップしています。
http://briefcase.yahoo.co.jp/bc/keisukk ... http%3a//b
自分なりに作成したプログラムソースです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#N88BASIC
1000 '****************************************************
1010 ' FFTANA.BAS
1020 '*
1030 '************************************************************
1040 DIM D(256) As Byte '型が合っているかどうか
'1041 DIM PNT As Double
1042 DIM X$ As String
1043 DIM Y$ As String
1044 DIM N As Long
1045 DIM M As Double
'1050 PNT=400 'PNTは何を意味するのか point?
1060 OPEN "DAT3-14.FRK" As #1 ' FILE NAME
1070 FIELD #1,128 ' DATA BUFFER
1080 Get #1,1,X$
1090 Get #1,1,Y$
1100 FOR N=1 TO 128
1120 D(N)=Asc(Mid$(X$,N,1))
1130 NEXT
1140 FOR N=1 TO 128
1160 D(N+128)=Asc(Mid$(Y$,N,1))
1170 NEXT
1180 Close #1
1190 GOTO 1210
1200 '
1210 '************ ADRESS OF<Gaa> DATA *******************
1211 DIM STBAA As Long
1212 DIM DTBAA As Long
1220 STBAA=D(147)*256+D(148) ' START BLOCK NO.
1230 DTBAA=(D(150)*256+D(151))*256+D(152) ' DATA1 BYTE NO.
1231 DIM X1 As Long
1232 DIM X2 As Long
1233 DIM X3 As Long
1234 DIM X4 As Long
1240 X1=D(153)
1241 X2=D(154)
1250 X3=D(155)
1251 X4=D(156)
1251 DIM SIGN As Double
1252 DIM EXPO1 As Double
1253 DIM EXPO# As Double
1254 DIM FRAC# As Double
1255 DIM SCL# As Double
1256 DIM RE As Double '1310行のREとRE#のこと.どちらかなのか両方定義するのかわからん
1257 DIM RE# As Double 'イマのところREとRE#を区別して両方定義している 2060参照 別の意味として扱ってるっぽい
1258 DIM SCLAA As Double
1260 SIGN=(-1)^((X1 AND 128)/128)
1270 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1280 EXPO#=2^EXPO1
1290 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1300 SCL#=SIGN*EXPO#*FRAC#
'1310 IF Abs(RE#)<=1E-38 THEN RE#=0
1320 SCLAA=SCL#/10^6
1330 GOTO 1350
1340 '
1350 '************* ADRESS OF <Gbb> DATA *****************
1351 DIM STBBB As Double
1352 DIM DTBBB As Double
1353 DIM SCLBB As Double
1360 STBBB=D(163)*256+D(164) ' START BLOCK NO.
1370 DTBBB=(D(166)*256+D(167))*256+D(168) ' DATA BYTE NO.
1380 '
1390 X1=D(169)
1391 X2=D(170)
1400 X3=D(171)
1401 X4=D(172)
1410 SIGN=(-1)^((X1 AND 128)/128)
1420 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
1430 EXPO#=2^EXPO1
1440 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
1450 SCL#=SIGN*EXPO#*FRAC#
'1460 IF Abs(RE#)<=1E-38 THEN RE=0 '上と同様のREとRE#について
1470 SCLBB=SCL#/10^6
1480 GOTO 1500
1490 '
1500 ' *********** ADRESS OF <Gbb> DATA ******************
1501 DIM STB As Double
1502 DIM DTB As Double
1503 DIM KK As Long
1504 DIM SCLAB As Double
1510 STB=D(179)*256+D(180) ' START BLOCK NO.
1520 DTB=(D(182)*256+D(183))*256+D(184) ' DATA3 BYTE NO.
1530 KK=2
1540 X1=D(185)
1541 X2=D(186)
1550 X3=D(187)
1551 X4=D(188)
1560 SIGN=(-1)^((X1 AND 128)/128)
1570 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127 'ANDの表現はこれでいいのか?
1580 EXPO#=2^EXPO1
1590 FRAC#=(X2 OR 128)/128*X3/(128*256)+X4/(128*256*256)
1600 SCL#=SIGN*EXPO#*FRAC#
'1610 IF Abs(RE#)<=1E-38 THEN RE=0 'RE#とREについて
1620 SCLAB=SCL#/10^6
1630 GOTO 1650
1640 '
1650 '
'1651 DIM ERASE As Double
1660 D(256)=0 '配列Dの消去という意味 やり方わからん
1670 '
1680 '
1690 '
1691 DIM LOOPe As Double 'LOOPで定義するのはよくないかも.色が変わってる
1692 DIM DTM As Long 'LOOPで定義するのはよくないかも.色が変わってる
1700 LOOPe=Int(DTB/256)+1
1710 DIM DD As *Double '()内をどう表現するか.文字はまずいらしい
1711 DD=calloc(SizeOf(Double)*(DTB+300))
1712 DD[0]=0.1
1713 DD[1]=0.2
1720 DIM BB(420) As Double
1730 DIM AF(420) As Double
1740 DIM AI(420) As Double
1741 DIM AR(420) As Double
1742 DIM I As Double
1750 OPEN "DAT3-14.FRK" As #1 'FILE NAME
1760 FIELD #1,128 'DATA BUFFER
'1760 FIELD #1,128 As X$ 'DATA BUFFER
'1761 FIELD #1,128 As Y$ 'DATA BUFFER
1770 FOR I=1 TO LOOPe 'LOOPを他の文字に変えて表現しなくていいのか?
1780 '
1790 GET #1,STB+I,X$ 'この辺から不安!!!!!!
1790 GET #1,STB+I,Y$
1800 FOR N=1 TO 128
1810 M=256*(I-1)+N
1820 DD(M)=Asc(Mid$(X$,N,1))
1830 NEXT
1840 FOR N=1 TO 128
1850 M=256*(I-1)+N+128
1860 DD(M)=Asc(Mid$(Y$,N,1))
1870 NEXT
1880 NEXT 'この辺まで不安!!!!!!
1890 CLOSE #1
1900 '
1910 '
1911 DIM P As Long
1712 DIM W As Long
1713 DIM S As Long
1714 DIM REAB As Double
1920 OPEN "DAT-GAB.DAT" FOR OUTPUT As #2
1930 P=KK*4
1940 W=0
1950 S=0
1960 FOR N=1 TO DTB STEP P
1970 X1=DD(N)
1971 X2=DD(N+1)
1980 X3=DD(N+2)
1981 X4=DD(N+3)
1990 '
2000 SIGN=(-1)^((X1 AND 128)/128)
2010 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2020 EXPO#=2^EXPO1
2030 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2040 RE#=SIGN*EXPO#*FRAC#
2050 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2090 'この辺から不安!!!!!
2060 RE#=RE/10^6
2070 REAB=RE*SCLAB 'この辺まで不安!!!!!!
2080 '
2090 '
2100 '
2101 DIM X5 As Long
2102 DIM X6 As Long
2103 DIM X7 As Long
2104 DIM X8 As Long
2105 DIM IM As Double
2106 DIM IM# As Long
2107 DIM IMAB As Double
2108 DIM R As Double
2109 DIM CISO As Double
2110 X5=DD(N+4)
2111 X6=DD(N+5) ' IMAG DATA READ
2120 X7=DD(N+6)
2121 X8=DD(N+7)
2130 SIGN=(-1)^((X5 AND 128)/128)
2140 EXPO1=((X5 AND 127)*2+(X6 AND 128)/128)-127
2150 EXPO#=2 ^ EXPO1
2160 FRAC#=(X6 OR 128)/128+X7/(128*256)+X8/(128*256*256)
2170 IM#=SIGN*EXPO#*FRAC#
2180 IF Abs(IM#)<=1E-38 THEN IM=0 :GOTO 2240 'この辺から不安!!!!!!!
2190 IM=IM#/10^6
2200 IMAB=IM*SCLAB
2210 R=Sqr(RE*RE+IM*IM)
2220 AI(S)=IM
2221 AR(S)=RE
2230 CISO=IM/RE
2231 AF(S)=180/3.1415*Atn(CISO)
2232 BB(S)=R 'この辺まで不安!!!!!!!!
2233 '
2234 '
2235 '
2236 '
2237 '
2240 S=S+1
2250 PRINT #2 ,W,REAB,IMAB
2260 W=W+0.25
2270 NEXT N
2280 CLOSE #2
2290 '
2300 '
2310 LOOPe=Int(DTBAA/256)+1 'この辺から不安!!!!!!
'2320 DIM DD#(DTBAA+300) As Double
2321 DIM DD# As *Double
2322 DD#=calloc(SizeOf(Double)*(DTBAA+300))
2323 DD#[0]=0.1
2324 DD#[1]=0.2
2330 DIM BB#(420) As Long
'2340 DD#=calloc(DTBAA+300)
2350 OPEN "DAT3-14.FRK" As #1
2360 FIELD #1,128
'2360 FIELD #1,128 AS X$
'2361 FIELD #1,128 AS Y$
2370 FOR I=1 TO LOOPe
2380 '
2390 GET #1,STBAA+I,X$
2390 GET #1,STBAA+I,Y$
2400 FOR N=1 TO 128
2410 M=256*(I-1)+N
2420 DD#(M)=Asc(Mid$(X$,N,1))
2430 NEXT
2440 FOR N=1 TO 128
2450 M=256*(I-1)+N+128
2460 DD#(M)=Asc(Mid$(Y$,N,1)) 'この辺まで不安!!!!!!
2470 NEXT
2480 '
2490 NEXT
2500 '
2510 CLOSE #1
2520 OPEN "DAT-GAA.DAT" FOR OUTPUT As #2
2530 '
2540 S=0
2550 W=0
2560 P=4
2570 FOR N=1 TO DTBAA STEP P
2580 X1=DD#(N) :X2=DD#(N+1)
2590 X3=DD#(N+2) :X4=DD#(N+3)
2600 SIGN=(-1)^((X1 AND 128)/128)
2610 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
2620 EXPO#=2^EXPO1
2630 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
2640 RE#=SIGN*EXPO#*FRAC#
2650 IF Abs(RE#)<=1E-38 THEN RE=0 :GOTO 2700
2660 RE=RE#/10^6 'この辺のREの区別が不安!!!!!!
2661 DIM GAA As Double
2670 GAA=SCLAA*RE
2680 BB#(S)=1/RE
2690 S=S+1
2700
2710 PRINT #2 ,W,GAA
2720 W=W+0.25
2730 NEXT N
2740 '
2750 CLOSE #2
2760 '
2761 DIM GAI As Double
2762 DIM GAIN As Double
2763 DIM GAINY As Double
2764 DIM GAINN As Double
2765 DIM GAIN# As Double
2766 DIM FASE As Double
2770 OPEN "GAIN.DAT" FOR OUTPUT As #2
2780 W=0.25
2790 FOR S=1 TO 400
2800 GAI=BB(S)*BB#(S)
2810 GAIN=Log(GAI)
2820 GAINY=Log(10)
2830 GAINN=GAIN/GAINY
2840 GAIN#=20*GAINN
2841 FASE=AF(S)
2842 IF AR(S)>0 AND AI(S)>0 THEN FASE=FASE 'この辺から不安!!!!!
2843 IF AR(S)>0 AND AI(S)<0 THEN FASE=FASE
2844 IF AR(S)<0 AND AI(S)<0 THEN FASE=FASE-180
2845 IF AR(S)<0 AND AI(S)>0 THEN FASE=FASE+180 'この辺まで不安!!!!!
2850 PRINT #2,W,GAIN#,FASE
2860 W=W+0.25
2870 NEXT S
2880 CLOSE #2
2900 '
2910 '
2920 LOOPe=Int(DTBBB/256)
2930 DIM DDD As *Double
2931 DDD=calloc(SizeOf(Double)*(DTBBB+300))
2932 DDD[0]=0.1
2933 DDD[1]=0.2
'2940 DDD=calloc(DTBBB+300)
2950 OPEN "DAT3-14.FRK" As #1 'この辺から不安!!!!!
2960 FIELD #1,128
'2960 FIELD #1,128 AS X$
'2961 FIELD #1,128 AS Y$
2970 FOR I=1 TO LOOPe
2980 '
2990 GET #1,STBBB+I,X$
2991 GET #1,STBBB+I,Y$
3000 FOR N=1 TO 128
3010 M=256*(I-1)+N
3020 DDD(M)=Asc(Mid$(X$,N,1))
3030 NEXT
3040 FOR N=1 TO 128
3050 M=256*(I-1)+N+128
3060 DDD(M)=Asc(Mid$(Y$,N,1)) 'この辺まで不安!!!!!
3070 NEXT
3080 '
3090 NEXT
3100 CLOSE #1
3110 '
2930 DIM GBB# As Double
2930 DIM GBB As Double
3111 OPEN "DAT-GBB.DAT" FOR OUTPUT As #2
3112 '
3113 W=0
3120 P=4
3130 FOR N=1 TO DTBBB STEP P
3140 X1=DDD(N)
3141 X2=DDD(N+1)
3150 X3=DDD(N+2)
3151 X4=DDD(N+3)
3160 SIGN=(-1)^((X1 and 128)/128)
3170 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
3180 EXPO#=2^EXPO1
3190 FRAC#=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
3200 GBB#=SIGN*EXPO#*FRAC#
3210 IF Abs(GBB#)<=1E-38 THEN GBB=0 :GOTO 3240
3220 GBB=SCLBB*GBB#/10^6
3230 '
3240 '
3250 PRINT #2 ,W,GBB
3251 W=W+0.25
3260 NEXT N
3270 CLOSE #2
3280 free(DD)
3281 free(DD#)
3282 free(DDD)
3290 END
すいません。
Posted: 2006年11月01日(水) 22:22
by 斉藤圭佑
同じ内容を3回も送信してしまいました。
また、ログインせずに送信してしまったので名前の下に“ゲスト”がついてしまいました。
以後気をつけます。
Posted: 2006年11月02日(木) 20:00
by konisi
変数名の直後に#や%、$を付ける事があるのは変数の型を識別するためのもので、RE#とREをAB上で区別する必要は無いはずです。
追伸
こちらでは(自分で書いた側の物は)正常に動いてますが・・・?
OS:WinXP SP2 Home
CPU:Intel Pentium D 3.0GHz
BIOS:FUJITSU製
Shell:Explorer
Posted: 2006年11月02日(木) 21:41
by 斉藤圭佑
私の方でも確認しましたが、AB上でREとRE#は区別する必要はありませんでした。失礼しました。
konisiさんの作成されたプログラムをこちらで走らせてみたところ、確かにエラーもなく正常に動作します。
しかし、元のプログラムであったBASICで実行させて書き出された結果と、
BASICを書き換えたActiveBasicで実行させて書き出された結果とが違ってしまいます。こちらで調査しているのですがなかなか解決の糸口が見つかりません。
BASIC上で実行させて書き出された結果は、前回投稿した際にリンクを貼ったものと同じですが、以下にアップします。
http://briefcase.yahoo.co.jp/bc/keisukk ... http%3a//b
また、X領域とY領域にの割り当てについてですが、過去に書いた人のプログラム説明を見るとX、Y両方とも必要な感じがするのですが。。。
以下に今回のプログラムをBASICで書いた人が書いたプログラム説明の一部を示します。
1060~1070 行
実験データの記録されたランダムファイル”DAT3-14.FRK”をオープンし,ランダムファイル用バッファ# 1 の設定を行う.領域X$に128byte を割り当て,領域Y$に128byte を割り当てる.
1090~1180 行
ランダムファイル用バッファ# 1 に読み込ませた実験データを配列D へ書き込む. ループを128 ずつに分割するのは,スケールファクタ算出プログラムと同様,ヘッダーブロックと拡張ヘッダーブロックに分割するためである.ヘッダーブロックの大きさは128byte で固定されており,配列D(1)~D(128) には領域X$のデータが読み込まれ,ヘッダーブロックの情報が読み込まれる.また,拡張ヘッダファイルの情報は,領域Y$に書き込まれた128byte の情報となり,配列D(129)~D(256) に読み込まれる.
Posted: 2006年11月14日(火) 18:54
by マティ
斉藤圭佑さん問題は解決しましたか?
まだ、問題を抱えているのなら、変数の定義をもう一度見直してください。
あと、リンクを張ったデータで元データと変換後のデータは同一のものでしょうか?
(こちらでうまくいかないので質問しました)
ここからは技術補足
konisi さんが書きました:変数名の直後に#や%、$を付ける事があるのは変数の型を識別するためのもので、RE#とREをAB上で区別する必要は無いはずです。
ActiveBasicでは、変数定義時に
#,%,$の意味は無く
ただの変数名として認識します。
しかし、マイクロソフト系のBasicでは、#,%,$にも変数の定義の意味があります。
たとえば
コード: 全て選択
Dim D$
D ="Test Data"
Print D$
と
コード: 全て選択
Dim D As String
D$="Test Data"
Print D
は同じ結果になりますが、ActiveBasicでは
変数が無いためコンパイルエラーになります。
結果的には、
コード: 全て選択
Dim D As String
Dim D$ As String
D$="Test Data"
Print D
と変数を定義してコンパイルエラーを取りますが
変数
D$に文字列を設定しているので、変数
DをPrintしても何も表示されません!
このような、重複宣言がたくさんありますので、答えが一致しないと思われます。
Posted: 2006年11月14日(火) 20:26
by 斉藤圭佑
マティさん
残念ながら未だ問題は解決できていません。
マティさんのアドバイス通り、変数の定義から確認してみます。
また、リンクを貼ったデータ
「DAT3-14.FRK」 : 入力ファイル
「DAT-GAA.DAT」 : 出力ファイル
「DAT-GAB.DAT」 : 出力ファイル
「DAT-GBB.DAT」 : 出力ファイル
「GAIN.DAT」 : 出力ファイル
についてですが、こちらは全てPC9821Xn(MS-DOS上)のN88BASICで走らせた正しいデータです。
このデータと同様のものをDOS/V上のABで出力したいのですが。。。
未だ出力ファイル「DAT-GAA.DAT」、「DAT-GAB.DAT」、「DAT-GBB.DAT」、「GAIN.DAT」全て正しいデータと一致していない状態です。
現在、手立てとして考えているのは
コード: 全て選択
Open "DAT3-14.FRK" As #1
Field #1,256
Get #1,,X$
For N=1 To 256
D(N)=Asc(Mid$(X$,N,1))
Next
の部分を
コード: 全て選択
Open "DAT3-14.FRK" As #1
Field #1,128
Get #1,1,X$
Get #1,2,Y$
For N=1 To 128
D(N)=Asc(Mid$(X$,N,1))
Next
For N=1 To 128
D(N)=Asc(Mid$(Y$,N,1))
Next
のようにX$領域とY$領域で分けて表現するところは分けて記述して試しているところです。
X$領域にはD(1)~D(128)、Y$領域にはD(129)~D(256)と割り振るとN88BASICで作成した者の資料に書いてあったのでその通りにしようと思っているのですが、そもそもこの書き方であってるのかも不安です。
Posted: 2006年11月16日(木) 00:02
by ar
昨日、マティさんが確認しておられますが、本当に「DAT-GAB.DAT」は正しいものなのでしょうか?
プログラムを見ると、GABのデータ部分は「DAT3-14.FRK」の&h1B00から始まっているのだと思います。
また、該当箇所を実部と虚部の2変数で各4byteづつ読み込んでいるものと思います。
そこで実際に「DAT3-14.FRK」を見ると、
&h1B00~&h1B07が、&h00000000と&h00000000で、両変数とも0。
&h1B08~&h1B0Fが、&hC5C3A3AEと&hC6194685で、両変数とも負の値になり、SCLABを掛けたとしても最低同符号になるはずではないでしょうか。
ところが「DAT-GAB.DAT」ではw=0.25の値は正と負の数の異符号になっており、アップされたものが異なっているのではないかと思う次第です。
Posted: 2006年11月16日(木) 17:51
by マティ
私も
arさんと同じ見解です。
斉藤圭佑さん、N88BASICに以下の文を追加してサンプルファイルを作成していただけませんか?
コード: 全て選択
Print #2,Hex$(X1) & Hex$(X2) & Hex$(X3) & Hex$(X4)
Print #2,Hex$(X5) & Hex$(X6) & Hex$(X7) & Hex$(X8)
追加するのは、既存の
Print #2の直前にお願いします。
Re: DimやGetの書き方
Posted: 2006年11月17日(金) 23:37
by 河川屋
元プログラムがQuickBasicかN88BasicかFBasicかによって動きが変わります。
> プログラムの内容の概要は「バイナリデータをテキストデータに変換する」
まず、この部分が問題です。
バイナリデータとは、当然数値データとすると、
どこが整数でどこが実数か。また、実数バイナリとして、内部表現はどうなっているか?
これがわからないことには何もできません。
※ちなみに、実数で可能性があるのは、
・IEEE754形式(QuickBasic)
・MBFバイナリ(本家N88Basic,GW-BASIC)
・MBFバイナリモトローラ形式(F-basic。MBFバイナリとバイト順が逆。)
以上、どれですか?
いずれにせよ、まず文字型から数値型へ自力変換しないことにはどうにもなりません。
> 1260 SIGN=(-1)^((X1 AND 128)/128)
> 1270 EXPO1=((X1 AND 127)*2+(X2 AND 128)/128)-127
> 1280 EXPO=2^EXPO1
> 1290 FRAC=(X2 OR 128)/128+X3/(128*256)+X4/(128*256*256)
> 1300 SCL=SIGN*EXPO*FRAC
これが文字型から数値型へ自力変換する部分にあたり、バイナリ形式により式が変わり、
IEEE754の場合:(非正規数には対応していない。)
SIGN=(-1)^((X4 AND 128)/128)
EXPO1=((X4 AND 127)*2+(X3 AND 128)/128)-127
EXPO=2^EXPO1
FRAC=1+(X3 AND 127)/128+X2/(128*256)+X1/(128*256*256)
SCL=SIGN*EXPO*FRAC
MBFバイナリの場合:
SIGN=(-1)^((X3 AND 128)/128)
EXPO1=X4-129
EXPO=2^EXPO1
FRAC=1+(X3 AND 127)/128+X2/(128*256)+X1/(128*256*256)
SCL=SIGN*EXPO*FRAC
F-BASIC(モトローラ流のMBFバイナリ)の場合:
SIGN=(-1)^((X2 AND 128)/128)
EXPO1=X1-129
EXPO=2^EXPO1
FRAC=1+(X2 AND 127)/128+X3/(128*256)+X4/(128*256*256)
SCL=SIGN*EXPO*FRAC
のいずれかになる可能性が高いです。これで動く保証は無いけど。
※式のチェックは、QuickBqsic(PC9801用)で行なったものであり、
ActiveBasicでチェックしたわけではない。
> 1060 OPEN "DAT3-14.FRK" As #1 ' FILE NAME
QuickBasicなどでは、
OPEN "R",#1,"DAT3-14.FRK",256 または
OPEN "DAT3-14.FRK" AS #1 LEN=256
とすれば、任意のレコード長のランダムファイルがOPENできる。デフォは256。
N88Basicは256Byte固定。(正確には、basic起動時に指定可能。)
ActiveVasicはマニュアル見てもワケわかんない。
まず、output/input等を指定しないときはオールアクセス可とあって、ランダムとは書かれていない
ため、どう動くのか不明。で、レコード長の指定方法不明、デフォの長さも未記載。
> 1070 FIELD #1,128 As X$ ' DATA BUFFER
> 1071 FIELD #1,128 As Y$
QuickBasic、N88Basic、FBasic共通で、こう書いた場合の意味は、
レコード長の最初の128byteにX$を割り当てる。
レコード長の最初の128byteにY$を割り当てる。
となるから、結局、 X$とY$には同じ領域が割り当てられる。
以上より、下記のような割付も可能となる。
FIELD #1,4 as X$(1)
FOR I=2 TO 32
FIELD #1,(I-1)*4 AS DUMMY$,4 as X$(I)
NEXT
これで、X$(i)に4byteきざみでバッファが割り当てられる。
追記 コレは、元プログラムでは
FIELD #1,128 AS X$,128 AS Y$
と、1行に書かれていたものと思われる。
(N88BASICの最大文字列長は255Biteなので、どうしても2変数が必要となる。)
ActiveVasicのマニュアルには、
Field #filenumber, fieldbyte
とあり、変数名をどうやって割り当てるのか書かれていない。
(ひっとすると、fieldbyteがレコード長と対応し、
GET #1,recode,StrBuffer のStrBufferがFieldに割り当てる変数?
じゃあFieldに複数の変数を割り当てたい場合は構造体を使う?
このへん、マニュアル不備です! マニュアル&サンプルがあまりに酷いので実験する気力なし。)
結論:
この手のプログラムを組むには、QuickBasicが便利。(WIN95に英語版が入っているから入手は困難ではないはず。)
MBFバイナリ、IEEE754のどちらも数値に変換する関数を持っているため。
ActiveBasicにはバイナリ-数値の変換関数は存在せず。
(IEEE754なら、GETWORDで単精度変数に強引に送り込めば何とかなりそうだが、マナー悪すぎのためやめたほうがいいと思う。)