chr()-Funktion nicht sicher!

Begonnen von riedel2, 04. Februar 2008, 09:09:50

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

riedel2

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


hugo

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

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