配列をバリアント型で宣言できるのか?


るう  2005-01-07 04:05:16  No: 118658

はじめまして.
早速ですが,配列をstring型で宣言して,それを
ファイルに書き出すということをやっているのですが,

dim a() as string
dim b as variant

b=a()

print #1, b

というプログラムであっているでしょうか?
よろしくお願いいたします.


魔界の仮面弁士  2005-01-07 04:34:09  No: 118659

> 早速ですが,配列をstring型で宣言して,それを
> ファイルに書き出すということをやっているのですが,

その配列データを、どのようなテキストとして出力したいのでしょうか?


るう  2005-01-07 22:16:24  No: 118660

>魔界の仮面弁士様
返信ありがとうございます。
100個ほどの要素のデータを1個ずつ改行して、
1列100行のようなテキストとして、出力したいのです。
「型が一致しません」というエラーがどうしても出てきて、
うまくいかないのですが、これは宣言の仕方が間違っているのでしょうか?


特攻隊長まるるう  2005-01-07 22:55:28  No: 118661

[VB6.0]
配列を出力するには、各要素を個々に出力するループを作成します。

…と[型が一致しません。(Error 13)]のヘルプに書いてあって爆笑w。
ヘルプって面白いにぁ。


るう  2005-01-09 22:24:39  No: 118662

返信ありがとうございます。
どうしてもうまくいかないので、プログラムをのせて見ます。
アドバイス頂けると、うれしいです。

Private Sub ReceiveComm_OnComm()
    Dim varBuffer As String
    Dim strdata1 As Variant
    Static Ffrag, PictureFrag As Boolean
    
    'シリアルポートのイベントプロパティに対する処理
    Select Case ReceiveComm.CommEvent
        'イベントメッセージ
        Case comEvCD
        Case comEvCTS
        Case comEvDSR
        Case comEvRing
        Case comEvReceive
        '受信データの取得
        varBuffer = ReceiveComm.Input
        strData = strData & varBuffer
        
        'バッファの右端の文字列にターミネータがある場合
        If Right(varBuffer, 1) = TransDialog.strLastChar Then
        
            If TransDialog.strTerminate = "CR" Or TransDialog.strTerminate = "LF" Then
            'ターミネータ文字が"CR"や"LF"なら一文字分抜き取る
                strData = Left(strData, Len(strData) - 1)
            Else
            '二重のターミネータなら二文字分を抜き取る
                strData = Left(strData, Len(strData) - 2)
            End If
            
            If InStr(strData, "START!") <> 0 Then
            'START信号を受信したらログファイルとデータファイルを作成し開けておく
                If fopen = False Then
                    fopen = OpenFile(SaveFileTxt, DirList.path, FileTypeComb)
                    Call SaveLogFile("Recieves start")
                End If
                '送信側にデータの要求を求める
                ReceiveComm.Output = "DATA?" & TransDialog.strTerminator
                'ファイルフラグを挙げる
                Ffrag = True
                '描画フラグを挙げる
                PictureFrag = True
                'バッファデータを初期化
                strData = ""
                varBuffer = ""
                'パラメータの表示
                Trans_Status.Caption = "通信開始"
                TimeText.Text = TimeText.Text & "Transmit Start" & Format(Now, "hh:mm:ss") & vbCrLf
            End If
            
            strdata1 = Split(strData, vbCr)’strDataをCRで区切って配列に格納
            
            
                
            '通信路が切断した時(何故か上手くいかない→要デバッグ!)
            If InStr(strData, "NO CARRER") <> 0 Then
            '切断のパラメータを表示
                Trans_Status.Caption = "通信中断"
                TimeText.Text = TimeText.Text & "Transmit Stopped" & Format(Now, "hh:mm:ss") & vbCrLf
            'ログ記録
                Call SaveLogFile("Interrupts")
            End If
            
            'ファイルフラグが上がっている間データのセーブ
            If Ffrag = True Then
                Call SaveFile(strdata1, 0)
            End If
           
で、SaveFileっていうのが、

'データのセーブ用関数
Public Function SaveFile(Data As Variant, channelNO As Long)
    Dim temp(8) As Variant
    Dim time As Long
    
    time = Second(Now)
    
    If OpenFrag = True Then
        'データの格納
        temp(channelNO) = Data
    
        'セーブ
        Print #1, temp(channelNO)
 End If
    
End Function

strdataが一つの文字列に何個もデータがひっついてくるので、それを一個一個のデータにしてから、ファイルに書き出したいのです。
しかし、セーブのところでエラーが出てしまいます。


特攻隊長まるるう  2005-01-11 18:24:39  No: 118663

無視かよっ(>△<)ノ!!
全然コードとして変わってないやん。
不必要な情報が増えた分、質問としてはレベルダウンしたねぇ。
>配列を出力するには、各要素を個々に出力するループを作成します。
各要素を、1個1個、出力する、ループ処理を、コーディング、して下さい!!!
配列は出力できません。


魔界の仮面弁士  2005-01-11 18:33:19  No: 118664

配列のかたまりのまま保存したいなら、Put ステートメントを使います。
この場合、データはテキストではなくバイナリ形式で保存されます。
(読込には、Getステートメントを使うことになります)

配列を改行区切りで保存したいなら、Join関数を使って、
文字列の配列を、改行区切りの長い文字列にしてから、
Printステートメントで保存すればOKです。


るう  2005-01-12 04:44:16  No: 118665

返信ありがとうございます.
ループの形でやってみたのですが,tの値がなぜか0のままで増えていきません.コードはこのように変えました.

static t as integer
For t = LBound(strdata1) To UBound(strdata1)
            
            t = t + 1
           
'ファイルフラグが上がっている間データのセーブ
            If Ffrag = True Then
                Call SaveFile(strdata1(t), 0)
            End If

Next t

どこか,おかしいでしょうか?


ひろ  2005-01-12 18:19:15  No: 118666

そもそも OnCommイベントプロシージャが長すぎるので、MsCommに依存する部分と、受信データの処理のルールに依存する部分を分離するべきだと思いますが、それはちょっと置いておいて
 
> static t as integer

  staticにする必要性が全く感じられません。

> t - t + 1

  Forループのカウンタを毎回自分で書き換えるようなコードは、
  「そもそもForではなく Do や while等のループにするべき」
  「バグ」
  のどちらかの場合がほとんどです。

  今回はこれまでの話の感じではバグの可能性の方が高いです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加