operator overloading

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

operator overloading

Beitrag von Socke »

Hallo,
ich habe einen ordinalen Typ mit begrenzter Größe. Aus einer Datenbank kann ich aber nur allgemeine Integer laden. Für den Fall, dass der Benutzer die Datenbank manipuliert hat, möchte ich beim Einlesen der Daten, den Wert automatisch "korrigieren" (d.h. auf den Wertebereich begrenzen). RangeChecking durch den Compiler hat den unangenehmen Seiteneffekt einer Exception (die ich gerne umgehen möchte) und beim operator overloading gibts nen Fehler:

Code: Alles auswählen

type
  TRating = 0..5;
operator := (i: Integer) r: TRating; // Error: Impossible operator overload
begin
  if i < low(TRating) then
    r := low(TRating) else
  if i > high(TRating) then
    r := high(TRating) else
    r := i;
end;
Habe ich das operator overloading vollkommen falsch verstanden und man kann nichts überladen, was eh schon da ist? Die Möglichkeit mit normalen Funktionsaufrufen möchte ich aus Gründen der Übersichtlichkeit eher ungern nutzen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: operator overloading

Beitrag von knight »

Wäre es in deinem Fall nicht einfacher, wenn du das Feld bereits in der Datenbank auf den zulässigen Wertebereich begrenzt (CHECK Option)? Dann könntest du dir die Überprüfung beim Einlesen sparen.

knight

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: operator overloading

Beitrag von Socke »

knight hat geschrieben:Wäre es in deinem Fall nicht einfacher, wenn du das Feld bereits in der Datenbank auf den zulässigen Wertebereich begrenzt (CHECK Option)? Dann könntest du dir die Überprüfung beim Einlesen sparen.
Versuch das mal SQLite zu erzählen. Da kannst du alles in allem abspeichern - egal welcher Datentyp oder welche Größe.
Mir fallen da nur gerade die trigger ein (on update/insert). Von denen habe ich aber so gut wie keine Ahnung. Deswegen wäre eine programmseitige Überprüfung am einfachsten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6771
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: operator overloading

Beitrag von af0815 »

Beim Operatoroverloading geht es um die Compilezeit, du kann das nicht auf die Laufzeit umwälzen. Somit bleibt dir kein Weg über, als es von Hand aus prüfen oder es der DB machen zu lassen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: operator overloading

Beitrag von Socke »

af0815 hat geschrieben:Beim Operatoroverloading geht es um die Compilezeit, du kann das nicht auf die Laufzeit umwälzen. Somit bleibt dir kein Weg über, als es von Hand aus prüfen oder es der DB machen zu lassen.
Soweit ich das verstanden habe, werden Operatoren, die auf Nicht-Konstanten angewendet werden die Ergebnisse immer erst zur Laufzeit ausgewertet. Selbstverständlich muss ein Operator schon zur Laufzeit definiert sein, aber ich hatte gedacht, dass der Compiler in der Compilezeit immer dann diesen Operator einfügt, wenn er in der Laufzeit aufgerufen werden würde (bzw. entsprechend Funktionsaufrufe auf eine Operator-Funktion). Sollte ich hier ein massives Missverständnis des Konzeptes haben, bitte ich darum mich aufzuklären.

Von Hand zu prüfen, hieße jedes Mal explizit eine bestimmte Funktion aufzurufen. Dies hätte ich gerne implizit erledigt.
Hast du ein Beispiel, wie man das DB-seitig umsetzen kann (SQL), zur Hand?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: operator overloading

Beitrag von lrlr »

warum es nicht funktioniert, weiß ich nicht, weil ich operator overloading noch nie betrieben habe..

verwend doch mal
type
TRating = Integer;

vielleicht gehts ..

(weil die 0..5 mit deinem operator overloading eh keine "nutzen" mehr hat..)

die "lösung" Ansicht ist aber sowieso nicht schöne (meine meinung)

1. der user sollte mitgeteilt bekommen, dass er etwas falsch gemacht hat (eingabe von 7 z.b.) und nicht einfach ungefragt und versteckt auf 5 ändern..

2. SO kannst zu keine Abhängigkeiten prüfen (z.b. dass 5 nur zulässig ist, wenn man auch das Feld "Grund für Bewertung 5" ausgefüllt hat)


Möglichkeiten: gibts wohl wie Sand am Meer, welche jetzt die "beste" ist, hängt von (zu) vielen Faktoren ab ...
und oft auch eine "glaubensfrage"..
BusinessObjects, (incl ORM) usw. macht man z.b. oft.,

wenn man direkt mit einer datenbank (die man auch nicht vorhat auszutauschen) arbeitet, kann man wohl auch trigger verwenden, für "low level" überprüfungen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6771
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: operator overloading

Beitrag von af0815 »

In der unit math ist folgendes

Code: Alles auswählen

function EnsureRange(const AValue, AMin, AMax: Integer): Integer
damit kannst du den Bereich eingrenzen (so wie es im ersten Post ist). Ist dann halt eine FPC-RTL Funktion.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: operator overloading

Beitrag von Socke »

lrlr hat geschrieben:1. der user sollte mitgeteilt bekommen, dass er etwas falsch gemacht hat (eingabe von 7 z.b.) und nicht einfach ungefragt und versteckt auf 5 ändern..

2. SO kannst zu keine Abhängigkeiten prüfen (z.b. dass 5 nur zulässig ist, wenn man auch das Feld "Grund für Bewertung 5" ausgefüllt hat)
Im Prinzip hast du Recht; In dem Falle sollte die Überprüfung aber vor der Zuweisung und nicht erst bei der Zuweisung geschehen, da dann in der Zuweisung eine Exception ausgelöst werden müsste, damit das dann noch ggf. geändert werden kann

In meinem konkretem Fall solls aber nur ein kleines Control zum Anklicken (0-5 Punkte) geben. Da intern keine anderen Werte als 0-5 gebraucht werden, wäre diese Funktion mehr oder weniger nur beim Einlesen im Einsatz.
af0815 hat geschrieben:In der unit math ist folgendes

Code: Alles auswählen

function EnsureRange(const AValue, AMin, AMax: Integer): Integer
damit kannst du den Bereich eingrenzen (so wie es im ersten Post ist). Ist dann halt eine FPC-RTL Funktion.
Diese Funktion kannte ich bisher noch nicht. Da ich die jetzt aber nicht mehr brauche (habe meine eigene Funktion geschrieben), könnte ich diese jetzt höchsten Kapseln damit ich nicht immer die entsprechenden Werte angeben muss.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten