2016-08-06 3 views
0

Я пытаюсь инициализировать структуру из класса, который у меня есть в моем коде. Это сторонний класс с небольшим количеством документации для .NET, поэтому я застрял в инициализации некоторых переменных 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 

Если Я не добавить эту переменную код инициализации сразу после создания ГГС:

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

I получить раздражающее сообщение в области списка ошибок (потому что я не инициализирую переменные из структуры):

«Предупреждающая переменная« CNCSys »передается по ссылке, прежде чем ей будет присвоено значение. Исключительное исключение ссылки может возникнуть во время выполнения. Убедитесь, что структура или все ссылочные элементы инициализированы перед использованием «

Хорошо, добавив, что код решает предупреждение о неинициализированных переменных, я могу построить решение и запустить его ... однако, когда функция GetControlInfo называется, я получаю эту excception:

«Тип не может быть выстраивали, так как длина встроенного экземпляра массива не соответствует заявленной длине в макете»

Я считаю, подмигнули, потому что те, переменные - Char char в структуре, и они имеют фиксированную длину ... и я не как-то инициализирую 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} 

Кроме того, GetControlInfo нужен As пункт.

Смежные вопросы