C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 配列の下限の変更について


(過去ログ 91 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■54510 / inTopicNo.1)  配列の下限の変更について
  
□投稿者/ DD (6回)-(2010/10/22(Fri) 17:29:58)

分類:[VB.NET/VB2005 以降] 

VB6からVB2005へのコンバージョンを行っています。

配列の下限の変更について質問です。

VB6からVB2005に自動アップグレードを行った所、以下のように配列sCCCの下限が
1から0に変更されました。

<VB6ソース>

    '定義体
    Type gtyp_Common
        sAAA                 As String * 6
        sBBB                 As String * 3
        sCCC(1 To 4)         As String * 2
    End Type

Private Sub Main()
    
    '変数宣言
    Dim ltyp_INF      As gtyp_Common
    Dim li_CNT        As Long
    Dim li_otFileNum  As Long
    
    li_otFileNum = FreeFile
    Open "d:\OUT_Test.txt" For Random As #li_otFileNum Len = Len(ltyp_INF)
    
    ltyp_INF.sAAA = "abcdef"
    ltyp_INF.sBBB = "ghi"
    
    '配列の設定
    For li_CNT = 1 To 4
        ltyp_INF.sCCC(li_CNT) = "A" & li_CNT
    Next li_CNT
    
    'メッセージ出力
     Put #li_otFileNum, , ltyp_INF
     
     MsgBox "配列最小値" & LBound(ltyp_INF.sCCC())
     MsgBox "配列最大値" & UBound(ltyp_INF.sCCC())
    
End Sub

<VB2005ソース>
	'定義体
	Structure gtyp_Common
        <VBFixedString(6), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=7)> Public sAAA As String
        <VBFixedString(3), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=4)> Public sBBB As String
        <VBFixedString(2), VBFixedArray(4)> Dim sCCC() As String

        Public Sub Initialize()
            ReDim sCCC(4)
        End Sub

	End Structure
	
    Public Sub Main()

        '変数宣言
        Dim ltyp_INF As gtyp_Common
        Dim li_CNT As Integer
        Dim li_otFileNum As Integer

        li_otFileNum = FreeFile()
        FileOpen(li_otFileNum, "d:\OUT_Test.txt", OpenMode.Random, , , Len(ltyp_INF))

        '配列の初期化
        ltyp_INF.Initialize()

        ltyp_INF.sAAA = "abcdef"
        ltyp_INF.sBBB = "ghi"

        '配列の設定
        For li_CNT = 1 To 4
            ltyp_INF.sCCC(li_CNT) = "A" & li_CNT
        Next li_CNT

        'ファイル出力
        FilePut(li_otFileNum, ltyp_INF)

        MsgBox("配列最小値" & LBound(ltyp_INF.sCCC))
        MsgBox("配列最大値" & UBound(ltyp_INF.sCCC))

    End Sub

上記のソースを実行した所、VB6のソースでは

<OUT_Test.txt>
abcdefghiA1A2A3A4

<配列最小値>
1

<配列最大値>
4

と出力されるのに対して、VB2005のソースでは

<OUT_Test.txt>
abcdefghi  A1A2A3A4

<配列最小値>
0

<配列最大値>
4

とltyp_INF.sCCC(0)が空白で出力され、配列の最小値もVB6とは異なっています。


コンバージョンにおいて、このような箇所が多く見受けられます。
その為、このltyp_INF.sCCC(0)を無効にし、配列の個数、For文のループを修正しなくても
VB6と同じような動きになる方法があれば教えていただきたいです。

よろしくお願いいたします。

引用返信 編集キー/
■54511 / inTopicNo.2)  Re[1]: 配列の下限の変更について
□投稿者/ shu (119回)-(2010/10/22(Fri) 17:58:15)
No54510 (DD さん) に返信

要望通りではありませんが

> <VB2005ソース>
> '定義体
> Structure gtyp_Common
> <VBFixedString(6), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=7)> Public sAAA As String
> <VBFixedString(3), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=4)> Public sBBB As String
> <VBFixedString(2), VBFixedArray(4)> Dim sCCC() As String
sCCC => m_sCCC


>
> Public Sub Initialize()
> ReDim sCCC(4)
sCCC => m_sCCC


> End Sub

Public Property sCCC(idx As Integer) as String
Get
return m_sCCC(idx-1)
End Get

Set (value as string)
m_sCCC(idx-1)= value
End set

End Property

>
> End Structure
>

これでどうでしょう?(試してません)
引用返信 編集キー/
■54513 / inTopicNo.3)  Re[2]: 配列の下限の変更について
□投稿者/ DD (7回)-(2010/10/22(Fri) 18:58:30)
No54511 (shu さん) に返信
返信ありがとうございます。
上記のようにソースを修正した所、

出力結果

<OUT_Test.txt>
abcdefghiA1A2A3A4  

<配列最小値>
0

<配列最大値>
4

となり、分かりづらいですが、txtファイルも18byte目から2byteほど空白が入った状態となります。

sCCC => m_sCCCとした場合、

> MsgBox("配列最小値" & LBound(ltyp_INF.sCCC))

sCCCを使用している部分の修正を行わなければならない為、
sCCCは変更しない方法で記述する方法はないでしょうか?

色々申し訳ありませんが、よろしくお願いいたします。

引用返信 編集キー/
■54514 / inTopicNo.4)  Re[3]: 配列の下限の変更について
□投稿者/ よねKEN (625回)-(2010/10/22(Fri) 19:12:02)
よねKEN さんの Web サイト
VB.netになって下限は0固定に仕様変更になっていたはずなので、
1〜4としていたところを0〜3になるように修正するしかないと思います。

引用返信 編集キー/
■54515 / inTopicNo.5)  Re[3]: 配列の下限の変更について
□投稿者/ shu (120回)-(2010/10/22(Fri) 21:56:15)
2010/10/23(Sat) 07:50:52 編集(投稿者)
No54513 (DD さん) に返信

> 要望通りではありませんが
と書きつつ4を3にする記述わすれてました。
VBFixedArray(4)> と Redimの4は3に変えて下さい。

・・・・

配列拡張構造体を作ってみたので載せておきます。エラーチェックはしてません。

'--- gtyp_Commonはこんな感じで実装してみて下さい。
Public Structure gtyp_Common
    <VBFixedString(6), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=7)> Public sAAA As String
    <VBFixedString(3), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=4)> Public sBBB As String
    <VBFixedString(2), VBFixedArray(3)> Private m_sCCC() As String

    Public sCCC As VArray(Of String)

    Public Sub Initialize()
        sCCC = New VArray(Of String)(m_sCCC, 1, 4)
    End Sub

End Structure

'---> ここから下、拡張構造体
Public Structure VArray(Of T)
    Implements IVArray, IEnumerable

    Private m_ary() As T
    Private m_LBound As Integer
    Private m_UBound As Integer

    Public Sub New(ByRef ary() As T, ByVal Lb As Integer, ByVal Ub As Integer)
        m_ary = CType(Array.CreateInstance(GetType(T), Ub - Lb + 1), T())
        ary = m_ary
        m_LBound = Lb
        m_UBound = Ub
    End Sub

    Default Public Property Item(ByVal idx As Integer) As T
        Get
            Return m_ary(idx - m_LBound)
        End Get
        Set(ByVal value As T)
            m_ary(idx - m_LBound) = value
        End Set
    End Property

    Public ReadOnly Property Lbound() As Integer Implements IVArray.Lbound
        Get
            Return m_LBound
        End Get
    End Property

    Public ReadOnly Property UBound() As Integer Implements IVArray.UBound
        Get
            Return m_UBound
        End Get
    End Property

    Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
        Return m_ary.GetEnumerator
    End Function
End Structure

'--- modVArrayの関数用にインターフェース作成
Public Interface IVArray
    ReadOnly Property Lbound As Integer
    ReadOnly Property UBound As Integer
End Interface

'--- Lbound,Ubound偽装用モジュール
Public Module modVArray
    Public Function Lbound(ByVal ary As IVArray) As Integer
        Return ary.Lbound
    End Function

    Public Function UBound(ByVal ary As IVArray) As Integer
        Return ary.UBound
    End Function
End Module

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -