Declare Sub mit Stringvariable

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Declare Sub mit Stringvariable

      Hallo Bascom-User,

      ich habe zwei kleinere Verständnisprobleme im Umgang mit Declare Subs und string-Übergabe. (Siehe Beispiel-Schnipsel)

      Habe dazu keine Erläuterungen/Hinweis finden können.

      Bisher bin ich davon ausgegangen, dass bei Declare Subs keine Rückgabe von Variablen aus den Subs möglich ist, dies ist lediglich via Function gegeben.

      1.) Im Beispiel wird jedoch die Variable „Signal“ aus der Sub ins aufrufende Programmteil zurückgegeben, oder sehe ich das falsch.

      2.) Obwohl die Variable „Signal“ als /string*1/ definiert wurde, wird sie doch als beliebig lange Stringvariable zurückgegeben

      Wie kann ich mir dies erklären?

      BASCOM-Quellcode

      1. '------------------------------------------------------------------------------
      2. 'Declare Test mit strings
      3. '------------------------------------------------------------------------------
      4. '
      5. $regfile = "m328pdef.dat" '
      6. $crystal = 16000000
      7. $baud = 9600
      8. $hwstack = 64
      9. $swstack = 64
      10. $framesize = 64
      11. $sim
      12. Dim Signal As String * 1 'versuchsweise auf 1 definiert
      13. Declare Sub Meintest(s As String)
      14. Do
      15. Signal = "" 'Signal als Leerstring
      16. Meintest Signal
      17. Print Signal
      18. Stop
      19. Loop
      20. End
      21. Sub Meintest(s As String)
      22. S = "test-test-test-test"
      23. End Sub
      Alles anzeigen
    • Zurück gegeben wird nix, du verwendest deine Variable 'Signal' einfach an 2 verschiedenen Stellen. In deiner sub wird ja 'Signal' zur Verfügung sein, aber nicht geändert.
      Ich bin mir jetzt nicht sicher, ob s="....." einfach den ersten Buchstaben übernimmt und den Rest verwirft, oder sogar innerhalb einer sub das s jetzt auf max. Größe 'gedimt' ist.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo Ulrich,
      bzgl. der Stringlänge: der Compiler überprüft Zuweisungen an einen String nur, wenn Konstanten übergeben werden.
      Signal = „abc“ wird also zu einem Fehler führen.
      In der Sub sieht es leider anders aus. Dort hast du den Parameter s über byref (default) an die Variable Signal gebunden. Jeder Zugriffauf s geht also tatsächlich auf Signal.
      Dies überprüft der Compiler aber nicht. Die Zuweisungüberschreibt die hinter Signal liegenden Speicherbereiche.
      Die sind bei dir leer, daher passiert nichts negatives.

      Ich würde jetzt nicht sagen, dass die Variable Signal "zurückgegeben" wird, denn es wird ja nicht auf einer Kopie gearbeitet, sondern direkt auf dem Original.
      Diese Vorgehensweise ist jetzt streng genommen nicht sauber, da implizit an anderen Variablen geändert wird, wie es eigentlich scheint.
      Ist aber auch ganz hilfreich, weil sonst (byval) der Wert von Signal beim Aufruf der Sub erst einmal komplett in den Frame kopiert werden müsste.
      Dies kann bei großen Strings recht lange dauern.
    • @hero ok, wenn jetzt Ulrich eine weitere Variable nach 'Signal' 'dimen' würde, würde diese durch den Aufruf der sub dann hemmungslos überschrieben werden?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • hero schrieb:

      Übergabe schon, Rückgabe über die Parameter ist nach der reinen Lehre eigentlich so nicht vorgesehen.
      Okay eine Unterprozedur oder eine Funktion kann Parameter übergeben bekommen. Eine Funktion kann zusätzlich auch noch Werte zurück geben.
    • Jetzt ich nochmal. Auf das Beispiel von Ulrich bezogen: der Aufruf der sub legt einen 's alias signal' an, der aber nur innerhalb der sub gilt?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo hero,

      habe mal versucht die Bemerkung von tschoeatsch aus #5 im den kleinen Programmschnitzel umzusetzen. Das Ergebnis der Simulation bzgl. der Reihenfolge Speicherplätze verwundert mich etwas. Aber es zeigt schon auf, was du beschrieben hast, dass man genau verstanden haben muss, was und warum man es macht.

      Unten im Simulatorbild sieht man, dass die Variable 'A' etwas mehr enthält, als sie soll. Aber keine Probleme gibt es anscheinend, wenn die Dimensionierung für die Stringgröße von Signal nur groß genug gewählt wird, was noch verwirrender erscheint.


      BASCOM-Quellcode

      1. '------------------------------------------------------------------------------
      2. 'Declare Test mit strings
      3. '------------------------------------------------------------------------------
      4. '
      5. $regfile = "m328pdef.dat" '
      6. $crystal = 16000000
      7. $baud = 9600
      8. $hwstack = 64
      9. $swstack = 64
      10. $framesize = 64
      11. $sim
      12. Dim Signal As String * 1 'versuchsweise auf 1 definiert
      13. Dim A As String * 10
      14. Declare Sub Meintest(s As String)
      15. A = "1234567890"
      16. Do
      17. Signal = "" 'Signal als Leerstring
      18. Meintest Signal
      19. Print "Signal=" ; Signal
      20. Print
      21. Print "A = " ; A
      22. Stop
      23. Loop
      24. End
      25. Sub Meintest(s As String)
      26. S = "abcdefghij=test1-test2-tes3t-test4"
      27. End Sub
      Alles anzeigen
      Dateien

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Ulrich ()

    • Was wundert dich?
      'Signal' als string*1 brauch 2 byte, danach kommt der Platz für die Variable 'A'. Singnal wird hemmungslos überschrieben und A erhält den Rest, was nicht in die 2 bytes passt. 'ab' fehlen. 'A' ist jetzt ein 'Teiloverlay' von 'Signal'
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Oh. Kommentar wohl falsch verstanden. Hier geht es wohl um die Variable Signal(Typ-String) die mit Highlevel-Befehle "SUB" nicht korrekt ein Wert übergibt.
      @hero hat es geschrieben byref ist (default). Byval ist eine alternative. Hat aber nix mit Variable- Typ zu tun.
      Sub ist ein abgeschlossener Programmbereich, der eigene "lokale" Variablen besitzen kann. Lokale Variablen sind außerhalb dieser Unterprozeduren und Funktionen nicht sichtbar und können somit den Programmablauf nicht beeinflussen. Und genau das wird immer wichtiger, je größer ein Programm wird. Einzelne Programmteile lassen sich leichter überschauen.
      Ja und nur wenn gewünscht dürfen andere Programmteile diese Parameter/Variablen „nutzen“.
      Die BASCOM Highlevel-Befehle sind oft kreativ anwendbar. Da liegt ja meine Begeisterung auch hier im Forum.
      Wer geht welchen Weg, ist er kürzer aber beschwerlicher oder nur ein Kreislauf usw.

      Ulrich schrieb:

      Bzgl. Declare ... :Man muss bei der Parameterübergabe immer beachten, ob man byref oder byval übergibt.
      Nicht nur. Der Wert ist oft die Kleinigkeit der ein großes Problem verursachen kann.

      Mit freundlichen Grüßen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fredred ()