我正在移植一个使用复杂类型的VB6应用程序来包含结构化消息系统。我正在处理的当前问题是将其转换为VB.net结构。这是宣言:
Global Const MAX_MSGS = 150 ' Max number of messages per set
Global Const MAX_SETS = 100 ' Max number of message sets
Global Const MAX_HGI = 96 ' Max number of HowGozIt messages per set
Global Const MAX_WPS = 96 ' Max number of way points per message set
Global Const MAX_FLS = 15 ' Max number of flight levels per waypoint
Type MessageRec
MessType As Integer 'Message Type
MessIndex As Integer 'Message Index (not used currently)
MessNextBit As Integer 'last bit for Mops messages
MessTotal As Integer 'Mess total
MultMessBit As Integer 'Multiple message bit position
MessTitle As String * 25 'Message title
MessNo As String 'Message Numbers and data for mops edit
MessText As String 'I/F displayable text
MessStr As String 'message bits for mops msgs, can be file for acars,aoc
MessLabel As String * 4 'Label and sublabel
TimeDelay As Integer 'Delayed time in seconds before message is delivered
Active As Boolean 'Flag determines active/deactive
AutoInit As Boolean 'Flag if part of auto init bundle
AIDelay As Integer 'Auto Init time delay (secs)
End Type
Type WayPointRec
Name As String * 7
DeltaTime As String * 5
FltLevel As String * 5
DeltaFuel As String * 5
Lat As String * 6 ' Latitude of waypoint
Long As String * 7 ' Longitude of waypoint
SAT As String * 3 ' Standard Air temp (no need to save in database)
Via As String
NumAlts As String * 2 ' Numer of altitudes for following weather data
FL(0 To MAX_FLS) As String * 3 ' Flight level for this weather
WindDir(0 To MAX_FLS) As String * 3 ' Wind direction
WindSpd(0 To MAX_FLS) As String * 3 ' Wind speed
Temp(0 To MAX_FLS) As String * 3 ' Temperature
End Type
Type MessageStore
Nmsgs As Integer 'Number of messages in the message set
Fltno As Integer 'Flight Number
SubFltNo As String * 1 'For multiple messages with same flight number
CityPair As String * 7 'City Pair
Descr As String * 12 'Message Set Description
Hot As Integer 'Hot/Cold flag (true => hot, use second weather message set)
DWndFL(0 To 3) As Integer 'Descent wind flight level (4 altitudes)
DWndDir(0 To 3) As Integer 'Descent wind direction (4 altitudes)
DWndSpd(0 To 3) As Integer 'Descent wind speed (4 altitudes)
WndSpd(0 To 9) As Integer 'Start/end wind speed (5 altitudes)
WndDir(0 To 9) As Integer 'Start/end wind direction (5 altitudes)
TempDev(0 To 1) As Integer 'Start/end Temperature deviation from standard
altn(0 To 1) As String * 3 'Alternate airports for area weather information
nHGIwpts As Integer 'Number of waypoints for howgozit info
HGIinfo(1 To MAX_HGI, 0 To 3) As String * 5 'Howgozit information
MsgData(1 To MAX_MSGS) As MessageRec 'Message data mlw 7/12/02 changed 30 to 60
nwpts As Integer 'Number of waypoints for winds/temp info
WayPoints(1 To MAX_WPS) As WayPointRec 'For canned messages
Index As Integer
Active As Boolean 'Flag determines active/deactive
DeltaArrivalTime As Integer 'add or subtract to get actual arrival time
TimeToGate As Integer 'Time to gate from T/D for HOWGOZIT
End Type
结构MessageStore是磁盘格式(所有字段都转换为字符串进行写入),由另一个C程序读取。
对于简单的字符串转换为固定长度的stings我没有问题,但在WayPointRec中转换固定长度字符串的数组,然后包含在MessageStore的WayPointRec的WayPoints数组中,这是我目前被卡住的地方
还如何最好地处理固定长度字符串的“HGIinfo”2D字符串数组
修改
遗漏了一个细节 - 顶级
Public MsgArray() As MessageStore
其中MsgArray成长为
redim preserve MsgArray(x)
x限制为0-100
答案 0 :(得分:0)
Public Class MessageStore
Public MsgData As MessageRec
Public WayPoints As WayPointRec
Public DWndFL(3) As Integer
Public HGIinfo(MAX_HGI, 3)() As String
End Class
Public Class WayPointRec
Public FL(MAX_FLS)() As String
End Class
但是,最好将数组重新编写为类似的东西(或者将它们全部转化为类,但这样做太多了):
Private _HGIinfo(MAX_HGI, 3, 5) As String
此外,如果不使用Structures,您将无法初始化数组大小,请参阅:http://msdn.microsoft.com/en-us/library/2hkbth2a%28v=vs.71%29.aspx
还:http://msdn.microsoft.com/en-us/library/wak0wfyt.aspx#BKMK_CreatingAnArray
应该涵盖转换,需要推断休息。
3个问题:
你可以使用getter / setter属性来解决它们(但这很难看):
Private _HGIinfo(MAX_HGI, 3)() As String
Public Property HGIinfo(ByVal a As Integer, ByVal b As Integer) As String()
Get
' perform some checks on value or MAX_HGI
Return _HGIinfo(a, b)
End Get
Set(ByVal value As String())
' perform some checks on value or MAX_HGI
_HGIinfo(a, b) = value
End Set
End Property
HGIinfo(0, 1)(3).SubString(0, 4) ' would get the first 4 chars of the 3rd string, at position 0,1 in the _HGIinfo array
另外,要初始化具有上限的String()数组,您需要以下内容:
Private _HGIinfoStr(5) As String
Private _HGIinfo(MAX_HGI, 3)() As String
Public Sub New()
_HGIinfo(0, 0) = _HGIinfoStr ' would need to loop through 0 to MAX_HGI, and also 0-3 to init all the members of the _HGIinfo array with bounds.
End Sub
再次,这将是非常混乱。类方法供参考:
Public Class HGIinfoClass
Public _HGIinfoStr(5) As String
End Class
Private _HGIinfo(MAX_HGI, 3) As HGIinfoClass
Public Sub test()
_HGIinfo(3, 3)._HGIinfoStr(3) = "test"
End Sub
实际上,我正在考虑使用属性来维护当前函数并重新格式化新数组边界并返回的方法,遗憾的是,它并不那么简单。需要数组副本或一些复杂的循环。
编辑:另外,另一种方法是将它们转换为继承自ArrayList的类,并设置Capacity属性。但总体来说效率较低。
并且还可以使用以下命令指定数组的下限:
Array.CreateInstance(GetType(String), New Integer(){5}, New Integer(){1}).
看(再次,真的很难看):http://msdn.microsoft.com/en-us/library/vstudio/x836773a