首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从结构中正确地初始化固定长度Char变量?

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

Stack Overflow用户
提问于 2016-08-06 19:29:31
回答 2查看 178关注 0票数 0

我正在尝试从代码中的一个类初始化一个结构。这是一个第三方类,.NET的文档很少到零,所以我被困在了一些Char变量的初始化中,这些变量是在结构中用固定长度定义的。

这是第三节课的结构。

代码语言:javascript
复制
<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

这是我正在做的功能:

代码语言:javascript
复制
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之后立即添加这个变量初始化代码:

代码语言:javascript
复制
        CNCSys.addinfo = 0
        CNCSys.max_axis = 0
        CNCSys.cnc_type = ""
        CNCSys.mt_type = ""
        CNCSys.series = ""
        CNCSys.version = ""
        CNCSys.axes = ""

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

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

好的,添加该代码可以解决非初始化变量的警告,我可以构建解决方案并运行,它.然而,当函数GetControlInfo被调用时,我得到了以下异常:

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

我相信这是因为这些变量是结构中的字符,它们有固定的长度.我并没有用它们在结构定义中的长度来初始化它们.

我在这里做错什么了?我如何初始化它们,这样编译器就不会抛出关于未初始化变量的消息,而且我在封送处理方面也不会有问题。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-08-06 21:10:30

定义告诉您每个字符串应该有多少个字符,所以尝试"“而不是”SizeConst=2“,但不确定大小是否以字节为单位,在这种情况下,请尝试”“。

对SizeConst=4也做类似的操作

票数 0
EN

Stack Overflow用户

发布于 2016-08-07 01:12:51

看看这是否有帮助

代码语言:javascript
复制
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子句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38808019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档