Folgendes Problem:
Ich möchte eine Prozedur schreiben, die Strings beliebiger Länge als var - Parameter akzeptiert - ähnlich wie viele Library - Routinen dies tun. In den meisten Pascal - Dialekten gibt es dafür den generischen Typ string (ohne Längenangabe).
function pushchar (var s: string; c:char; maxlen: byte):boolean;
begin
if length(s) >= maxlen then return (false);
s := s+c;
return( true);
end;
geht nicht, der Compiler beschwert sich über die fehlende Längenangabe. Gebe ich eine an, z.B. [127], gibts Fehlermeldung, sobald ich einen kürzer deklarierten String im Funktionsaufruf einsetze.
Der Workaround
function pushchar (p: pointer to string; c:char; maxlen: byte):boolean;
begin
if length(p^) >= maxlen then return (false);
p^ := p^+c;
return( true);
end;
und dann mit @mystring aufrufen passiert den Compiler anstandslos - aber genau weil ich solche Sachen nicht mag, verwende ich Pascal.
Frage: hab ich was übersehen, und gibt es einen Weg, meine Funktion aus dem ersten Beispiel richtig zu deklarieren?
Wenn nein, wäre meine Anregung einen solchen generischen Stringtyp einzuführen,. Wenn das nicht geht wg. Probleme der Speicherzuweisung wäre ein gangbarer Weg, Zuweisungen zwischen Strings unterschiedlicher Länge zu erlauben (evtl nach Compilerschalter Rangecheck off).
Ein generischer Stringtyp könnte auch beschränkt sein auf genau meinen Fall, Referenz - Parameter in Prozeduren.
Ich möchte eine Prozedur schreiben, die Strings beliebiger Länge als var - Parameter akzeptiert - ähnlich wie viele Library - Routinen dies tun. In den meisten Pascal - Dialekten gibt es dafür den generischen Typ string (ohne Längenangabe).
Code
function pushchar (var s: string; c:char; maxlen: byte):boolean;
begin
if length(s) >= maxlen then return (false);
s := s+c;
return( true);
end;
geht nicht, der Compiler beschwert sich über die fehlende Längenangabe. Gebe ich eine an, z.B. [127], gibts Fehlermeldung, sobald ich einen kürzer deklarierten String im Funktionsaufruf einsetze.
Der Workaround
Code
function pushchar (p: pointer to string; c:char; maxlen: byte):boolean;
begin
if length(p^) >= maxlen then return (false);
p^ := p^+c;
return( true);
end;
und dann mit @mystring aufrufen passiert den Compiler anstandslos - aber genau weil ich solche Sachen nicht mag, verwende ich Pascal.
Frage: hab ich was übersehen, und gibt es einen Weg, meine Funktion aus dem ersten Beispiel richtig zu deklarieren?
Wenn nein, wäre meine Anregung einen solchen generischen Stringtyp einzuführen,. Wenn das nicht geht wg. Probleme der Speicherzuweisung wäre ein gangbarer Weg, Zuweisungen zwischen Strings unterschiedlicher Länge zu erlauben (evtl nach Compilerschalter Rangecheck off).
Ein generischer Stringtyp könnte auch beschränkt sein auf genau meinen Fall, Referenz - Parameter in Prozeduren.