Da ist es sinnvoller einen eigenen TextDriver zu schreiben (ähnlich wie StreamIO es für TStream macht), da man dann direkt Writeln(FileVar, ...) nutzen kann ohne es aufteilen zu müssen. Wie aber schon anderweitig erwähnt sind diese Variante schlechter für Übersetzungen zu handhaben, vor allem, wenn sich von Sprache zu Sprache die Reihenfolge der Werte ändern sollte.Mathias hat geschrieben: Sa 3. Jan 2026, 16:03 Ich nehme gerne WriteStr, das es ehr einfach in der Handhabung ist.
'format'-Funktion als Fehlerquelle
-
PascalDragon
- Beiträge: 1022
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: 'format'-Funktion als Fehlerquelle
FPC Compiler Entwickler
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2874
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: 'format'-Funktion als Fehlerquelle
Kann ich jetzt schlecht beurteilen, weil nicht ganz klar ist was deine eigentliche Problemstellung ist.Ekkehard hat geschrieben: Sa 3. Jan 2026, 12:39Das ist mir deutlich zu unflexibel, es läuft dann darauf hinaus mehrere solcher Funktionen zu bauen, für beliebige Kombinationen aus Zahlen und Strings. Ist zwar auf jeden Fall sicherer, aber nicht gut handhabbar.m.fuchs hat geschrieben: Sa 3. Jan 2026, 00:02 Würde ich lösen, indem ich mir eine (bzw. mehrere) sichere Funktionen bauen würde, die das ganze typsicher machen:
Für die Funktion FormatError schreibt man dann noch Unittests, damit auch da drin nichts schiefgeht.
0118999881999119725-3
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
- Zvoni
- Beiträge: 506
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
- CPU-Target: 64Bit
- Wohnort: BW
Re: 'format'-Funktion als Fehlerquelle
Errr... per Zufall erst heute darauf gestossen.....
Proof of Concept
Proof of Concept
Code: Alles auswählen
program Project1;
{$mode ObjFPC}{$H+}
Uses Sysutils;
Const MyFormat:Array[TTypeKind] of String= ('', //tkUnknown
'%d', //tkInteger
'%s', //tkChar
'', //tkEnumeration
'%n', //tkFloat
'', //tkSet
'', //tkMethod
'%s', //tkSString
'%s', //tkLString
'%s', //tkAString
'%s', //tkWString
'', //tkVariant
'', //tkArray
'', //tkRecord
'', //tkInterface
'', //tkClass
'', //tkObject
'%s', //tkWChar
'%d', //tkBool --> UNSURE!!
'%d', //tkInt64
'%d', //tkQWord
'', //tkDynArray
'', //tkInterfaceRaw
'', //tkProcVar
'%s', //tkUString
'%s', //tkUChar
'', //tkHelper
'', //tkFile
'', //tkClassRef
''); //tkPointer
//Overload
function EineFunktion(out a : Integer; out b : String) : Boolean;
begin
a := 42; //Random(5000);
b := 'Ein String Integer-Funktion';
Result := (a<>123);
end;
function EineFunktion(out a : String; out b : String) : Boolean;
var
r : Integer;
begin
r := 1042; //Random(5000);
a := IntToStr(r);
b := 'Ein String String-Funktion';
Result := (r<>123);
end;
Procedure LogThis(FirstArg,SecArg:String;args:array of Const);
Begin
Writeln(Format('Es ist ein Fehler ('+FirstArg+') bei der Bearbeitung von "'+SecArg+'" aufgetreten!',args));
end;
procedure MachEinenFehlerInt;
var
a : Integer = 0;
b : String = '';
begin
if {not} EineFunktion(a,b) then
LogThis(MyFormat[GetTypeKind(a)], MyFormat[GetTypeKind(b)],[a,b]);
end;
procedure MachEinenFehlerStr;
var
a : String = ''; // War Integer
b : String = '';
begin
if {not} EineFunktion(a,b) then
LogThis(MyFormat[GetTypeKind(a)], MyFormat[GetTypeKind(b)],[a,b]);
end;
begin
MachEinenFehlerInt;
MachEinenFehlerStr;
Readln;
end.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.