调用结构中的函数时出错



我一直被这个问题困扰,在网上找不到解决方案。我试着改变了一些事情,但没有成功。

我的问题是,我似乎无法在VB中调用结构中的函数。我的结构如下:

Private Structure patient
Public givenName As String
Public assignedDoctors() As String
Public doctorCount As Integer
Public infected As Boolean
Private pID As Double
'Simple status subprocedure
Public Sub ChangeStatus(ByVal status As String)
Select Case status
Case "positive"
infected = True
givenName = "{" & givenName & "}"
Case "tested"
infected = False
givenName = $"[{givenName}]"
Case "negative"
infected = False
givenName = $"<{givenName}>"
Case "untested"
infected = False
givenName = $"*{givenName}"
End Select
End Sub
Public Sub AddDoctor(ByRef doctor As String)
doctorCount += 1
ReDim Preserve assignedDoctors(doctorCount)
assignedDoctors(doctorCount) = doctor
End Sub
End Structure

我的错误发生在以下行:

Private Sub btnNew_Click(sender As Object, e As EventArgs) Handles btnNew.Click
Dim rPatient As patient
rPatient = New patient
rPatient.givenName = txtPatientName.Text
rPatient.doctorCount = 1
rPatient.assignedDoctors(1) = cbDoctor.Text
Call rPatient.ChangeStatus(status:=cbStatus.Text)
ArrayFix(rPatient.assignedDoctors, rPatient.givenName, rPatient.infected)
End Sub

rPatient是结构患者的一个实例。我的错误发生在"呼叫"线上。错误为:"对象引用未设置为对象的实例。">我曾试图使患者结构"共享",但我不知道共享参数是如何工作的,并试图在没有进展的情况下学习它。

如果有人能给我指明正确的方向,那将是非常有帮助的。谢谢

我重命名了控件以匹配我的测试应用程序。只要把它们改回你的就行了。

虽然您还没有使用过它,但pID可能应该是Integer。我在您的Select Case中添加了一个Case Else。这通常是个好主意。

AddDoctor方法中,我将doctorCount的增量移动到分配之后。net数组是从零开始的,所以第一个添加应该是索引0。

当您想要添加医生时,只需在实例上调用AddDoctor方法即可。不要试图从按钮代码添加到数组中,让您的方法来完成工作。您可以使用Button2添加其他医生。

Form.Load刚好填满了我的组合。我不知道ArrayFix应该做什么,所以我用它来打印病人。

Private Structure patient
Public givenName As String
Public assignedDoctors() As String
Public doctorCount As Integer
Public infected As Boolean
Private pID As Integer
Public Sub ChangeStatus(ByVal status As String)
Select Case status
Case "positive"
infected = True
givenName = $"{givenName}" 'let's be consistent and use the interpolated string
Case "tested"
infected = False
givenName = $"[{givenName}]"
Case "negative"
infected = False
givenName = $"<{givenName}>"
Case "untested"
infected = False
givenName = $"*{givenName}"
Case Else
infected = False
givenName = $"xx{givenName}xx"
End Select
End Sub
Public Sub AddDoctor(doctor As String)
ReDim Preserve assignedDoctors(doctorCount)
assignedDoctors(doctorCount) = doctor
doctorCount += 1
End Sub
End Structure
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim Docs() As String = {"Dr. Mathew", "Dr. Mark", "Dr. Luke", "Dr. John"}
ComboBox1.Items.AddRange(Docs)
Dim Stats() As String = {"positive", "tested", "negative", "untested"}
ComboBox2.Items.AddRange(Stats)
End Sub
Private rPatient As patient
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Add patient
rPatient = New patient
rPatient.givenName = TextBox2.Text
rPatient.AddDoctor(ComboBox1.Text)
rPatient.ChangeStatus(ComboBox2.Text) 'Status
ArrayFix(rPatient)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 'Add Another Doctor
rPatient.AddDoctor(ComboBox1.Text)
ArrayFix(rPatient)
End Sub
Private Sub ArrayFix(p As patient)
Debug.Print($"Patient Name - {p.givenName}, Infected: {p.infected} ")
Debug.Print($"{vbTab}Patient's Doctors")
For Each MD In p.assignedDoctors
Debug.Print($"{vbTab}{vbTab}{MD}")
Next
End Sub