winsock SPLIT 数组
Posted
技术标签:
【中文标题】winsock SPLIT 数组【英文标题】:winsock SPLIT array 【发布时间】:2013-09-06 15:29:26 【问题描述】:我的服务器上有这段代码,用于创建更新消息
StrMsg = "1~Server~"
For x = 0 To Combo1.ListCount - 1
If x = Combo1.ListCount - 1 Then
StrMsg = StrMsg & Combo1.List(x)
Else
StrMsg = StrMsg & Combo1.List(x) & "~"
End If
Next x
' send it to every connected clients
For x = 0 To clientCounter - 1
sckClients(x).SendData StrMsg
Next x
客户端会收到然后放到ComboBox1上
Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Dim strMsg As String, tmp() As String, i As Integer
sckClient.GetData strMsg$, vbString
tmp$() = Split(strMsg$, "~")
For i% = 1 To CInt(tmp$(0)) - 1
Combo1.AddItem tmp$(i%)
Next i%
sckClient.GetData strData, vbString
End Sub
但是为什么我总是得到一个运行时错误 13 类型不匹配??
这里似乎有什么问题? -_-
【问题讨论】:
单步调试代码。特别是检查 tmp(0) 的值。如果这没有帮助,你会在哪一行得到错误? 【参考方案1】:Split() 函数返回 String 数组类型的 Variant,而不是 String 数组。除此之外,我会删除变量的类型声明符号 - 它们是对旧版本 BASIC 的回归。
Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Dim strMsg As String
Dim vastrTmp As Variant
Dim i As Integer
sckClient.GetData strMsg, vbString
vastrTmp = Split(strMsg, "~")
For i = 1 To CInt(vastrTmp(0)) - 1
Combo1.AddItem vastrTmp(i)
Next i
sckClient.GetData strData, vbString
End Sub
【讨论】:
【参考方案2】:我有几个问题:
就像 jac 问:你在哪一行得到错误?
为什么要循环到 CInt(tmp$(0))-1 在您发布的代码中,您发送的字符串始终以 1~ 开头,因此 tmp$(0) 将始终为 1,因此您将从 1 查找到 0(永远不会)
为什么在 DataArrival 结束时又调用 GetData ?
使用带有 split() 的字符串数组效果很好,我什至比使用变体更喜欢它。 使用变量声明总是一件好事:它使您的代码更易于阅读,并且在未声明变量时使用(慢)变体时,VB 会稍微加快速度
据我所知,唯一的类型不匹配可能来自 CInt() 尽管它永远不会与您发布的代码一起到达那里
用 Val() 替换 CInt(),你不应该再得到类型不匹配,但注意任何非数字值都会被转换为 0
这就是说:我用你的代码创建了一个项目并且没有得到任何类型不匹配
【讨论】:
以上是关于winsock SPLIT 数组的主要内容,如果未能解决你的问题,请参考以下文章
VB6 中的 Winsock 控件只向数组中的最后一个索引发送文本消息