Ankündigung

Einklappen
Keine Ankündigung bisher.

Fragen zu stringset

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Featurewunsch] Fragen zu stringset

    Hallo,

    zwei Fragen zum stringset Befehl:

    1. Funktioniert eigentlich die Invalidierung auch bei stringset?
    2. Wird eine Stringvariable bei Zuweisung vollständig kopiert, also auch die Nullbytes?

    Falls beides nicht zutrifft, wäre das ein Featurewunsch.

    Hintergrund ist, dass ich in meinem Lernmakro gerne eine Funktion bereitstellen würde, die alternativ zum Speichern in der Remanentspeicher, den Lernvektor an den HomeControl Server übeträgt. Dazu würde ich den aktuellen Stand des Lernvektors in eine neue Variable zum Rausschreiben kopieren, um "Aliasing" Effekte zu vermeiden.

    Sofern das Funktioniert, würde ich gerne im HomeControl Server ein generisches Protokoll zum Speichern und wieder Abrufen von Daten realisieren.

    Gruss
    Arno

    #2
    Zitat von pernozzoli Beitrag anzeigen
    1. Funktioniert eigentlich die Invalidierung auch bei stringset?
    2. Wird eine Stringvariable bei Zuweisung vollständig kopiert, also auch die Nullbytes?
    1. Wenn du stringset auf einen String anwendest, kannst Du mit change() die Veränderung gemäß Validierung erkennen. Also Ja.
    2. a=b : Wenn b 7 Zeichen hat, werden in a 7 Zeichen plus Nullbyteterminierung geschrieben. Da jeder String intern statisch 1400 Zeichen allokiert, sind somit noch 1392 Zeichen ggf. unverändert. Wenn Du hier alle Zeichen von b nach a kopieren willst, muss Du mit stringset arbeiten. Also auch Ja (würd ich sagen)
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Das Probem ist wohl eher, wenn b z.B. 400 Bytes per stringset zugewisen wurden, und a nun einfach b zugewiesen wird, dann wird b nur bis zum ersten Nullbyte kopiert. Damit ist dann a sehr wahrscheinlich keine vollständige Kopie von b, denn in den 400 Bytes von b sind sehr wahscheinlich auch Nullbytes enthalten. Das ist bei Nutzung eines Strings als Array nicht das, was gewünscht ist. Das Problem wäre gelöst, wenn grundsätzlich immer alle 1400 Bytes kopiert werden würden.
      Da das nicht immer sinnvoll ist, wäre eine mögliche Lösung ein zusätzlicher Kopierbefehl, der das tut, ggf. zur Performancesteigerung mit Angabe der Anzahl der zu kopierenden Bytes.
      Tessi

      Kommentar


        #4
        Hallo,

        als Ergänzung würde ich mir noch eine Erweiterung der TCP / UDP Kommunikation wünschen, um das Array am Stück zu senden bzw. zu empfangen.

        Gruss
        Arno

        Kommentar


          #5
          Zitat von Tessi Beitrag anzeigen
          Das Problem wäre gelöst, wenn grundsätzlich immer alle 1400 Bytes kopiert werden würden.
          stringset terminiert die Strings anhand des Nullzeichens, das ist richtig. Da bräuchten wir dann halt noch ne weitere Funktion.
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Zitat von enertegus Beitrag anzeigen
            stringset terminiert die Strings anhand des Nullzeichens, das ist richtig.
            Hm, ich vermute mal, das sollte jetzt wohl nicht stringset sondern die Zuweisung a=b heißen?

            Zitat von enertegus Beitrag anzeigen
            Da bräuchten wir dann halt noch ne weitere Funktion.
            Ja, bitte .
            Am besten mit Angabe, wie viele Bytes kopiert werden sollen, damit man bei genau bekannter Ausnutzung des Strings auch mal weniger als 1400 Bytes kopieren kann.

            BTW: Wenn die "normale" Zuweisung nur bis zum ersten Null-Byte kopiert, ein String aber immer 1400 Bytes belegt, ist dann der Rest undefiniert oder fix vorbelegt?
            Und ist der String tatsächlich 1401 Bytes lang, damit auch bei voller Ausnutzung noch ein Null-Byte angehängt werden kann? Oder fehlt dieses Terminierungszeichen bei voller Ausnutzung?
            Tessi

            Kommentar


              #7
              Zitat von Tessi Beitrag anzeigen
              Hm, ich vermute mal, das sollte jetzt wohl nicht stringset sondern die Zuweisung a=b heißen?
              nein, das ist in beiden Fällen so.
              BTW: Wenn die "normale" Zuweisung nur bis zum ersten Null-Byte kopiert, ein String aber immer 1400 Bytes belegt, ist dann der Rest undefiniert oder fix vorbelegt?
              Die Zeichen sind mit 0 vorbelegt. Der Debugger zeigt dies auch an.
              Oder fehlt dieses Terminierungszeichen bei voller Ausnutzung?
              Es gehen 1400 Bytes, das Terminierungszeichen ist ein Byte.
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar


                #8
                Zitat von enertegus Beitrag anzeigen
                nein, das ist in beiden Fällen so.
                Das verstehe ich jetzt nicht. Stringset kopiert doch einfach alle Bytes einer Variablen in einen String ab der angegebenen Position. Die Variable kann dabei auch nur Null-Bytes enthalten, das darf nach meinem Verständniss keine Rolle spielen. Oder gibt es da eine Sonderbehandlung, wenn es sich bei der Variablen auch um einen String handelt?

                Zitat von enertegus Beitrag anzeigen
                Die Zeichen sind mit 0 vorbelegt. Der Debugger zeigt dies auch an.
                OK, bislang nutze ich noch keine Strings, daher ist mir das noch nicht aufgefallen...
                Aber gilt das auch noch, wenn eine Variable mit einem String kürzerer Länge überschrieben wird? Bleibt die "Altlast" dann vorhanden oder wird sie mit Nullen überschrieben?

                Zitat von enertegus Beitrag anzeigen
                Es gehen 1400 Bytes, das Terminierungszeichen ist ein Byte.
                Muß das letzte Zeichen eine Null sein?
                Wenn also String1 und String2 jeweils 1000 Zeichen enthalten (plus Null-Terminierung) und ich füge diese zusammen:
                String0 = String1 + String2
                habe ich dann 1000 Zeichen von String1 plus 399 Zeichen von String2 plus Terminierung oder habe ich dann 1000 Zeichen von String1 plus 400 Zeichen von String2 und keine Terminierung? (Ich kann das momentan leider nicht selber ausprobieren...)
                Dahinter steht auch die Frage, kann ich in den 1400 Bytes 350 4-Byte-Werte mit stringset packen, oder eben nur 349, weil beim 350. sonst das letzte Byte immer auf Null gesetzt werden würde?
                Wenn ich mit stringset einen 14-Byte-String in einen 1400-Byte-String kopiere, belegt der dann 15 Byte?

                Die Antworten darauf konnte ich im Handbuch leider nicht finden...
                Tessi

                Kommentar

                Lädt...
                X