INPUT,INPUT #の指数表記読込み不可
-
- 記事: 4
- 登録日時: 2006年2月20日(月) 10:12
INPUT,INPUT #の指数表記読込み不可
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
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
-
- 記事: 203
- 登録日時: 2005年5月31日(火) 20:14
- お住まい: 兵庫県
Re: INPUT,INPUT #の指数表記読込み不可
一時的にこのような方法を使うこともできます。
※Input文の認識部分もこの関数を使えば一発なんですけどね…。
※Cランタイムの関数を使うとは反則か?
コード: 全て選択
#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
※Cランタイムの関数を使うとは反則か?
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
-
- 記事: 4
- 登録日時: 2006年2月20日(月) 10:12
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
ちょっと欲を言って、
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
-
- 記事: 893
- 登録日時: 2005年7月25日(月) 13:27
- お住まい: 埼玉県東松山市
String型で読み込んでVal関数使ったらどうなる?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
-
- 記事: 4
- 登録日時: 2006年2月20日(月) 10:12
-
- 記事: 893
- 登録日時: 2005年7月25日(月) 13:27
- お住まい: 埼玉県東松山市
余談ですが、Get #関数もうまく機能していないようです。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
-
- 記事: 203
- 登録日時: 2005年5月31日(火) 20:14
- お住まい: 兵庫県
Val関数を編集すれば、INPUT #の問題もValの問題も一度に解決です(^^;
Include\basic\function.sbp について
1. sscanfの定義をファイル先頭辺りに追加する。
定義は私が投稿した通りです。
2. 818行目あたり「Else」~「End If」の中を削除し
そこに sscanf(buf,"%lf",VarPtr(Val)) の1行を入力する。
一時しのぎではありますが…。
元のファイルをバックアップした方がいいかもしれません。
Include\basic\function.sbp について
1. sscanfの定義をファイル先頭辺りに追加する。
定義は私が投稿した通りです。
2. 818行目あたり「Else」~「End If」の中を削除し
そこに sscanf(buf,"%lf",VarPtr(Val)) の1行を入力する。
一時しのぎではありますが…。
元のファイルをバックアップした方がいいかもしれません。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
-
- 記事: 4
- 登録日時: 2006年2月20日(月) 10:12
-
- 記事: 203
- 登録日時: 2005年5月31日(火) 20:14
- お住まい: 兵庫県
ただこの方法に問題がないかといえば「ない」と100%言い切れるものではありません。
例えば、指数を読み込むようなプログラムのソースを配布すると、(バージョンアップで修正されたとしても)ActiveBasicのバージョンによってはどうしても正しく動かないことが出てきてしまいます。
また、Win64になるとCランタイムがどうなるかわかりません(DLLのファイル名・仕様etc...)。
ただ、sscanfは16進数や8進数にも対応しており、
とか
というコードも書けてしまいます(iはLong型の変数)。
そうなると、実質Val関数は内部でsscanfを呼び出せば済む話になってしまいます…。
このことはStr$にもいえて、こちらはsprintfという関数(Cランタイム)を呼び出せばそれで解決します(小数がいらない場合は標準定義のwsprintfでもできます)。
やっぱりCランタイムなんて邪道ですかね?>山本さん
>konisiさん
Get #はどのような不具合があるのでしょう?ひょっとしたらVal関数のように修正ができるかもしれません。
例えば、指数を読み込むようなプログラムのソースを配布すると、(バージョンアップで修正されたとしても)ActiveBasicのバージョンによってはどうしても正しく動かないことが出てきてしまいます。
また、Win64になるとCランタイムがどうなるかわかりません(DLLのファイル名・仕様etc...)。
ただ、sscanfは16進数や8進数にも対応しており、
コード: 全て選択
sscanf("755","%o",VarPtr(i)) '8進数 755 を10進数に変換
コード: 全て選択
sscanf("1000","%x",VarPtr(i)) '16進数 1000 を10進数に変換
そうなると、実質Val関数は内部でsscanfを呼び出せば済む話になってしまいます…。
このことはStr$にもいえて、こちらはsprintfという関数(Cランタイム)を呼び出せばそれで解決します(小数がいらない場合は標準定義のwsprintfでもできます)。
やっぱりCランタイムなんて邪道ですかね?>山本さん
>konisiさん
Get #はどのような不具合があるのでしょう?ひょっとしたらVal関数のように修正ができるかもしれません。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
-
- 記事: 893
- 登録日時: 2005年7月25日(月) 13:27
- お住まい: 埼玉県東松山市
Get #関数
一応、4.13に格下げして対処してますが、4.22においてファイル内容が読み込まれません。
デバック実行にて確認。
pi1.txt
デバック実行にて確認。
コード: 全て選択
'外部ファイル: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
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
-
- 記事: 203
- 登録日時: 2005年5月31日(火) 20:14
- お住まい: 兵庫県
Re: Get #関数
当方では動いていますが…?
[pi2.txt] ※先頭の100文字を掲載
Ver 4.22.00 Windows XP Home (SP2) で確認。
※無修正function.sbpでも問題なし。
[pi2.txt] ※先頭の100文字を掲載
[dat2.txt]1374434982318249156264890559526526067884534604486953489875501431771358666686881098662314438189063612…
この結果でいいでしょうか?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でも問題なし。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
-
- 記事: 893
- 登録日時: 2005年7月25日(月) 13:27
- お住まい: 埼玉県東松山市
はて?
暫く原因追求に時間掛けたいと思います。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
-
- 記事: 141
- 登録日時: 2005年5月31日(火) 09:34
- お住まい: 北海道
そういえば以前,hiraさんが指数表記対応のVal関数を作っていましたね。
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=59
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=59
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
-
- 記事: 203
- 登録日時: 2005年5月31日(火) 20:14
- お住まい: 兵庫県