Denkfehler bei Structure mit Array-Datatype ?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Denkfehler bei Structure mit Array-Datatype ?

    Hallo Leute,

    vorweg: bitte keine Diskussion ob eine Structure nicht durch eine Klasse ersetzt werden sollte. Die Structure ist gegeben und muss adaptiert werden.

    Ich brauche im in der vorhandenen Structure "LogStructure" zweimal ein Double-Array mit der Dimension 924.

    Ich habe also "Stringdaten()" als Datentype "StringDatenStructure" hinzugefügt.


    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Structure StringDatenStructure
    3. Public RealTime_PV_u As Double
    4. Public RealTime_PV_i As Double
    5. End Structure
    6. <Serializable()>
    7. Public Structure LogStructure
    8. Dim Tag As Integer
    9. Dim DCLeistung As Double
    10. Dim ACLeistung As Double
    11. Dim BatterySOC As Double
    12. Dim ToGrid As Double
    13. Dim FromGrid As Double
    14. Dim HouseLoad As Double
    15. Dim Balcony As Double
    16. Dim Stringdaten() As StringDatenStructure
    17. End Structure
    18. Public MinuteneinesTages As Integer = 1440
    19. Public LoggingDaten(MinuteneinesTages) As LogStructure


    Laut Microsoft-Anleitung sollte man vor dem ersten Zugriff dann die Dimensionen erstellen:

    VB.NET-Quellcode

    1. ReDim LoggingDaten(MinuteneinesTages).Stringdaten(924)


    Möchte ich dann jedoch einen Wert zuweisen, dann bekomme ich den Fehler "System.NullRefereceExeption: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt":

    VB.NET-Quellcode

    1. ​LoggingDaten(1).Stringdaten(1).RealTime_PV_i = 1223


    Was übersehe ich, was mache ich falsch?
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    ReDim LoggingDaten(MinuteneinesTages).Stringdaten(924) (re)dimensioniert die Stringdaten der angegebenen LoggingDaten, und zwar die mit dem angegebenen Index. Da Du bei jener Zeile den LoggingDaten-Index MinuteneinesTages angegeben hast, werden also die Stringdaten vom 1441sten LoggingDaten-Eintrag gesetzt. Und die 1440 davor nicht. Wenn Du dann also auf LoggingDaten(1).Stringdaten zugreifst, gibt es einen Crash, weil die Stringdaten vom 2. LoggingDaten-Eintrag nicht gesetzt wurden.
    Dein vermutlicher Denkfehler: Dass Du mit der ReDim-Zeile die Stringdaten aller LoggingDaten-Einträge redimensionierst. Machst Du aber nicht. Du machst es nur für einen. Und zwar den letzten. Du musst z.B. mit einer Schleife arbeiten:

    VB.NET-Quellcode

    1. For i = 0 To MinuteneinesTages
    2. ReDim LoggingDaten(i).Stringdaten(924)
    3. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @dive26 Du hast ein Struktur-Array und n Strukturen.
    Bei Letzteren musst Du natürlich das innere Array instanziieren:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. <Serializable()>
    3. Public Structure StringDatenStructure
    4. Public RealTime_PV_u As Double
    5. Public RealTime_PV_i As Double
    6. End Structure
    7. <Serializable()>
    8. Public Structure LogStructure
    9. Dim Tag As Integer
    10. Dim DCLeistung As Double
    11. Dim ACLeistung As Double
    12. Dim BatterySOC As Double
    13. Dim ToGrid As Double
    14. Dim FromGrid As Double
    15. Dim HouseLoad As Double
    16. Dim Balcony As Double
    17. Dim Stringdaten() As StringDatenStructure
    18. Public Sub New(dummy As Boolean)
    19. ReDim Stringdaten(924)
    20. End Sub
    21. End Structure
    22. Public MinuteneinesTages As Integer = 1440
    23. Public LoggingDaten(MinuteneinesTages) As LogStructure
    24. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    25. For i = 0 To MinuteneinesTages - 1
    26. LoggingDaten(i) = New LogStructure(True)
    27. Next
    28. LoggingDaten(1).Stringdaten(1).RealTime_PV_i = 1223
    29. End Sub
    30. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VaporiZed
    Du bist der Beste. Vielen Dank. Das war der Denkfehler.
    Somit muss ich auch nicht umständlich eine Structure in die Structure packen, sondern kann ich es auch einfach mit einem Array machen:

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Structure LogStructure
    3. Dim Tag As Integer
    4. Dim DCLeistung As Double
    5. Dim ACLeistung As Double
    6. Dim BatterySOC As Double
    7. Dim ToGrid As Double
    8. Dim FromGrid As Double
    9. Dim HouseLoad As Double
    10. Dim Balcony As Double
    11. Dim RealTime_PV_i() As Double
    12. Dim RealTime_PV_u() As Double
    13. End Structure
    14. Public MinuteneinesTages As Integer = 1440
    15. Public LoggingDaten(MinuteneinesTages) As LogStructure
    16. For i As Integer = 0 To 1440
    17. ReDim LoggingDaten(i).RealTime_PV_i(24)
    18. ReDim LoggingDaten(i).RealTime_PV_u(24)
    19. Next i
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    mir scheint, es würde auch so gehen?

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Structure LogStructure
    3. Dim Tag As Integer
    4. Dim DCLeistung As Double
    5. Dim ACLeistung As Double
    6. Dim BatterySOC As Double
    7. Dim ToGrid As Double
    8. Dim FromGrid As Double
    9. Dim HouseLoad As Double
    10. Dim Balcony As Double
    11. Dim RealTime_PV_i(24) As Double
    12. Dim RealTime_PV_u(24) As Double
    13. End Structure
    14. Public MinuteneinesTages As Integer = 1440
    15. Public LoggingDaten(MinuteneinesTages) As LogStructure
    16. For i As Integer = 0 To 1440
    17. ' ReDim LoggingDaten(i).RealTime_PV_i(24)
    18. ' ReDim LoggingDaten(i).RealTime_PV_u(24)
    19. Next i