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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.54510 の関連記事表示

<< 0 >>
■54510  配列の下限の変更について
□投稿者/ DD -(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と同じような動きになる方法があれば教えていただきたいです。

    よろしくお願いいたします。
親記事 /過去ログ91より / 関連記事表示
削除チェック/

■54511  Re[1]: 配列の下限の変更について
□投稿者/ shu -(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
    >

    これでどうでしょう?(試してません)
記事No.54510 のレス /過去ログ91より / 関連記事表示
削除チェック/

■54513  Re[2]: 配列の下限の変更について
□投稿者/ DD -(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は変更しない方法で記述する方法はないでしょうか?
    
    色々申し訳ありませんが、よろしくお願いいたします。
記事No.54510 のレス /過去ログ91より / 関連記事表示
削除チェック/

■54514  Re[3]: 配列の下限の変更について
□投稿者/ よねKEN -(2010/10/22(Fri) 19:12:02)
>
    VB.netになって下限は0固定に仕様変更になっていたはずなので、
    1〜4としていたところを0〜3になるように修正するしかないと思います。
記事No.54510 のレス /過去ログ91より / 関連記事表示
削除チェック/

■54515  Re[3]: 配列の下限の変更について
□投稿者/ shu -(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
記事No.54510 のレス /過去ログ91より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -