Byte配列のファイルへの書き出し

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

Byte配列のファイルへの書き出し

#1 投稿記事 by yama »

以下のようなコードでWrite # を使ってByte配列に格納してある文字列をファイルに書き出しました。
ファイルは正常に書き込まれているのですが、配列のところには"おためしの文字列"ではなく数字が書き込まれてしまいます。

プログラミング講座のByte配列を参考にメッセージボックスへ表示させますと正常にでるのですがどうしてなのでしょう?

コード: 全て選択


Dim Otamesi[255] As Byte
lstrcpy(Otamesi,"おためしの文字列")

'メッセージボックスへの表示は正常にできるのだが
MessageBox(0,Otamesi,"おためしの文字列",MB_OK)

'ファイルへの書き出しへは数字が書き込まれる
Open "send-log.ini" For Append As #2	'末尾に追加でひらく
Write #2,"ここが始まり"
'本文の書き込み
Write #2,Otamesi
close #2
よろしくお願いいたします。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: Byte配列のファイルへの書き出し

#2 投稿記事 by 7 »

> ファイルは正常に書き込まれているのですが、配列のところには"おためしの文字列"ではなく数字が書き込まれてしまいます。
実際に動かしてないので確かじゃないんですけど、たぶんアドレス値か何かが書き込まれてるんだと思います。
VarPtr関数でポインタを渡せば大丈夫じゃないでしょうか。
みどるべあ
記事: 25
登録日時: 2005年11月13日(日) 15:25
連絡する:

#3 投稿記事 by みどるべあ »

MakeStrを使うといいかも。

コード: 全て選択

Dim Otamesi[255] As Byte
lstrcpy(Otamesi,"おためしの文字列")

'メッセージボックスへの表示は正常にできるのだが
MessageBox(0,Otamesi,"おためしの文字列",MB_OK)

'ファイルへの書き出しへは数字が書き込まれる
Open "send-log.ini" For Append As #2    '末尾に追加でひらく
Write #2,"ここが始まり"
'本文の書き込み
Write #2,MakeStr(Otamesi)
close #2
最後に編集したユーザー みどるべあ [ 2006年5月01日(月) 16:53 ], 累計 1 回
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

Re: Byte配列のファイルへの書き出し

#4 投稿記事 by yama »

7さんみどるべあさん返信ありがとうございました。

VarPtrでは同じ結果となりました。

> MakeStrを使うといいかも。

始めて目にするこちらで希望の出力ができました。
あらためてBackサーチで検索してみて、メッセージボックスの方は文字列の
NULLを自前で処理している事を知りました。それでひょうじされたのですね。

お二方ともお手数をおかけしました。
河川屋

Re: Byte配列のファイルへの書き出し

#5 投稿記事 by 河川屋 »

MakeStrでも動くでしょうが、元プログラムが意図どおりに動かないのは文法ミス×2のため。

正しくは、
Dim Otamesi[255] As Byte
Dim i as Integer
lstrcpy(Otamesi,"おためしの文字列")
Open "send-log.ini" For Append As #2 '末尾に追加でひらく
i=0
While Otamesi(i)<>0
Write #2,Chr$(Otamesi(i));  'Print #2,Chr$(Otamesi(i));  のほうが普通か?
i=i+1
Wend
Write #2, ' 最後に改行。
close #2

間違った箇所は2箇所。
1.Dim Otamesi[255] As Byteは、1バイト整数の宣言であり文字列を宣言している
わけではない。よって、WriteやPrintで出力する場合、当然数値を出力する。
2.BASIC基本命令では配列名を受け渡すことはできない。
  よって、Write #2,Otamesi という構文は認められない。エラーにならないのは、
  ActiveBasicのバグ。
  (関数はこの限りでないので、MakeStrなどは大丈夫)。
あと、ファイルに書く途中で改行しないように組む必要があります。

で、それ以前の問題として、
Dim Otamesi As String
Otamesi="おためしの文字列"
MessageBox(0,Otamesi,"おためしの文字列",MB_OK)
Open "send-log.ini" For Append As #2 '末尾に追加でひらく
Write #2,Otamesi
close #2
というように、BASICで初期からサポートしている文字型を利用すればよいのであり、
FORTRAN70由来の「整数配列に文字をブチ込む」という、
更に古くさい方法を使っているのが諸悪の根源と思うけど.....。
ゲスト

#6 投稿記事 by ゲスト »

> FORTRAN70由来の「整数配列に文字をブチ込む」という、
> 更に古くさい方法を使っているのが諸悪の根源と思うけど.....。

横からすみません。
そうしたほうが処理速度が速いからではないのでしょうか。
実際に時間を計測したわけではないので分かりませんが。
河川屋

#7 投稿記事 by 河川屋 »

> そうしたほう(=文字型でなく整数配列を使う)が処理速度が速いからではないのでしょうか。
そうした質問は来ると思った....
でも、これは、ソフトウェア工学上、逆効果のほうが大きいとされている典型なんです。
処理速度が全てを支配したのは1970年あたりまでかな?
それ以降は、多少の速度低下の許容しても、開発の手間を省くほうがトータルでは得、
という意見がソフトウェア工学のキャスティングボードを握っています。
※それ以降というのは、構造化プログラム理論やオブジャクト志向を指す。
  人工知能やデータベースなどは、処理速度的には更に無茶苦茶やってます。
だからこそ、文字列の扱いに、
・整数配列以外に文字型が新設された
という経緯があります。

ただ、処理速度を開発の手間より優先する場合というのもあるけど、
そもそも、ABで超越関数を多用すると、十進BASICやEXCEL上のVBAより
はるかに遅いという現実がある(他の関数は実測したことがないのでコメント無し)から、
処理速度優先の場合はAB以外の何か(たとえばCやアセンブラ)を使う、とするほうが現実的であり、
パレートの法則により、プログラム全体の2割を高速化すれば遅い主原因を叩き潰したことになるから、
どこまで速度追求に意味があるか疑問です。

また、こういうのは、過去ログ「ソートロジック大会」と混同しないでね。
あっちは、アルゴリズム次第でn^2比例とnlogn比例の差があるから、優に100倍、1000倍の
速度差が生じますが、今回はそんな差は無いです。
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

Re: Byte配列のファイルへの書き出し

#8 投稿記事 by yama »

河川屋さん詳しい解説ありがとうございました。
> 間違った箇所は2箇所。
> 1.Dim Otamesi[255] As Byteは、1バイト整数の宣言であり文字列を宣言している
> わけではない。よって、WriteやPrintで出力する場合、当然数値を出力する。

この説明で感覚的に理解できました。

> 2.BASIC基本命令では配列名を受け渡すことはできない。
>   よって、Write #2,Otamesi という構文は認められない。エラーにならないのは、
>   ActiveBasicのバグ。
>   (関数はこの限りでないので、MakeStrなどは大丈夫)。

このおおらかさが救いだったり、悩みの種になったりするわけですね。

> で、それ以前の問題として、
> Dim Otamesi As String
> Otamesi="おためしの文字列"

ごく最近までモロBasic人でStringオンリーでしたが、時代の流がByte配列?
とおもい、勉強しています。好き好んで面倒なほうをしなくてもとは感じていましたが
最近ようやくプログラムは関数でできていると感じています。

While ~Wendの間の処理がMakeStrでやっていることなのですね。
返信する