Zugriff auf Struct-Elemente in Unterfunktion durch übergebene Strings

  • VB.NET

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

    Zugriff auf Struct-Elemente in Unterfunktion durch übergebene Strings

    Hallo zusammen,

    ich habe eine mittlerweile relativ große struct mit vielen Variablen, die alle nach einem bestimmten System sortiert werden sollen.
    Um den Code übersichtlich zu halten würde ich den Sortieralgorithmus gerne auslagern und als String die zu sortierende Variable übergeben.
    Ich bekomm nur die Übergabe nicht richtig hin, den lokalen String auswahlvariable sucht visual studio dann vergeblich in meiner Struktur, schätze also es handelt sich um einen grundlegenden Fehler bei der Ansprache der Struktur?


    Bin für jede Hilfe dankbar!


    Quellcode

    1. public struct verzahnung
    2. dim pressung as double
    3. dim kraft as double
    4. dim bla as double
    5. dim soll() as solldaten
    6. end structure
    7. 'hauptprogramm - aufruf der subroutine durch übergebenen string
    8. ....
    9. ...
    10. call calc_sort(verzahnung, "pressung", ret)
    11. ....
    12. .
    13. 'und schließlich die subroutine in der form:
    14. calc_sort(byref verzahnung as verzahnung, byref auswahlstring as string, byref ret as short)
    15. verzahnung.soll(i) = verzahnung.auswahlstring 'damit sollte jetzt beispielsweise die pressung abgesprochen werden
    hmm, ich verstehe wohl nicht so ganz Dein Problem:

    VB.NET-Quellcode

    1. verzahnung.soll(i) = verzahnung.auswahlstring ' die Structure Verzahnung hat kein Member namens auswahlstring

    kann aus dem dokumentierten Grund nicht funktionieren. Ausserdem sehe ich hier weder wie 'i' definiert ist, noch irgendetwas mit Bezug aufs Sortieren.

    Vielleicht ebenfalls überlegenswert
    - Klasse statt Struktur nehmen und Sortierung einbauen, -> Kapselung
    - statt Array lieber eine List(of Solldaten) , da komfortabler

    Strukturen sind eh 'Klassen für Arme' , in objektorientierten Anwendungen sind sie daher nicht mehr so häufig zu finden wie noch in VB6

    Edit: und für die Rückgabe eines Wertes 'ret' gibt es Funktionen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kangaroo“ ()

    Was Du meinst heißt unter C / C++ Union.
    Unter .NET geht das nicht so wie Du denkst, da keine initialisierten Felder in einer Struktur enthalten sein können.
    Sieh Dir aber folgendes Beispiel an (Form und Button):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <StructLayout(LayoutKind.Explicit)> _
    4. Structure TEST
    5. <FieldOffset(0)> _
    6. Public pressung As Double
    7. <FieldOffset(8)> _
    8. Public kraft As Double
    9. <FieldOffset(16)> _
    10. Public bla As Double
    11. <FieldOffset(0)> _
    12. Public soll1 As Double
    13. <FieldOffset(8)> _
    14. Public soll2 As Double
    15. <FieldOffset(16)> _
    16. Public soll3 As Double
    17. End Structure
    18. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    19. Dim tt As TEST = New TEST
    20. tt.kraft = 17
    21. MessageBox.Show(tt.soll2.ToString)
    22. End Sub
    23. 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!
    Ich hab nur versucht, das Problem aufs wesentliche zu reduzieren, die Sortierung spielt dafür ja keine Rolle.
    Ich bräuchte im Prinzip ja nur eine Art Platzhalter statt der tatsächlichen Variablen im Code, um eben viele verschiedene Variablen mit der Stringübergabe ansprechen zu können.
    An der Struktur des Programms kann ich nichts grundlegendes ändern, weil es sich um ein bestehendes Projekt handelt zu dem ich nur einen Teil selbst programmiere, und da ist die Struktur leider so vorgegeben.

    Wenns so gar nicht möglich ist muss ich den Code eben unübersichtlich lassen und die ~20 Zeilen Code, den ich zum sortieren benötige, für jede Variable mit copy/pase aufrufen.
    Fange vielleicht mal an, indem Du Option Explicit On oben in alle Deine Quelltext-Zeilen oder gleich ins Projekt schreibst.
    Double-Wert = String-Wert
    und
    String-Wert = Double-Wert
    geht nämlich vor die Hose.
    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!

    lumpenseppal schrieb:

    Ich bräuchte im Prinzip ja nur eine Art Platzhalter statt der tatsächlichen Variablen im Code

    aha, mit ein bisschen Nachhilfe hab ich Dein Problem mittlerweile verstanden (hoffe ich): Du willst ein Feld Deiner Struktur über dessen Namen variabel ansprechen.

    Prinzipiell geht das über Reflection, aber ich würde es nicht anraten. Ich vermute hier liegt eher ein Design-Problem zugrunde.

    lumpenseppal schrieb:

    weil es sich um ein bestehendes Projekt handelt zu dem ich nur einen Teil selbst programmiere, und da ist die Struktur leider so vorgegeben.

    Mein Beileid ...
    Ich denke er möchte die Member der Struct über Ihre Namen ansprechen.
    Das ginge über System.Reflection, zumindestest um die Werte zu erhalten.
    (YourType.GetType.GetField("Name").GetValue())

    Ob dies wirklich das gelbe vom Ei ist, bleibt fraglich.

    Allerdings denke ich, dass die anderen ein wenig an dir vorbei reden :D
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    Ich denke er möchte die Member der Struct über Ihre Namen ansprechen.
    Das ginge über System.Reflection, zumindestest um die Werte zu erhalten.
    (YourType.GetType.GetField("Name").GetValue())
    Entschuldigt, gut möglich das ich mich nicht eindeutig ausgedrückt habe.
    In der Struct sind mehrere Variablen, ich möchte jetzt durch einen String, der dem Namen einer Variable entspricht, auf diese Variable zugreifen. Das entspricht wohl dem was du meinst :)
    Werde mich mal in Reflection einlesen und damit herumprobieren.


    Für mich ist VB noch ziemlich neu und das Projekt relativ umfangreich, aber man kann wohl nicht immer bei seinem eigenen Projekt und 0 starten, muss man durch :) (Ist Bestandteil einer Bachelorarbeit)
    Da hast Du ja einen echt weniger guten Anfang gemacht.
    Mit Deinem Namen lumpenseppal übrigens auch.
    Wenn Du Dich mit C++ auskennst, verlagere die Sortierung in eine DLL, das geht q&d.
    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!

    lumpenseppal schrieb:

    ich habe eine mittlerweile relativ große struct mit vielen Variablen, die alle nach einem bestimmten System sortiert werden sollen.
    Um den Code übersichtlich zu halten würde ich den Sortieralgorithmus gerne auslagern und als String die zu sortierende Variable übergeben.

    Dassis unklar ausgedrückt. Mich erinnert das an die Möglichkeit, Datenklassen nach verschiedenen Kriterien zu sortieren.
    Die Kriterien werden aber üblicherweise nicht als Strings formuliert, sondern man verwendet Delegaten, oder noch feiner geht das mit anonymen Methoden.
    Bevor ich da aber weiter drauf eingehe, solltest du erstmal bestätigen, ob ich dich ühaupt richtig verstanden habe.

    Reflection ist eine Performance-katastrofe - Lösungen mit Reflection sind eiglich immer Hacks (geht manchmal nicht anders, aber sollte wirklich das allerletzte Mittel sein) .