'format'-Funktion als Fehlerquelle

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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

Beitrag von PascalDragon »

Mathias hat geschrieben: Sa 3. Jan 2026, 16:03 Ich nehme gerne WriteStr, das es ehr einfach in der Handhabung ist.
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.
FPC Compiler Entwickler

Benutzeravatar
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

Beitrag von m.fuchs »

Ekkehard hat geschrieben: Sa 3. Jan 2026, 12:39
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.
Das 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.
Kann ich jetzt schlecht beurteilen, weil nicht ganz klar ist was deine eigentliche Problemstellung ist.
0118999881999119725-3

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
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

Beitrag von Zvoni »

Errr... per Zufall erst heute darauf gestossen.....

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.

Antworten