Autor Thema: chr()-Funktion nicht sicher!  (Gelesen 6149 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

riedel2

  • Gast
chr()-Funktion nicht sicher!
« am: 04. Februar 2008, 09:09:50 »
Hallo!

Ich musste leider feststellen, dass das Ergebnis, welches von der chr()-Funktion zurückgeliefert ist, nicht immer sicher ist.
Das Zeichen, das zurückgeliefert wird, ist nicht null-Terminiert. D.h. unter Umständen können auch mal mehr Zeichen zurückgeliefert werden.
Und zwar genau dann, wenn im Speicher hinter dem eigentlichen Zeichen keine Null steht. Es werden dann soviele Zeichen zurückgeliefert, bis das
nächste Null-Zeichen kommt, oder der String überläuft (Standard: 80 Zeichen).
Das ist nicht so doll!

Originalfunktion CHR():
================
FUNCTION CHR : STRING
VAR_INPUT
   C : BYTE;
END_VAR
VAR
   PT : POINTER TO BYTE;
END_VAR

PT := ADR(CHR);
PT^ := C;



Mein Vorschlag:
============
FUNCTION CHR : STRING
VAR_INPUT
   C : BYTE;
END_VAR
VAR
   PT : POINTER TO BYTE;
END_VAR

PT := ADR(chr);
PT^ := C;
PT:=PT+SIZEOF(PT^);
PT^:= 0;



Damit wird das darauffolgende Zeichen null-terminiert und es ist sichergestellt, dass auch nur 1 Zeichen zurückgeliefert wird.
Bitte die Funktion CHR() entsprechend abändern. Mein Vorschlag darf gerne übernommen werden oder verändert werden.

Viele Grüße,

riedel2


Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: chr()-Funktion nicht sicher!
« Antwort #1 am: 04. Februar 2008, 15:00:08 »
Danke für den Input wird sind bisher davon ausgegangen das bei aufruf der funktion der return string initialisiert wird, das scheint aber nicht immer der fall zu sein.
dieser fehler wird in der release 2.7 am 11 februar korrigiert sein

riedel2

  • Gast
Re: chr()-Funktion nicht sicher!
« Antwort #2 am: 04. Februar 2008, 15:10:57 »
Ich bin bei Codesys auch davon ausgegangen, dass der String mit 0 initialisiert wird. Andererseits wird das in anderen Programmiersprachen (z.B. C/C++) auch nicht explizit gemacht. Da muss man auch manuell hand anlegen...

Die Funktion schien auch recht gut zu funktionieren, nur beim 10. oder 20. Aufruf ging das ganze manchmal eben schief. Kommt scheinbar ganz darauf an, ob direkt hinter dem Character etwas in den Speicher abgelegt wird/wurde oder nicht.

Bin allgemein aber der Überzeugung, dass man solch eine Funktion lieber auf nummer sicher implementiert, also die Rückgabe auf 1 Zeichen beschränkt, was ja auch sinn der Funktion sein sollte.

Schön, dass ich euch helfen konnte.
Viele Grüße,

riedel2