myunit.pas(zeile,spalte) Error: Operator is not overloaded: "ULARGE_INTEGER" * "ULARGE_INTEGER"

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

myunit.pas(zeile,spalte) Error: Operator is not overloaded: "ULARGE_INTEGER" * "ULARGE_INTEGER"

Beitrag von thosch »

Hallo,


was kann ich hier machen, ich will solche ULARGE_INTEGER Variablen multiplizieren. Zuweisen kann ich nur Large Integer, so kann ich keine normalen Integers nehmen um erst mal die Multiplikation zu machen und dann das Ergebnis zuzuweisen

Wie muss ich vorgehen um das hier zu berechenen und dann an ULARGE_INTEGER bzw, den Zeiger PULARGE_INTEGER zuzuweisen.

hier meine beabsichtigte Berechenung, bei der der Compiler meckert:

Code: Alles auswählen

NumberOfBytes: PULARGE_INTEGER;
Clusters: ULARGE_INTEGER;
BytesPerSector: ULARGE_INTEGER;

  NumberOfBytes^ := Clusters * SectorsPerCluster * BytesPerSector;

Socke
Lazarusforum e. V.
Beiträge: 3158
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: myunit.pas(zeile,spalte) Error: Operator is not overloaded: "ULARGE_INTEGER" * "ULARGE_INTEGER"

Beitrag von Socke »

Du musst einen Operator überladen (https://www.freepascal.org/docs-html/re ... 23800015.4)

Code: Alles auswählen

operator * (i1: ULARGE_INTEGER; i2: ULARGE_INTEGER): ULARGE_INTEGER;
begin
  Result := ...
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: myunit.pas(zeile,spalte) Error: Operator is not overloaded: "ULARGE_INTEGER" * "ULARGE_INTEGER"

Beitrag von thosch »

Danke wie verrückt, mit diesem zusätzlichen Operator klappt es. :)

PascalDragon
Beiträge: 830
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: myunit.pas(zeile,spalte) Error: Operator is not overloaded: "ULARGE_INTEGER" * "ULARGE_INTEGER"

Beitrag von PascalDragon »

Der Typ ULARGE_INTEGER ist ein record, der wie folgt deklariert ist:

Code: Alles auswählen

     ULARGE_INTEGER = record
        case byte of
          0: (LowPart : DWORD;
              HighPart : DWORD);
          1: (QuadPart : ULONGLONG);
       end;
     PULARGE_INTEGER = ^ULARGE_INTEGER;
     _ULARGE_INTEGER = ULARGE_INTEGER;
Das heißt erstens, dass keinerlei Operatoren abseits von Zuweisungen zu anderen ULARGE_INTEGER für ihn definiert sind (weswegen das Überladen des Operators ja auch zum Erfolg führt), aber andererseits heißt es auch, dass du einfach mit dem QuadPart-Feld arbeiten kannst, da dies den kompletten 64-bit Wert des ULARGE_INTEGER beschreibt.

Also in deinem Fall:

Code: Alles auswählen

NumberOfBytes^.QuadPart := Clusters.QuadPart * SectorsPerCluster.QuadPart * ByetsPerSector.QuadPart
Hat den Vorteil, dass einfach die internen Operatoren des UInt64-Typen verwendet werden.
FPC Compiler Entwickler

Antworten