如何从结构中正确初始化固定长度的Char变量?

时间:2016-08-06 19:29:31

标签: vb.net

我正在尝试从我的代码中的类初始化一个结构。这是第三方类,几乎没有.NET的文档,所以我在一些Char变量的初始化中停留,这些变量在结构中定义了固定长度。

这是第3部分课程的结构。

<StructLayout(LayoutKind.Sequential,Pack:=4)> _
Public Structure ODBSYS
    Public addinfo As Short
    Public max_axis As Short
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
    Public cnc_type As Char()
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
    Public mt_type As Char()
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=4)> _
    Public series As Char()
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=4)> _
    Public version As Char()
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
    Public axes As Char()
End Structure

这就是我正在努力的功能:

Private Function GetControlInfo()
        Dim CNCSys As Focas1.ODBSYS
        CNCSys.addinfo = 0
        CNCSys.max_axis = 0
        CNCSys.cnc_type = ""
        CNCSys.mt_type = ""
        CNCSys.series = ""
        CNCSys.version = ""
        CNCSys.axes = ""

    Try

        intHandleNo = Focas1.cnc_sysinfo(LibHndl, CNCSys)

        MessageBox.Show("AddInfo: " & CNCSys.addinfo.ToString & vbCrLf & _
       "MaxAxis: " & CNCSys.max_axis.ToString & vbCrLf & _
       "CNCType: " & CNCSys.cnc_type.ToString & vbCrLf & _
       "MTType: " & CNCSys.mt_type.ToString & vbCrLf & _
       "Series: " & CNCSys.series.ToString & vbCrLf & _
       "Version: " & CNCSys.version.ToString & vbCrLf & _
       "Axes: " & CNCSys.axes.ToString)
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try

    Return Nothing

End Function

如果我在创建CSys之后不立即添加此变量初始化代码:

        CNCSys.addinfo = 0
        CNCSys.max_axis = 0
        CNCSys.cnc_type = ""
        CNCSys.mt_type = ""
        CNCSys.series = ""
        CNCSys.version = ""
        CNCSys.axes = ""

我在错误列表区域中收到恼人的消息(因为我没有从结构中初始化变量):

“警告变量'CNCSys'在被赋值之前通过引用传递。在运行时可能会产生空引用异常。确保在使用之前初始化结构或所有引用成员”

好的,添加该代码解决了非初始化变量的警告,我可以构建解决方案并运行,但是......但是当调用函数GetControlInfo时,我得到了这个概念:

“无法封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配”

我相信这是因为这些变量是结构中的Char变量,并且它们具有固定的长度...而且我不是以某种方式使用它们在结构定义中具有的相同长度来初始化它们...

我在这里做错了什么?我如何初始化它们,以便编译器不会向我发送有关未初始化变量的消息,但是我也没有编组问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

定义告诉你每个字符串应该有多少个字符,所以试试&#34; &#34;而不是&#34;&#34;其中SizeConst = 2。不确定大小是否以字节为单位,在这种情况下尝试&#34; &#34 ;.

同样适用于SizeConst = 4

答案 1 :(得分:0)

看看这是否有帮助

CNCSys.addinfo = 0S
CNCSys.max_axis = 0S
CNCSys.cnc_type = {" "c, " "c}
CNCSys.mt_type = {" "c, " "c}
CNCSys.series = {" "c, " "c, " "c, " "c}
CNCSys.version = {" "c, " "c, " "c, " "c}
CNCSys.axes = {" "c, " "c}

此外,GetControlInfo需要As条款。

相关问题