【问题标题】:Get around 64k limit in Visual Basic 6在 Visual Basic 6 中绕过 64k 限制
【发布时间】:2020-04-16 21:34:39
【问题描述】:

我需要在 VB 中更新这个旧代码,但我遇到了问题。我已经在这个结构中添加了字段,现在当我尝试编译时,我得到了这个错误:

从网上阅读大多数人建议打破结构。问题是我从固件接收这种格式的数据。所以我想保持原样,但想办法解决这个问题。

我的结构是这样的:

Public Type DATA_V2_T
    1_offsets(6399) As Single
    2_offsets(6399) As Single
    init_d_offsets(1199) As Single
    init_a_offsets(1199) As Single
    e_offsets(999)   As Single
    d_offsets(749) As Single
    a_offsets(1199) As Single
    final_e_offsets(6399) As Single
End Type

我现在添加的字段是 1_offsets 和 2_offsets 导致错误发生。这段代码似乎在某种程度上解决了这个问题,因为以下内容被定义为全局:

Global data_v2 AS DATA_V2_T

我也可以为结构做这样的事情吗?

编辑:我尝试过上课。我能够像这样定义我的变量:

    Private 1_offsets(6399) As Single
    Private 2_offsets(6399) As Single
    Private init_d_offsets(1199) As Single
    Private init_a_offsets(1199) As Single
    Private e_offsets(999)   As Single
    Private d_offsets(749) As Single
    Private a_offsets(1199) As Single
    Private final_e_offsets(6399) As Single

我创建了属性获取方法来访问这些私有变量,如下所示:

Property Get p1_offsets() As Single()
    p1_offsets = 1_offsets
End Property

编译器似乎没有抱怨这一点。但是我还需要能够设置数组的值,并且我在属性设置方面遇到了麻烦。我该怎么做?

【问题讨论】:

  • 不使用Type,可以改用具有相同结构的Class吗?
  • 您是否通过声明函数将其传递给外部库?如果是这样,您可以创建一个正确 (> 64kb) 大小的字节数组来创建一个连续的内存区域并传递它而不是 UDT。外部函数将填充它,当它返回时,您可以将缓冲区中的 CopyMemory() 复制到 2 个较小的 UDT 中 - 比如说一个带有 2 个偏移字段,另一个带有剩余字段。
  • 你能说明数据是如何被读入结构的吗?
  • @BrianMStafford 我正在尝试这样做。我已经能够将它们设置为私有并使用 Property Get 来检索它们。但我还需要修改它们并且在属性集方面遇到了问题。
  • @Dan 您可以随时根据您的尝试更新您的问题,我们可以为您在课堂上遇到的任何问题提供帮助。

标签: vb6


【解决方案1】:

最简单的方法是将您的数据定义为Variant。这是一个例子:

Option Explicit

Private Sub Command1_Click()
   Dim one_offsets(6399) As Single
   one_offsets(0) = 33
   one_offsets(1) = 44

   Dim d As Data
   Set d = New Data
   d.one_offsets = one_offsets
End Sub

然后在您的数据类中:

Option Explicit

Private m_1_offsets As Variant
Private m_2_offsets As Variant
Private m_init_d_offsets As Variant
Private m_init_a_offsets As Variant
Private m_e_offsets As Variant
Private m_d_offsets As Variant
Private m_a_offsets As Variant
Private m_final_e_offsets As Variant

Public Property Get one_offsets() As Variant
   one_offsets = m_1_offsets
End Property

Public Property Let one_offsets(ByVal Value As Variant)
   m_1_offsets = Value
End Property

如果您随后在 Watch 窗口中检查 m_1_offsets,您将看到它被定义为 Variant/Single(0 to 6399)。

【讨论】:

    【解决方案2】:

    我还没有测试过它是否有效,但我做了一个这样的类:

    Public 1_offsets As Variant
    
    Private Sub Class_Initialize()
        ReDim 1_offsets(0 To 6399)
    End Sub
    

    一切都编译好了

    从这里得到这个:Creating VB array that is public, within class module

    【讨论】:

    • 刚刚测试了sn-p,它不会按原样编译。编译器抱怨1_offsets 不是标识符(显然),因为在大多数 语言(包括VB6)中,标识符以字母 开头并且不能start 虽然第一个字母后面的数字很好,但有数字。
    • @wqw 我刚刚重命名了我的值,以便在我发布它时使问题更简单。
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多