Array von Werten bearbeiten und Werte wieder an Variable zurückgeben

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von janbronner.

    Array von Werten bearbeiten und Werte wieder an Variable zurückgeben

    Liebe Community,

    ich bearbeite mehrere String Variablen mit einer Routine und will das Ergebniss wieder auf die Variable zurückschreiben.

    Der Code sieht so als Beispiel aus:

    Quellcode

    1. Dim wertlaengen = {positiv_Sollmenge, positiv_Istmenge, positiv_Ausschussmenge, positiv_Belagfläche, positiv_Schutzpotenzial_1, positiv_Vornickel_Stromdichte, positiv_Vornickel_Vorgabezeit, positiv_Vornickel_Schutzpotenzial, positiv_Vornickel_Autostart, positiv_Vornickel_Autostartverzögerung, positiv_Annickel_Stromdichte, positiv_Annickel_Vorgabezeit, positiv_Annickel_Wiederholungen, positiv_Annickel_Schutzpotenzial, positiv_Fertignickel_Stromdichte, positiv_Fertignickel_Vorgabezeit, positiv_Fertignickel_Schutzpotenzial}
    2. For i = 0 To 17
    3. laenge = namenslaenge(i).Count
    4. If laenge > 10 Then
    5. laenge = 10
    6. namenslaenge(i) = namenslaenge(i).Substring(0, laenge)
    7. End If
    8. Select Case laenge
    9. Case 0
    10. namenslaenge(i) = namenslaenge(i) + "__________"
    11. Case 1
    12. namenslaenge(i) = namenslaenge(i) + "_________"
    13. Case 2
    14. namenslaenge(i) = namenslaenge(i) + "________"
    15. Case 3
    16. namenslaenge(i) = namenslaenge(i) + "_______"
    17. Case 4
    18. namenslaenge(i) = namenslaenge(i) + "______"
    19. Case 5
    20. namenslaenge(i) = namenslaenge(i) + "_____"
    21. Case 6
    22. namenslaenge(i) = namenslaenge(i) + "____"
    23. Case 7
    24. namenslaenge(i) = namenslaenge(i) + "___"
    25. Case 8
    26. namenslaenge(i) = namenslaenge(i) + "__"
    27. Case 9
    28. namenslaenge(i) = namenslaenge(i) + "_"
    29. Case 10
    30. namenslaenge(i) = namenslaenge(i)
    31. End Select
    32. Next


    Wie bekomme ich es hin, dass das Ergebnis aus namenslaenge(0) wieder in die Variable positiv_Sollmenge zurückgeschrieben wird . Am besten alle Elemente im Array namenslaenge(0) wieder in die ursprünglichen Variablen

    Mir ist klar, dass es so wie es jetzt ist eine Variable mit dem Namen nameslaenge() erzeuge und dann nur noch in dieser arbeite, wie kann ich aber statt eine Variablen einen Art Verweis definieren, mit dem ich dann in einer for - next schleife eine große anzahl an Umformungen tätigen kann und das Ergebnis dann wieder in der ursprünglichen Variablen z.V. steht.

    Danke,

    JB

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    janbronner schrieb:

    Wie bekomme ich es hin, dass das Ergebnis aus namenslaenge(0) wieder in die Variable positiv_Sollmenge zurückgeschrieben wird
    So:

    VB.NET-Quellcode

    1. positiv_Sollmenge = namenslaenge(0)
    ==============
    Am besten ist es, Du schmeißt die String-Variablen raus und machst Dir ein Enum mit diesen Worten.
    Dann kannst Du per Enum-Index auf die Elemente des String-Arrays zugreifen.
    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!

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

    Hat zwar nix mit der Frage zu tun, aber offensichtliche Codeverbesserungen vereinfachen auch das Finden von Lösungen.
    Mach mal aus dem
    If laenge > 10 Then ein If laenge >= 10 Then, dann hast Du den letzten Case raus. Für die anderen:

    VB.NET-Quellcode

    1. namenslaenge(i) = namenslaenge(i) & New String("_"c, 10 - laenge)


    btw: Was IST überhaupt namenslaenge?
    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.
    Vielen Herzlichen Dank,

    das ist hilfreich für mich, danke an alle.

    Nochmal kurz zur Erklärung. Ich benutze Bascom um armega's zu programmieren. Da gibt es die Möglichkeit eine Variable (string) zu definieren und an der Gleichen Speicherstelle eine andere Variable als Overlay darüber zu legen.

    Das ist zum Teil extrem hilfreich. z.B:

    Dim Test as string*10 (ein String mit 10 stellen)
    Dim string_byte(9) as overlay Byte at string

    Damit bekommt man einen String und ein genau an der selben Stelle darüberliegendes Byte-Array.

    Wenn ich jetzt über eine UART-Schnittstelle Zeichen einlese (ein ATmega at nur einen 1 Byte Speicher in der UART) kann ich diese Zeichen per Interupt Zeichen für Zeichen in den String legen indem ich ein Startzeichen Suche , dann immer mit einem Zähler das Array anspreche und den String einlese) siehe BsP:

    VB.NET-Quellcode

    1. If Asc(udr) = 33 Then 'Wenn eingelesenes Zeichen Wert 33 dann
    2. Input_chr_rs232_counter = 0
    3. Input_chr_rs232 = ""
    4. End If
    5. Input_chr_rs232_x(input_chr_rs232_counter ) = Udr
    6. Incr Input_chr_rs232_counter
    7. If Input_chr_rs232_counter > 14 Then
    8. Lese_rs232 = 1
    9. Input_chr_rs232_counter = 0
    10. End If

    Gibt es in VB.net etwas vergleichbares wie dieses Overlay, ich werde mich morgen aber auch mit dem enum beschäftigen.

    Danke
    JB


    sorry, dass ist vollkommen chinesisch für mich.
    ich kenne kein bascom, kein armega, und overlays wie du sie andeutest (soweit ich verstanden habe) gibts in vb.net auch nicht.
    ich kenne keine UART-Schnittstelle, kein ATmega, und auch mit Interrupts hat man in vb.net nix zu schaffen.

    also absolut null plan, was gewünscht ist, und von daher bin ich auch wieder sehr unsicher, ob die Enum-Geschichte dir iwas bringen kann.

    Die Enum-Idee hatte den Zweck, deine wohl 30 verschiedenen Variablen aus post#1 durch ein Array zu ersetzen, und auf dessen 30 elemente dann dennoch mit gut verständlichem Code zugreifen zu können.
    Für UART, armega, Interrupts und overlays wüsste ich nicht, was das bringen soll.
    @ErfinderDesRades Jou.
    @janbronner Was hat UART mit Deinen Strings zu tun?
    Vielleicht stellst Du mal das ganze Problem bzw. Konzept verständlich dar.
    Dann werden wir gewiss eine ordentliche Lösung finden.
    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!
    Das Beispiel mit der Programmierung eines uC (ATmega) diente nur dazu, dass es dort möglich ist direkt mittels 2 Wegen auf einen String im Speicher zuzugreifen und diesen dann einmal als Chr-Array in einer For….next Schleife aufzufüllen, den String selber dann aber mittels String Befehlen zu bearbeiten....

    @EDR & @ RFG, ich denke, der Weg über die enum ist der richtige in vb.net.
    Nur zum Verständnis ob ich es richtig habe als Prinzip:

    VB.NET-Quellcode

    1. Dim stringbearbeitung(2) As String
    2. Enum MyEnum As string
    3. stringbearbeitung(0) = positiv_Sollmenge
    4. stringbearbeitung(1) = positiv_Istmenge
    5. stringbearbeitung(2) = positiv_Ausschussmenge
    6. End Enum


    Ich habe das versucht, ich sehe aber das es nicht funzt, ich glaube ich würde mich über ein Beispiel freuen.
    @janbronner Weit daneben.

    VB.NET-Quellcode

    1. Dim stringbearbeitung(2) As String
    2. Enum MyEnum
    3. positiv_Sollmenge
    4. positiv_Istmenge
    5. positiv_Ausschussmenge
    6. End Enum
    7. Private Sub Init()
    8. stringbearbeitung(MyEnum.positiv_Sollmenge) = "positiv_Sollmenge"
    9. stringbearbeitung(MyEnum.positiv_Istmenge) = "positiv_Istmenge"
    10. stringbearbeitung(MyEnum.positiv_Ausschussmenge) = "positiv_Ausschussmenge"
    11. End Sub
    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 empfehle dir ein gut Buch runterzuladen und durchzuackern.
    Viele .Net-Konzepte sind äussert schlau durchdacht, und wenn man nur lerningBeiDoing versucht, kapiert man nur die Hälfte, und das wäre echt dumm.
    So sind auch Enums etwas sehr listiges.
    Im Löffelmann-buch von 2005 ist ein sehr ausführliches und fabelhaftes Kapitel zu Enums. Das Buch findtste hier iwo verlinkt: Entwickler-Ressourcen und Tools, Bücher und WebCasts

    Das allermindeste, was du von Enums verstehen solltest: Ein Enum definiert einfach ein paar Zahlen, und gibt ihnen Namen.
    Daher funzte dein Ansatz schon nicht - Enum MyEnum As string - ist quatsch, denn ein String ist ja keine Zahl.

    Natürlich richtig ist Rods beispiel, sein MyEnum belegt die Zahlen 0, 1, 2 - also einfach fortlaufend der Reihe nach.
    Und diese Zahlen kann man - wie gezeigt - als Indizees eines String-Arrays verwenden.

    Im Grunde total simpel, und dabei äusserst performant.

    Aber ich empfehle dir nochmal nachdrücklich das genannte Buch.