Strings addieren. Länge wird zu groß

    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!

    • Strings addieren. Länge wird zu groß

      Hallo,

      Wenn ich einen String definiere und dann andere Strings dazu addiere, muss ich die Länge dann selbst im Auge behalten oder gibt mir Bascom da eine Hilfe?

      BSP.

      Quellcode

      1. Local Dummy As String * 100 : Dummy = ""
      2. Dummy = "Konfigstart" + Chr(13)
      3. Dummy = Dummy + "=" + Str(meldung_typ)
      4. Dummy = Dummy + "=" + Str(simpin )
      5. Dummy = Dummy + "=" + Str(simpuk )
      6. Dummy = Dummy + "=" + Alarm_nummer_1
      7. Dummy = Dummy + "=" + Alarm_nummer_2
      8. Dummy = Dummy + "=" + Alarm_nummer_3
      9. Dummy = Dummy + "=" + Alarm_text
      10. Dummy = Dummy + "=" + Str(pos_1)
      11. Dummy = Dummy + "=" + Str(alarm_aktion_port(1) )
      12. Dummy = Dummy + "=" + Str(alarm_aktion_port(2) )
      13. Dummy = Dummy + "=" + Str(alarm_aktion_port(3) )
      14. Dummy = Dummy + "=" + Str(alarm_aktion_port(4) )
      15. Dummy = Dummy + "=" + Name_port(1)
      16. Dummy = Dummy + "=" + Name_port(2)
      17. Dummy = Dummy + "=" + Name_port(3)
      18. Dummy = Dummy + "=" + Name_port(4)
      19. Dummy = Dummy + "=" + Str(level_port(1) )
      20. Dummy = Dummy + "=" + Str(level_port(2) )
      21. Dummy = Dummy + "=" + Str(level_port(3) )
      22. Dummy = Dummy + "=" + Str(level_port(4) )
      23. Dummy = Dummy + "=Konfigend"
      Alles anzeigen
      Wenn der String zu lange wird knallt es. Momentan zähle ich die Zeichen aber es muss doch auch irgendwie eleganter gehen...

      Gruß, Martin
    • Hallo Martin,
      nein, der Compiler kann da nichts machen, es sei denn, du addierst nur Konstanten.
      Die Länge der Variablen ist ja erst zur Laufzeit bekannt.
      Bzgl. der Strings innerhalb einer Funktion oder SUB (Local ...) musst du besonders vorsichtig sein.
      Sie werden ja im Frame gespeichert und dessen Größe muss also entsprechend konfiguriert werden. Das ist komplizierter als bei einer globalen Variable, wo der Platz für die beabsichtigte Größe vom Compiler angelegt wird. Beim Frame ist das so nicht möglich.
      Also wird dir nichts anderes übrigbleiben, als praktisch vor jedem Anhängen erst die Länge zu überprüfen, wenn du befürchtest, dass die Länge überschritten werden könnte.
    • Normal können Strings 255 Zeichen groß werden, sind Bigstrings configuriert bis 65535 (oder Ramende)
      Wenn es gesendet werden soll in Häpchen mit je ein ; am Ende damit kein CrLf mitgesendet wird.
      Oder einen Serial Buffer einrichten der nimmt nichts mehr entgegen bevor er überläuft.
      Im Report wird gewarnt falls ein String überfüllt werden kann(ein String in ein kleineren soll), aber ob er in diesem Fall die Zeilen addiert?
    • Pluto25 schrieb:

      Normal können Strings 255 Zeichen groß werden, sind Bigstrings configuriert bis 65535
      Ohh, das habe ich bisher nicht beachtet. Hab jetzt mal was probiert:


      Quellcode

      1. Local Dummy As String * 400
      2. Dummy = "1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1" + Chr(13)
      3. Dummy = Dummy + "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2" + Chr(13)
      4. Dummy = Dummy + "3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3" + Chr(13)
      5. Dummy = Dummy + "4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4" + Chr(13)
      6. Dummy = Dummy + "5aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5" + Chr(13)
      7. Dummy = Dummy + "6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6" + Chr(13)
      8. Dummy = Dummy + "7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7" + Chr(13)
      9. Dummy = Dummy + "8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8" + Chr(13)
      10. Print#pc , "@" ; Dummy ; Chr(13)
      Alles anzeigen
      Was ich jetzt nicht verstehe: Wieso wird die Größe 400 akzeptiert und wieso wird der komplette String gesendet? Bigstrings hab ich nicht konfiguriert.

      Selbst wenn ich "Local Dummy As String * 50" schreibe wird der komplette String gesendet. Komischerweise läuft das Programm ohne Probleme. Eigentlich sollte alles was nach 51 kommt mir Daten im Ram überschreiben.
    • Quellcode

      1. $sim
      2. $hwstack = 1500
      3. $swstack = 1500
      4. $framesize = 1500
      5. $regfile = "m1284pdef.dat"
      6. $crystal = 20000000
      7. Dim Dummy As String * 50
      8. Dim A As Integer
      9. Dim B As Byte
      10. A = 123
      11. B = 45
      12. Dummy = "1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1" + Chr(13)
      13. Dummy = Dummy + "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2" + Chr(13)
      14. Dummy = Dummy + "3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3" + Chr(13)
      15. Dummy = Dummy + "4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4" + Chr(13)
      16. Dummy = Dummy + "5aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5" + Chr(13)
      17. Dummy = Dummy + "6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6" + Chr(13)
      18. Dummy = Dummy + "7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7" + Chr(13)
      19. Dummy = Dummy + "8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8" + Chr(13)
      20. Print Dummy ; Chr(13)
      21. Print A
      22. Print B
      Alles anzeigen
      Wenn du dieses Beispiel im Simulator laufen lässt, wirst du die Auswirkungen des Überlaufs sehen. Die Variablen A und B werden überschrieben.
    • Pac-Man schrieb:

      Selbst wenn ich "Local Dummy As String * 50" schreibe wird der komplette String gesendet. Komischerweise läuft das Programm ohne Probleme. Eigentlich sollte alles was nach 51 kommt mir Daten im Ram überschreiben.
      Schau dir mal die Hilfe zu $Framesize und dabei auch für Memory-Usage an.
      Dann kannst du verstehen, wo sich das auswirkt.
      Und im Simulator kannst du das dann auch beobachten.

      Jogi schrieb:

      Da außer deiner Dummy-Variable keine weitere Variable verwendet wird, wird sich der Variablenüberlauf der Stringvariable nicht direkt bemerkbar machen.
      Wenn du dir den Speicheraufbau ansiehst, erkennst du, dass der Frame nicht die Variablen im SRAM überschreiben wird, sondern die Stacks. Die Auswirkungen sind ziemlich unvorhersagbar.

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