作成者 |
メッセージ |
|
|
まだCランタイムが活用できることを知らず、必死に解析してみたプログラムです(^^;;
一番環境依存がない方法ですが(何
まだCランタイムが活用できることを知らず、必死に解析してみたプログラムです(^^;; 一番環境依存がない方法ですが(何
|
|
|
投稿記事 |
Posted: 2006年3月22日(水) 09:06 |
|
|
|
|
|
そういえば以前,hiraさんが指数表記対応のVal関数を作っていましたね。 http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=59
|
|
|
投稿記事 |
Posted: 2006年3月22日(水) 04:29 |
|
|
|
|
|
暫く原因追求に時間掛けたいと思います。
暫く原因追求に時間掛けたいと思います。
|
|
|
投稿記事 |
Posted: 2006年3月09日(木) 20:40 |
|
|
|
|
|
当方では動いていますが…?
[pi2.txt] ※先頭の100文字を掲載 引用: 1374434982318249156264890559526526067884534604486953489875501431771358666686881098662314438189063612…
[dat2.txt] 引用: 0 1575 9.613037109375%
1 1711 10.443115234375%
2 1630 9.94873046875%
3 1649 10.064697265625%
4 1655 10.101318359375%
5 1606 9.80224609375%
6 1661 10.137939453125%
7 1641 10.015869140625%
8 1617 9.869384765625%
9 1639 10.003662109375%
この結果でいいでしょうか?
Ver 4.22.00 Windows XP Home (SP2) で確認。
※無修正function.sbpでも問題なし。
当方では動いていますが…?
[pi2.txt] ※先頭の100文字を掲載[quote]1374434982318249156264890559526526067884534604486953489875501431771358666686881098662314438189063612…[/quote] [dat2.txt][quote]0 1575 9.613037109375% 1 1711 10.443115234375% 2 1630 9.94873046875% 3 1649 10.064697265625% 4 1655 10.101318359375% 5 1606 9.80224609375% 6 1661 10.137939453125% 7 1641 10.015869140625% 8 1617 9.869384765625% 9 1639 10.003662109375% [/quote] この結果でいいでしょうか? Ver 4.22.00 Windows XP Home (SP2) で確認。 ※無修正function.sbpでも問題なし。
|
|
|
投稿記事 |
Posted: 2006年3月09日(木) 19:35 |
|
|
|
|
|
一応、4.13に格下げして対処してますが、4.22においてファイル内容が読み込まれません。
デバック実行にて確認。
コード:
'外部ファイル:pi1.txt,約16KB,内容・・・数列
#console
Dim FileName$ As String,OutFileName$ As String,OFN2$ As String
Dim A$ As String,A As Long,B As Long,C As Long
Dim D(9) As Long
Dim I As Long,J As Long
FileName$="pi1.txt"
OutFileName$="pi2.txt"
OFN2$="dat2.txt"
Open FileName$ As #1
Open OutFileName$ As #2
Field #1,1
Field #2,1
Do
debug
Get #1,I,A$
debug
B=A
A=Val(A$)
C=(A-B+10) Mod 10
A$=Str$(C)
Put #2,I,A$
D(C)=D(C)+1
J=J+1
if Eof(1)=-1 then exit Do
Loop
Close #1
Close #2
Open OFN2$ For Output As #1
For I=0 To 9
A$=Str$(I)+" "+Str$(D(I))+" "+Str$(D(I)/J*100)+"%"
Print #1,A$
Next I
Close #1
Print "END"
Sleep(5000)
End
pi1.txt
一応、4.13に格下げして対処してますが、4.22においてファイル内容が読み込まれません。 デバック実行にて確認。 [code] '外部ファイル:pi1.txt,約16KB,内容・・・数列 #console Dim FileName$ As String,OutFileName$ As String,OFN2$ As String Dim A$ As String,A As Long,B As Long,C As Long Dim D(9) As Long Dim I As Long,J As Long FileName$="pi1.txt" OutFileName$="pi2.txt" OFN2$="dat2.txt" Open FileName$ As #1 Open OutFileName$ As #2 Field #1,1 Field #2,1 Do debug Get #1,I,A$ debug B=A A=Val(A$) C=(A-B+10) Mod 10 A$=Str$(C) Put #2,I,A$ D(C)=D(C)+1 J=J+1 if Eof(1)=-1 then exit Do Loop Close #1 Close #2 Open OFN2$ For Output As #1 For I=0 To 9 A$=Str$(I)+" "+Str$(D(I))+" "+Str$(D(I)/J*100)+"%" Print #1,A$ Next I Close #1 Print "END" Sleep(5000) End[/code] [url=http://web1.nazca.co.jp/himajinn13sei/pi1.txt]pi1.txt[/url]
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 23:07 |
|
|
|
|
|
ただこの方法に問題がないかといえば「ない」と100%言い切れるものではありません。
例えば、指数を読み込むようなプログラムのソースを配布すると、(バージョンアップで修正されたとしても)ActiveBasicのバージョンによってはどうしても正しく動かないことが出てきてしまいます。
また、Win64になるとCランタイムがどうなるかわかりません(DLLのファイル名・仕様etc...)。
ただ、sscanfは16進数や8進数にも対応しており、
コード: sscanf("755","%o",VarPtr(i)) '8進数 755 を10進数に変換
とか
コード: sscanf("1000","%x",VarPtr(i)) '16進数 1000 を10進数に変換
というコードも書けてしまいます(iはLong型の変数)。
そうなると、実質Val関数は内部でsscanfを呼び出せば済む話になってしまいます…。
このことはStr$にもいえて、こちらはsprintfという関数(Cランタイム)を呼び出せばそれで解決します(小数がいらない場合は標準定義のwsprintfでもできます)。
やっぱりCランタイムなんて邪道ですかね?>山本さん
>konisiさん
Get #はどのような不具合があるのでしょう?ひょっとしたらVal関数のように修正ができるかもしれません。
ただこの方法に問題がないかといえば「ない」と100%言い切れるものではありません。 例えば、指数を読み込むようなプログラムのソースを配布すると、(バージョンアップで修正されたとしても)ActiveBasicのバージョンによってはどうしても正しく動かないことが出てきてしまいます。 また、Win64になるとCランタイムがどうなるかわかりません(DLLのファイル名・仕様etc...)。 ただ、sscanfは16進数や8進数にも対応しており、 [code]sscanf("755","%o",VarPtr(i)) '8進数 755 を10進数に変換[/code] とか [code]sscanf("1000","%x",VarPtr(i)) '16進数 1000 を10進数に変換[/code] というコードも書けてしまいます(iはLong型の変数)。 そうなると、実質Val関数は内部でsscanfを呼び出せば済む話になってしまいます…。 このことはStr$にもいえて、こちらはsprintfという関数(Cランタイム)を呼び出せばそれで解決します(小数がいらない場合は標準定義のwsprintfでもできます)。
やっぱりCランタイムなんて邪道ですかね?>山本さん
>konisiさん Get #はどのような不具合があるのでしょう?ひょっとしたらVal関数のように修正ができるかもしれません。
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 21:05 |
|
|
|
|
|
hiraさん、すばらしい。抜本的解決策です。
可変長を対象にも、ソース無修正で期待通り機能しました。
次回リリースではそのとおり修正されるのではないでしょうか?作者様(^^;
投稿No.09でのソースに対する出力
---OUT---
0.0010001
0.0020002
0.0030003
0.0040004
0.0010001
0.0020002
0.0030003
0.0010001
0.0020002
0.0010001
hiraさん、すばらしい。抜本的解決策です。
可変長を対象にも、ソース無修正で期待通り機能しました。 次回リリースではそのとおり修正されるのではないでしょうか?作者様(^^;
投稿No.09でのソースに対する出力 ---OUT--- 0.0010001 0.0020002 0.0030003 0.0040004 0.0010001 0.0020002 0.0030003 0.0010001 0.0020002 0.0010001
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 20:27 |
|
|
|
|
|
Val関数を編集すれば、INPUT #の問題もValの問題も一度に解決です(^^;
Include\basic\function.sbp について
1. sscanfの定義をファイル先頭辺りに追加する。
定義は私が投稿した通りです。
2. 818行目あたり「Else」~「End If」の中を削除し
そこに sscanf(buf,"%lf",VarPtr(Val)) の1行を入力する。
一時しのぎではありますが…。
元のファイルをバックアップした方がいいかもしれません。
Val関数を編集すれば、INPUT #の問題もValの問題も一度に解決です(^^; Include\basic\function.sbp について
1. sscanfの定義をファイル先頭辺りに追加する。 定義は私が投稿した通りです。
2. 818行目あたり「Else」~「End If」の中を削除し そこに sscanf(buf,"%lf",VarPtr(Val)) の1行を入力する。
一時しのぎではありますが…。 元のファイルをバックアップした方がいいかもしれません。
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 18:19 |
|
|
|
|
|
余談ですが、Get #関数もうまく機能していないようです。
余談ですが、Get #関数もうまく機能していないようです。
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 15:54 |
|
|
|
|
|
Val()も指数表記不可。仮数部のみの実数として解釈される
AB 4.22.00
第一希望は、ABを修正されることをですが、
第二希望は、INPUTと置換可能な関数の定義
他の方は、必要性を感じていないのでしょうか。
Basicを使うのは、過去の資産の活用ではないのかな?
ご意見は大変ありがたいのですが
要望多ならみんなで声を大にして、ABを修正してもらった方が
ソースがすっきりするのですが。。。
Val()も指数表記不可。仮数部のみの実数として解釈される AB 4.22.00
第一希望は、ABを修正されることをですが、 第二希望は、INPUTと置換可能な関数の定義
他の方は、必要性を感じていないのでしょうか。 Basicを使うのは、過去の資産の活用ではないのかな?
ご意見は大変ありがたいのですが 要望多ならみんなで声を大にして、ABを修正してもらった方が ソースがすっきりするのですが。。。
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 14:37 |
|
|
|
|
|
String型で読み込んでVal関数使ったらどうなる?
String型で読み込んでVal関数使ったらどうなる?
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 10:40 |
|
|
|
|
|
hiraさん、すばらしい方法ですね。
ちょっと欲を言って、
INPUTとの代替には柔軟な可変長対策が必要なのです。
対応策はないでしょうか
IN側は、1行に含まれる数値の個数が変化
IN作成側を修正するのは、困難
---P2.BAS---
#prompt
10 DIM X As DOUBLE
30 OPEN "IN" FOR INPUT AS #1
40 OPEN "OUT" FOR OUTPUT AS #2
50 WHILE NOT Eof(1)
60 INPUT #1,X
70 PRINT #2,X
80 WEND
90 END
---IN---
1.0001e-03 2.0002e-03 3.0003e-03 4.0004e-03
1.0001e-03 2.0002e-03 3.0003e-03
1.0001e-03 2.0002e-03
1.0001e-03
---OUT---
1.0001
2.0002
3.0003
4.0004
1.0001
2.0002
3.0003
1.0001
2.0002
1.0001
hiraさん、すばらしい方法ですね。
ちょっと欲を言って、 INPUTとの代替には柔軟な可変長対策が必要なのです。 対応策はないでしょうか
IN側は、1行に含まれる数値の個数が変化 IN作成側を修正するのは、困難
---P2.BAS--- #prompt 10 DIM X As DOUBLE 30 OPEN "IN" FOR INPUT AS #1 40 OPEN "OUT" FOR OUTPUT AS #2 50 WHILE NOT Eof(1) 60 INPUT #1,X 70 PRINT #2,X 80 WEND 90 END
---IN--- 1.0001e-03 2.0002e-03 3.0003e-03 4.0004e-03 1.0001e-03 2.0002e-03 3.0003e-03 1.0001e-03 2.0002e-03 1.0001e-03
---OUT--- 1.0001 2.0002 3.0003 4.0004 1.0001 2.0002 3.0003 1.0001 2.0002 1.0001
|
|
|
投稿記事 |
Posted: 2006年3月07日(火) 09:54 |
|
|
|
|
|
一時的にこのような方法を使うこともできます。
コード: #prompt
Declare Function sscanf CDECL Lib "crtdll" (lpString As *Char,lpFormat As *Char,...) As Long
10 DIM X As DOUBLE,S$
30 OPEN "IN" FOR INPUT AS #1
40 OPEN "OUT" FOR OUTPUT AS #2
50 INPUT #1,S$
60 sscanf(S$,"%lf",VarPtr(X))
70 PRINT #2,X
80 END
※Input文の認識部分もこの関数を使えば一発なんですけどね…。
※Cランタイムの関数を使うとは反則か?
一時的にこのような方法を使うこともできます。
[code]#prompt Declare Function sscanf CDECL Lib "crtdll" (lpString As *Char,lpFormat As *Char,...) As Long 10 DIM X As DOUBLE,S$ 30 OPEN "IN" FOR INPUT AS #1 40 OPEN "OUT" FOR OUTPUT AS #2 50 INPUT #1,S$ 60 sscanf(S$,"%lf",VarPtr(X)) 70 PRINT #2,X 80 END[/code]
※Input文の認識部分もこの関数を使えば一発なんですけどね…。 ※Cランタイムの関数を使うとは反則か?
|
|
|
投稿記事 |
Posted: 2006年3月06日(月) 22:34 |
|
|
|
|
|
popopoです。
AB4は、過去の資産活用に大変有用で感謝しております。
さて、不具合報告です。
不具合1. INPUT,INPUT #の指数表記読込み不可
1.2345e-003等が、1.2345と解釈される。
過去の資産活用のため、修正して頂ければ幸いです。
--P.BAS--
#prompt
10 DIM X As DOUBLE
30 OPEN "IN" FOR INPUT AS #1
40 OPEN "OUT" FOR OUTPUT AS #2
50 INPUT #1,X
60 PRINT #2,X
70 END
--IN--
1.2345e-03
--OUT--
1.2345
使用環境
windows2000sp4
AB 4.22.00
popopoです。 AB4は、過去の資産活用に大変有用で感謝しております。
さて、不具合報告です。 不具合1. INPUT,INPUT #の指数表記読込み不可 1.2345e-003等が、1.2345と解釈される。
過去の資産活用のため、修正して頂ければ幸いです。
--P.BAS-- #prompt 10 DIM X As DOUBLE 30 OPEN "IN" FOR INPUT AS #1 40 OPEN "OUT" FOR OUTPUT AS #2 50 INPUT #1,X 60 PRINT #2,X 70 END
--IN-- 1.2345e-03
--OUT-- 1.2345
使用環境 windows2000sp4 AB 4.22.00
|
|
|
投稿記事 |
Posted: 2006年3月06日(月) 10:16 |
|
|
|
|