ReDim结构化数组

时间:2015-12-29 19:13:04

标签: arrays vb.net optimization data-structures

我创建了一个有趣的结构“列表”。那些结构包含一些数组(动态),我想ReDim它们。但是我收到一个错误:“3D Cube.exe中出现类型'System.NullReferenceException'的第一次机会异常”和“对象引用没有设置为对象的实例。”。 />
这就是代码的样子(你可以看到它看起来像opengl):

模块:

case

THE CLASS (我没有包含课程的第一部分和许多潜艇和功能):

Public Module _3DDefinitions
    Public Pen1 As New System.Drawing.Pen(Color.White, 2)


    Public Structure VertexesObjects
        Dim Face() As Faces
        Dim FaceCount As Double
        Dim Position As DPoint  ''Translated Position
        Dim NPPF As Integer     ''NumberofPointsPerFace
    End Structure
    Public Structure Faces
        Dim PointVertexes() As _3DDefinitions.DPoint
        Dim PointCount As Double
        Dim FaceColor As Color
    End Structure
    Public Structure DPoint
        Dim X As Single
        Dim Y As Single
        Dim Z As Single
    End Structure

    Enum GL_LoadAction As Byte
        GL_Start = 1   ''Start- equivalent of GlBegin
        GL_End = 2     ''End-equivalent of GlEnd 
    End Enum

    Enum GL_EnableAction As Byte
        GL_UseDefaultUnit = 1
        GL_UseOwnUnit = 2
        GL_Translation = 4
    End Enum
End Module


LoadVertex3D 只是在内存中加载一些点(坐标)(使用结构),子 GL_LoadVertexes 告诉类用户想要加载3d对象的点。我真的需要这些结构,因为例如我想创建一个新的“对象”,所以我将不得不再次使用“Objects”特殊变量。但是当我这样做时,FacesIndex和PointsIndex(那些只是计数器)将被重置。
唯一保持不变的var将是ObjectsIndex。这就是我需要结构的原因,因为在那些我可以保存创建的面和点的数量(在FaceCount和PointCount变量中)。
问题是什么?或者如果你知道一个更好的解决方案来满足我的需求,你能告诉我吗?

1 个答案:

答案 0 :(得分:0)

你的问题真的在这里:

FacesIndex = FacesIndex + 1

增加索引而不对其引用的数组执行redim。然后,当您重新开始PointVertexes数组时,您将获得空引用,因为Face数组中的索引不存在。要解决这个问题,你应该这样做:

    If PointsIndex = GL_NPPF - 1 Then
        FacesIndex = FacesIndex + 1
        ReDim Preserve Objects(ObjectsIndex).Face(FacesIndex)
        PointsIndex = 0
        ... and then create the inner array, etc...