Wie könnte man eine 0 in einem String verwenden

    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!

    • Hallo Mitch64

      ich habe nun deine lib ausprobiert und sie funktioniert soweit, wobei ich noch ohne Checksumme arbeite.
      Allerdings habe ich ein Problem beim Umkopieren von einem String in ein Array.
      Es werden nach dem 2. Zeichen 2 andere Werte (scheinbar die Stringlänge und noch etwas) an der 3. und 4. Stelle eingesetzt. Danach geht es normal weiter.
      Ich habe lange gesucht und nichts gefunden ?( ; vielleicht sehe ich vor lauter Bäumen den Wald nicht mehr.
      Die Umkopierroutine alleine funktioniert richtig, nur im Zusammenspiel mit dem Rest nicht.
      Ich habe das Progamm angehängt und ein .gif das den Fehler zeigt.

      Gruss
      jepe
      Dateien
    • Hallo Mich64
      wenn du die EA-lib.inc herunterlädst ist es bei "Sub CopyStringZero(ByVal Source as String) "
      Dort habe ich Print-Anweisungen eingeführt, vor dem Umkopieren "Source" und nach dem Umkopieren "was kommt heraus".
      Die Resultate findest du im .gif-Bild als Source und Buffer.
      Das Umkopierprogramm alleine (ohne weiteren Balast) funktioniert.

      Bei deiner Original-lib ist es Zeile 270 MemCopy

      Gruss
      jepe

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jepe () aus folgendem Grund: Nachtrag

    • Ich hab mir den Code jetzt mal angeschaut.
      Das Problem tritt wohl auf mit dem Aufruf von CopyStringNull(Text).

      Innerhalb der Routine wird die Stringlenge mit len ermittelt.
      Genau diese Function überschreibt den Speicher, wo der Text steht.
      Ich habe probiert, die lokale Variable tlen als Integer zu dimensionieren, der Effekt bleibt.

      Bascom überschreibt aus mir nicht ersichtlichen Gründen den Speicher, wo der Text steht.

      Im Simulator kann man das schön sehen, wenn man sich die lokalen Variablen anzeigen (Fokus auf Source) lässt und durch die Routine CopyStringZero() durch-steppt.

      Ich tippe da mal auf ein BUG in Bascom.

      Abhilfe schafft da nur diese Variable als local rauszunehmen und global zu deklarieren (als Byte).
      Im Simulator funktioniert es dann. Allerdings nur bis zu der Addition, die du hinzugefügt hast (laenge = tlen + BufferIndex). Da wird der lokale Framebereich wieder überschrieben.

      Also len als globale Variable dimensionieren und deine Addition raus nehmen.
      Dann müsste es gehen.
    • Ich hätte jetzt einen Fehler in Bascom vermutet.

      Ich habe Mark angeschrieben wegen dem Problem.
      Er meint, man müsse in dem Kopf der Sub / Funktion beim deklarieren die Stringlänge mit angeben.
      Also etwa so:

      Declare Sub CopyBegin() ' Initialisierung vor dem Beschreiben des Buffers
      Declare Sub CopyEnd() ' Beendes das Beschreiben des Buffers, Checksum-Berechnung
      Declare Sub CopyByte(ByVal Source as Byte) ' kopiert ein Byte in den Buffer
      Declare Sub CopyWord(ByVal Source as Word) ' kopiert Word in den Buffer
      Declare Sub CopyString(ByVal Source as String * 20) ' kopiert String in den Buffer (ohne Null-Byte)
      Declare Sub CopyStringZero(ByVal Source as String * 20) ' kopiert String mit Null-Byte in den Buffer


      Beachte bei den String-Parametern das "String * 20".

      Ich habe es probiert und es scheint zu funktionieren.

      Leider steht in der Bascomhilfe nichts davon.
      Strings werden dort in den Beispielen immer ohne Stringlänge angegeben. Also ohne die Angabe "* 20".

      @jepe
      Kannst du das bestätigen?

      Vergesse nicht, die lokalen variablen wieder zu aktivieren.
    • Jetzt wollte ich gerade eine erweiterte lib hochladen :) und sehe deinen Beitrag.
      Ich kann bestätigen dass es so funktioniert. a_42_02cc30b2
      Allerdings habe ich aus Versehen zuerst die Stringlänge in der Deklaration:
      Declare Sub EA_Text(Byval A as string * 2 , Byval Text as String *30 , Byval x as Word , Byval y as Word)
      geändert. Dies hat, mindestens in meiner Konfiguration, auch funktioniert.

      Anbei eine erweiterte lib.
      Man kann nun zwar sehr schnell die lib ergänzen aber es braucht sehr viele Einträge.
      Leider sind die nach den Buchstaben folgenden Parameter mal mit
      - verschiedene Anzahl Bytes
      - verschiedene Anzahl Word
      - Byte und Word gemischt inkl. verschiedener Anzahl
      - Text dazwischen
      Das macht das Ganze unübersichtlich.
      z.B. je eine Sub mit 0,1,2,3,4,5,6 Bytes und mit 1,2,3,4,5,6 Word macht schon mal 13 Sub's und dann noch der ganze Rest.
      Mal sehen was ich brauche.
      Dateien
      • Demo_1.bas

        (2,87 kB, 3 mal heruntergeladen, zuletzt: )
      • EA_lib_V0.0.3.inc

        (20,96 kB, 1 mal heruntergeladen, zuletzt: )
    • @jepe
      Übrigens schreibst du in deinem Programm (Datenlogger) öfter

      BASCOM-Quellcode

      1. Gosub Write_edip




      Um künftig keine Überraschungen mit deinem Code zu erleben (z.B. nach einem Update von Bascom), empfehle ich dir,
      den Aufruf der Sub korrekt auszuführen.

      Entweder

      BASCOM-Quellcode

      1. Call Write_edip() ' mit leerer Klammer

      oder nur den Namen der Sub aufrufen

      BASCOM-Quellcode

      1. Write_edip ' ohne Klammer, dann Call weglassen

      anzugeben.

      Achte auch auf korrekte Definition und Deklaration der Sub.

      Wenn keine Parameter notwendig sind, muss eine leere Klammer angegeben werden. Siehe Bascomhilfe!
      etwa so:

      BASCOM-Quellcode

      1. Declare Sub Write_edip() ' Deklaration

      Oder bei der Definition der Sub

      Quellcode

      1. Sub Write_edip() ' leere Klammer!
      2. ' Inhalt der Sub
      3. End Sub

      Das nur am Rande.