Operator ändern?!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Operator ändern?!

Beitrag von Hartkern »

Hallo,

vor kurzem suchte ich eine einfachere Lösung zur Matrizenmultiplikation, und fand folgendes :

Code: Alles auswählen

operator * (const m1, m2: tMat44) res: tMat44;
  var
    i, j, k: integer;
  begin
    for i := 0 to 3 do begin
      for j := 0 to 3 do begin
        Res[i, j] := 0;
        for k := 0 to 3 do begin
          Res[i, j] := Res[i, j] + m2[i, k] * m1[k, j];
        end;
      end;
    end;
  end;       
Was die for Schleifen tuen ist mir bekannt, da ich die Multiplikation bisher umständlich "quasi per Hand" gemacht hab..

Was ist dieser Operator? ich kenn lediglich Procedure und function, okay constructor, destructor auch

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 ändern?!

Beitrag von Socke »

Hartkern hat geschrieben:Was die for Schleifen tuen ist mir bekannt, da ich die Multiplikation bisher umständlich "quasi per Hand" gemacht hab..

Was ist dieser Operator? ich kenn lediglich Procedure und function, okay constructor, destructor auch
Du kannst die vorhanden Operatoren für eigene Datentypen überladen. Siehe hierzu die Dokumentation: http://www.freepascal.org/docs-html/cur ... 7-22900015

Du kannst alle Operatoren auch als Funktion ausdrücken. Der generierte Binärcode ist nahezu identisch.
Am Ende ist das Überladen von Operatoren nur etwas, was den Quelltext lesbarer macht.

Code: Alles auswählen

// als operator
operator * (const m1, m2: tMat44) res: tMat44;
  var
    i, j, k: integer;
  begin
    for i := 0 to 3 do begin
      for j := 0 to 3 do begin
        Res[i, j] := 0;
        for k := 0 to 3 do begin
          Res[i, j] := Res[i, j] + m2[i, k] * m1[k, j];
        end;
      end;
    end;
  end;
// als Funktion
function MulitplyMat44(const m1, m2: tMat44): tMat44;
  var
    i, j, k: integer;
  begin
    for i := 0 to 3 do begin
      for j := 0 to 3 do begin
        Res[i, j] := 0;
        for k := 0 to 3 do begin
          MulitplyMat44[i, j] := Res[i, j] + m2[i, k] * m1[k, j];
        end;
      end;
    end;
  end;
 
var
  m1, m2, m3: tMat44;
begin  
  // aufruf Operator
  // ohne den oben definierten Operator, würde der FPC hier einen Fehler ausgeben, da er den Typ tMat44 nicht multiplizieren kann
  m3 := m1 * m2;
  // Aufruf als Funktion
  m3 := MulitplyMat44(m1, m2);
end.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Operator ändern?!

Beitrag von Hartkern »

ahh,

vielen Dank,

ich hab es bisher als Funktion gelöst, da die Operator Variante mir nicht bekannt war..Google lieferte mir nicht wirklich nen Lösungsansatz (oder ich hab falsch gesucht)..

Man lernt nie aus..

Antworten