2016-08-06 5 views
0

나는 내 코드에서 가지고있는 클래스의 구조체를 초기화하려고하고있다. 이것은 .NET에 대한 문서가 거의없는 제 3 자 클래스이므로 구조 내에서 고정 길이로 정의 된 일부 Char 변수의 초기화에 빠져 있습니다.구조체에서 고정 길이 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 = "" 

I 오류 목록 영역에서 짜증나는 메시지를 얻습니다 (구조체의 변수를 초기화하지 않기 때문에).

"경고 변수 'CNCSys'는 값이 할당되기 전에 참조로 전달됩니다. 런타임시 널 참조 예외가 발생할 수 있습니다. 구조 또는 모든 참조 멤버를 사용하기 전에 초기화해야합니다. "

자, 코드를 추가하면 초기화되지 않은 변수에 대한 경고가 풀리고 솔루션을 빌드하고 실행할 수 있습니다. 그러나 함수가 GetControlInfo 일 때 라고,이 excception를 얻을 :

내가 키우면 그 때문이라고 생각

"내장 배열 인스턴스의 길이가 레이아웃에서 선언 된 길이와 일치하지 않기 때문에 형식이 마샬링 수 없습니다" 변수는 구조체의 Char vars이며 고정 길이가 있습니다 ... 그리고 저는 어떻게 든 초기화되지 않습니다. g 구조체 정의에서 가지고있는 것과 같은 길이를 가진 것들 ...

여기서 내가 뭘 잘못하고 있니? 컴파일러가 초기화되지 않은 변수에 대한 메시지를 보내지 않도록 마샬링에 문제가 없도록 어떻게 초기화 할 수 있습니까?

감사합니다.

답변

0

정의는 각 문자열에 있어야하는 문자 수를 알려주므로 SizeConst = 2 인 경우 ""대신 ""을 사용하십시오. 크기가 바이트 단위인지 확실하지 않은 경우 (이 경우 "") 시도하십시오.

는 SizeConst = 4

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} 

도움, GetControlInfoAs 절을 필요가 있는지에 대한 유사 마십시오.

관련 문제