Autor Beitrag
baphumet
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: Mo 28.09.09 19:13 
Hi,

benutze Delphi Version 7 und habe 4 Klassen, dabei werden die 3 letzten von der ersten abgeleitet, es handelt sich um eine abstrakte Klasse, die Methoden werden erst in den anderen Klassen implementiert. Im Konstruktor wird eine Methode Korrektur aufgerufen, die eine Winkelkorrektur vornimmt und ist nur in den letzten beiden Klassen deklariert und implementiert da diese nur dort benötigt werden. Hier mein Code um es besser nachzuvollziehen zu können.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
unit KOMPLEX;

interface

uses
    sysutils,math;
type

TKlasse=class
    private
        a,b,c,d,e: EXTENDED;
    public
        function add(z1,z2: TKlasse):TKlasse;virtual;abstract;
        function sub(z1,z2: TKlasse):TKlasse;virtual;abstract;
        function mul(z1,z2: TKlasse):TKlasse;virtual;abstract;
        function div(z1,z2: TKlasse):TKlasse;virtual;abstract;
        ...
end;
TForm1=class(TKlasse)
        constructor Create(a1,b1: EXTENDED);
        function add(z1,z2: TKlasse):TKlasse;override;
        function sub(z1,z2: TKlasse):TKlasse;override;
        function mul(z1,z2: TKlasse):TKlasse;override;
        function div(z1,z2: TKlasse):TKlasse;override;
        ...
end;
TForm2=class(TKlasse)
        constructor Create(a1,b1: EXTENDED);
        function Korrektur(b1: EXTENDED):EXTENDED;
        function add(z1,z2: TKlasse):TKlasse;override;
        function sub(z1,z2: TKlasse):TKlasse;override;
        function mul(z1,z2: TKlasse):TKlasse;override;
        function div(z1,z2: TKlasse):TKlasse;override;
        ...
end;
TForm3=class(TKlasse)
        constructor Create(a1,b1: EXTENDED);
        function Korrektur(b1: EXTENDED):EXTENDED;
        function add(z1,z2: TKlasse):TKlasse;override;
        function sub(z1,z2: TKlasse):TKlasse;override;
        function mul(z1,z2: TKlasse):TKlasse;override;
        function div(z1,z2: TKlasse):TKlasse;override
        ...
end;
...
constructor TForm2.Create(a1,b1: EXTENDED);
begin
    a:=a1;
    b1:=Korrektur(b1);//funktioniert immer
    b:=b1;            //Wertzuweisung funktioniert mal und mal nicht
end;
function TForm2.Korrektur(b1 :EXTENDED):EXTENDED;
begin
    //Korrektur wird vorgenommen
    result:=b1;
end;

...

constructor TForm3.Create(a1,b1: EXTENDED);
begin
    a:=a1;
    b1:=Korrektur(b1);//funktioniert immer
    b:=b1;            //Wertzuweisung funktioniert mal und mal nicht
end;
function TForm3.Korrektur(b1 :EXTENDED):EXTENDED;
begin
    //Korrektur wird vorgenommen
    result:=b1;
end;

Bei diesem Aufruf der Funktion ist noch alles ok, das hab ich mit Debuggen herausgefunden und das Ergebnis wird an b1 zurückgegeben, aber bei der Wertzuweisung gibt b:=b1; es Probleme, aber nur wenn ich aus den Methoden heraus den Constructor aufrufe, also bei so etwas:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm3.mul(z1,z2: TKlasse):TKlasse;
begin
  a:=z1.a*z2.a;
  b:=z1.b+z2.b;
  result:=TForm3.Create(a,b); //Fehler bei Wertzuweisung im Constructor
end;
function TForm3.div(z1,z2: TKlasse):TKlasse;
begin
  a:=z1.a/z2.a;
  b:=z1.b-z2.b;
  result:=TForm3.Create(a,b); //Fehler bei Wertzuweisung im Constructor
end;


Wie man aus den Namen der Methoden erkennen kann soll gerechnet werden, hierbei werden die 4 Grundrechenarten gezeigt. Ansonsten wenn ich nicht aus den Methoden heraus
ein neues Objekt von TForm3 erstelle funktioniert die letzte Wertzuweisung im Constructor einwandfrei.

Meine Frage, ist das normal, gibt es dafür eine logische Ursache oder handelt es sich um einen Bug in Delphi?


Zuletzt bearbeitet von baphumet am Di 29.09.09 13:54, insgesamt 7-mal bearbeitet
Zyklame
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41
Erhaltene Danke: 1

Win 7 Professional
Delphi XE, Visual Studio 2010
BeitragVerfasst: Mo 28.09.09 19:38 
Mal Abgesehen von den nicht gerade viel Aussagenden Klassennamen ist der Fehler sicher an der makierten Stelle

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
constructor TKlasse3.Create(a1,b1: EXTENDED): EXTENDED;
begin
    a:=a1;
    b1:=Korrektur(b1);
    b:=b1;            //Hier wir der Wert der Privaten Variable des erzeugten Objects (der Klasse TKlasse3) zugewiesen
    Result := b1;     // Da was du möchtest ist sicherlich das der Rückgabewert auf den Wert von b1 gesetzt wird
end;
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Mo 28.09.09 20:01 
- Wo steckt der inherited - Aufruf des Constructors? Sollte man immer machen.

- Meckert der Compiler da nicht: constructor TKlasse3.Create(a1,b1: EXTENDED): EXTENDED Ein Constructor sollte immer den Zeiger auf die Instanz zurückgeben (-> OH). Für alles andere gibt es reguläre Funktionen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 28.09.09 20:04 
1. Äh, nanü..? Einen Constructor mit Rückgabewert? Hab ich was verpasst? Ich dachte immer, der liefert eine Instanz eben dieser Klasse zurück..
2. im Con- / Destructor inherited aufrufen
3. Warum glauben die Leute eigentlich, wenn so etwas simples nicht geht, immer sofort an einen Bug in Delphi? :D

_________________
PROGRAMMER: A device for converting coffee into software.
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Mo 28.09.09 20:18 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Warum glauben die Leute eigentlich, wenn so etwas simples nicht geht, immer sofort an einen Bug in Delphi? :D

Nicht immer, und in diesem Fall ist die Idee aufgrund vorheriger Probleme nicht ganz abwegig.. auch wenn Delphi diesmal unschuldig ist.
baphumet Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: Mo 28.09.09 22:13 
Hi, hab mich an der Stelle verschrieben, Constructor hat keinen Rückgabewert, außerdem schieb ich die Schuld nicht auf Delphi, es war nur eine Frage und beim compilieren hab ich ohne inherited auch keine Probleme. Die Funktion Korrektur wird aufgerufen und der Rückgabewert der Variable b1 zugewiesen, das Problem leigt bei der Werzuweisung b:=b1.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Button1.Click(Sender: TObject);
var
   test: TKlasse;
begin
   test:=TForm3.Create(1,390);   
   //mit Debuggen Wertzuweisung beim Constructor b:=b1 funzt
   //Anschließende Ausgabe=(1,30) und stimmt nach Korrektur
end;

aber
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm3.M1(z1,z2: TKlasse):TKlasse;
begin
    a:=z1.a*z2.a;                 //a=3*4=12 und stimmt bei Ausgabe
    b:=z1.b+z2.b;                 //b=100+270=370
    result:=TForm3.Create(a,b); 
    //mit Debuggen Wertzuweisung beim Constructor b:=b1 funzt net
    //Ausgabe sollte 10 ergeben, ist aber 370
end;

...

//Ausgabe=(12,370)


Meine Constructoren sehen wie folgt aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
constructor TForm2.Create(a1,b1: EXTENDED);
begin
    inherited Create();
    a:=a1;
    b1:=Korrektur(b1);//funktioniert immer
    b:=b1;
end;

constructor TForm3.Create(a1,b1: EXTENDED);
begin
    inherited Create();
    a:=a1;
    b1:=Korrektur(b1);//funktioniert immer
    b:=b1;
end;

Hat erstmal trotzdem nichts gebracht, deshalb frag ich ist das korrekt oder muß das anders aussehen, inherited; hat nicht funktioniert da erhalte ich Compilerfehler?
Einzige Möglichkeit damit ich es zum Laufen bekomme ist das ich Korrektur in jeder Methode vor dem erzeugen eines Objektes aufrufe, aber ich finde das nicht sehr gut. Denn es werden ja Objekte erzeugt und genau dann und nur an einer Stelle ist eine Korrektur notwendig, falls irgendwelche Fehler auftreten brauch man nur an einer Stelle schauen wenn es Korrektur betrifft und nicht nachvollziehen welche Methode aufgerufen worden ist und dort der Aufruf erfolgte, ich spare mir Aufrufe, alle weg von den Methoden und ein Aufruf im Constructor, spart Speicher.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Di 29.09.09 10:02 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
TKlasse=class
    private
        a,b,c,d,e: EXTENDED;
    public
        function add(z1,z2: TKlasse):TKlasse;virtual;abstract;
        function sub(z1,z2: TKlasse):TKlasse;virtual;abstract;
        function mul(z1,z2: TKlasse):TKlasse;virtual;abstract;
        function div(z1,z2: TKlasse):TKlasse;virtual;abstract;


Wenn du aus den anderen Klassen heraus auf die privaten Felder a,b,c,d und e zugreifen möchtest, solltest du diese nicht als private, sondern als strict protected deklarieren.
So funktioniert es zwar auch, weil man auf private Felder auch aus der Unit zugreifen kann, sauberer wäre es aber sicher anders. Vielleicht liegt da auch das Problem?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 29.09.09 10:34 
user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du aus den anderen Klassen heraus auf die privaten Felder a,b,c,d und e zugreifen möchtest, solltest du diese nicht als private, sondern als strict protected deklarieren.
Oben steht, dass es um Delphi 7 geht. Das kannte so etwas leider noch nicht. ;-)
Ab Delphi 2006/Turbo Delphi würden noch ganz andere Sachen gehen, z.B. könnte man da einfach das normale + verwenden, wenn man die Methoden entsprechend der Operatoren deklariert. Dann müsste man add und so etwas gar nicht mehr als Funktion aufrufen. Geht aber hier alles nicht. ;-)

Die Klassennamen TForm1, TForm2 und TForm3 sind natürlich sehr günstig gewählt, da Delphi diese selbst nie vewendet und man sofort am Namen sieht was das für Klassen sind und wozu die dienen...
baphumet Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: Di 29.09.09 14:01 
Ich gebe ja zu das die Klassennamen nicht gerade gut gewählt worden sind, ist doch aber nur ein Quelltextbeispiel, bedeutet das meine Klassen und Methoden und die Attribute anders heißen, aber es funktioniert genauso. Ich muß doch hier nicht mein Programm offen legen was es genau macht und dann klaut mir jemand meine Programmieridee und kopierts, das möchte ich nicht.

Die letzten Antworten waren wenig konstruktiv, gibt es in Delphi 7 eine Möglichkeit das die Wertzuweisung im Constructor sicher gestellt wird, wenn nicht dann ruf ich Korrektur eben in jeder Methode(add,sub,...) auf bevor ein Objekt von TForm2 oder TForm3 erzeugt wird. Das funktioniert 100%ig, ist für mich aber keine optimale Lösung.
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Di 29.09.09 14:13 
Tausche doch einfach mal das Wörtchen "public" gegen "protected" aus.

Beste Grüße
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Di 29.09.09 17:27 
Ich würde nicht erwarten das sich da was ändert, denn die Felder gehören ja dennoch zu der Instanz
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.09.09 17:56 
Moin!

user profile iconbaphumet hat folgendes geschrieben Zum zitierten Posting springen:
[...] nur ein Quelltextbeispiel, bedeutet das meine Klassen und Methoden und die Attribute anders heißen, aber es funktioniert genauso. Ich muß doch hier nicht mein Programm offen legen was es genau macht [...]

Die letzten Antworten waren wenig konstruktiv [...]
Was man wohl kaum uns anlasten kann. :| Halten wir fest: du zeigst keinen real eingesetzten Code (warum auch immer sei jetzt mal dahingestellt), also können wir schlecht feststellen, ob dein Beispiel angemessen ist oder ob du Fehler machst, die du gar nicht bemerkst. :nixweiss:

Ich habe mal versucht, dein "Beispiel" in lauffähigen Code abzubilden:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
type
  TAbstrakteKlasse = class(TObject)
  private
    a,b: Extended;
    function GetAusgabe: String;
  public
    function Machwas(z1,z2: TAbstrakteKlasse): TAbstrakteKlasse; virtualabstract;
    property GibAus: String read GetAusgabe;
  end;

  TSpezielleKlasse = class(TAbstrakteKlasse)
  public
    constructor Create(a1, b1: Extended);
    function Machwas(z1, z2: TAbstrakteKlasse): TAbstrakteKlasse; override;
  end;

//...

function TAbstrakteKlasse.GetAusgabe: String;
begin
  Result := Format('a: %f b: %f',[a,b]);
end;

constructor TSpezielleKlasse.Create(a1, b1: Extended);
begin
  inherited Create;
  a := a1;
  b := b1;
end;

function TSpezielleKlasse.Machwas(z1, z2: TAbstrakteKlasse): TAbstrakteKlasse;
begin
  a := z1.a *z2.a;
  b := z1.b +z2.b;
  Result := TSpezielleKlasse.Create(a,b);
end;

procedure TForm1.Button1Click(Sender: TObject);
  var
    K1, K2: TAbstrakteKlasse;
begin
  K1 := TSpezielleKlasse.Create(10,20);
  try
    Memo1.Lines.Add(K1.GibAus);
    K2 := K1.Machwas(K1,K1);
    try
      Memo1.Lines.Add(K2.GibAus);
    finally
      K2.Free;
    end;
  finally
    K1.Free;
  end;
end;
Ist das "Beispiel" zutreffend für dein Problem? Wenn nicht, was muss anders sein?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
baphumet Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: Di 29.09.09 19:14 
Hi,

an alle und ich will niemanden zu nahe treten, aber wer lesen kann und gründlich ließt und auch den Quelltext durchschaut der sieht das ich keine proberties benutzt habe, aber trotzdem werde ich jetzt meinen richtigen Code darlegen, für alle Fälle.

Und eine Zusammenfassung für alle die es mehrmals lesen müssen, ich benutze Delphi 7 und mein Programm besteht aus 4 Klassen, 3 von diesen sind von der ersten abgeleitet und erst dort sind die Methoden implementiert. Das Programm soll mit Komplexen Zahlen rechnen, eine Komplexe Zahl besteht aus zwei Teilen, deshalb in meinen Methoden immer zwei Parameter, es gibt aber verschiedene Formen in denen verschieden damit gerechnet wird, wer mehr wissen will schaut bei Wikipedia rein.

Das sind jetzt alle nötigen Infos die ihr braucht, hoffe ich, falls nicht dann frag ich mich was ihr noch braucht, denn der Quelltext ist auch zu finden, jetzt bitte keine unsinnigen Aussagen machen die keinem weiter helfen, bringt nichts. Das einzige was passiert ist das ich wirklich sauer werde und mich irgendwann vergesse und dann bleibt kein Auge trocken. Eins möchte ich noch anmerken, ich meine nicht alle, denn es gibt wirklich Leute die gründlich lesen und auch hilfreiche Antworten geben, diese sollten sich nicht angesprochen fühlen, wollt ich nur sagen bevor es Missverständnisse gibt.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
unit KOMPLEX;

interface

uses
    Sysutils,math;

type
    TKomplexeZahl=class
    private
        a,b,r,alpha,phi: EXTENDED;
    public
        function Addition(z1,z2: TKomplexeZahl):TKomplexeZahl;virtual;abstract;
        function Subtraktion(z1,z2: TKomplexeZahl):TKomplexeZahl;virtual;abstract;
        function Multiplikation(z1,z2: TKomplexeZahl):TKomplexeZahl;virtual;abstract;
        function Division(z1,z2: TKomplexeZahl):TKomplexeZahl;virtual;abstract;
        ...
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    end;
    TKForm1=class(TKomplexeZahl)
    public
        constructor Create(a1,b1: EXTENDED);
        function Addition(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Subtraktion(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Multiplikation(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Division(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        ...
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl;override;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl;override;
    end;
    TKForm2=class(TKomplexeZahl)
        constructor Create(r1,alpha1: EXTENDED);
        function Winkelkorrektur(alpha1: EXTENDED):EXTENDED;
        function Addition(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Subtraktion(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Multiplikation(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Division(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        ...
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl;override;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl;override;
    public
    end;
    TKForm3=class(TKomplexeZahl)
    public
        constructor Create(r1,phi1: EXTENDED);
        function Winkelkorrektur(alpha1: EXTENDED):EXTENDED;
        function Addition(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Subtraktion(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Multiplikation(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        function Division(z1,z2: TKomplexeZahl):TKomplexeZahl;override;
        ...
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl;override;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl;override;
    end;

    ...

    constructor TKForm2.Create(r1,alpha1: EXTENDED);
    begin
        r:=r1;
        alpha1:=Winkelkorrektur(alpha1);
        alpha:=alpha1;//funktioniert nur wenn nicht aus Methoden(Addition,..) aufgerufen wird
    end;
    function TKForm2.Winkelkorrektur(alpha1: EXTENDED):EXTENDED;
    begin
        //Korrektur wird vorgenommen
        result:=alpha1;
    end;

    ...

    function TKForm2.Multiplikation(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
       r:=z1.r*z2.r;alpha:=z1.alpha+z2.alpha;
       result:=TKForm2.Create(r,alpha);
    end;
    function TKForm2.Division(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
       r:=z1.r/z2.r;alpha:=z1.alpha-z2.alpha;
       result:=TKForm2.Create(r,alpha);
    end;

    ...

    constructor TKForm3.Create(r1,phi1: EXTENDED);
    begin
        r:=r1;
        phi1:=Winkelkorrektur(phi1);
        phi:=phi1;//funktioniert nur wenn nicht aus Methoden(Addition,..) aufgerufen wird
    end;
    function TKForm3.Winkelkorrektur(phi1: EXTENDED):EXTENDED;
    begin
        //Korrektur wird vorgenommen
        result:=phi1;
    end;

    ...

    function TKForm3.Multiplikation(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
       r:=z1.r*z2.r;phi:=z1.phi+z2.phi;
       result:=TKForm3.Create(r,phi);
    end;
    function TKForm3.Division(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
       r:=z1.r/z2.r;phi:=z1.phi-z2.phi;
       result:=TKForm3.Create(r,phi);
    end;
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 29.09.09 22:23 
user profile iconbaphumet hat folgendes geschrieben Zum zitierten Posting springen:
an alle und ich will niemanden zu nahe treten, aber wer lesen kann und gründlich ließt und auch den Quelltext durchschaut der sieht das ich keine proberties benutzt habe, [...]
Ich will dir nicht zu nahe treten, aber du solltest einen Quelltext erst einmal verstehen, bevor du über ihn urteilst. Schau dir bitte noch einmal an, wozu Narses die Property eingeführt hat...

Jetzt aber zum Problem: Deine ganzen Methoden wie "Multiplikation" verarbeiten insgesamt vier TKomplexeZahl-Instanzen: Zwei Parameter, ein Rückgabewert... und die Self-Instanz! Das macht keinen Sinn, es sollten natürlich nur drei Instanzen insgesamt beteiligt sein.
Du rufst den Code wahrscheinlich so auf:
ausblenden Delphi-Quelltext
1:
zResult.Add(z1, z2);					

Damit schmeißt du aber das Ergebnis weg, es müsste vielmehr so aussehen:
ausblenden Delphi-Quelltext
1:
zResult := zDummy.Add(z1, z2);					

Diese Dummy-Instanz ist wie gesagt vollkommen unnötig, mache aus deiner function eine class function (ich hoffe mal, dass D7 das schon kann, sonst eben eine ganz normale globale Funktion), dann sieht das Ganze so aus:
ausblenden Delphi-Quelltext
1:
zResult := TKForm1.Add(z1, z2);					


Wofür du hier Polymorphie überhaupt brauchst (getrennte Typen für jede Darstellung wären imho sinnvoller), ist eine andere Frage, was aber vielleicht lieber in einem neuen Topic besprochen werden sollte.

PS: Was mich interessieren würde - Polarform und algebraische Form sind ja bekannt, was für Formen unterstützt du denn noch?

_________________
>λ=
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.09.09 22:47 
Moin!

Fachlich hat dir Sebastian ja schon Nachhilfe gegeben. Fehlt nur noch der Hinweis, dass D7 bereits Klassenfunktionen kennt. ;)

user profile iconbaphumet hat folgendes geschrieben Zum zitierten Posting springen:
jetzt bitte keine unsinnigen Aussagen machen die keinem weiter helfen, bringt nichts. Das einzige was passiert ist das ich wirklich sauer werde und mich irgendwann vergesse und dann bleibt kein Auge trocken.
:| Was war das denn jetzt? :gruebel: Du hast dich beim Schreiben dieser Zeilen offenbar schon vergessen. Wenn du in dem Ton weiter machst, wird es mich nicht wundern, wenn du hier gar keine Antworten mehr kriegst. :nixweiss:

Viel Erfolg noch
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
baphumet Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: Mi 30.09.09 00:07 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Damit schmeißt du aber das Ergebnis weg, es müsste vielmehr so aussehen:
ausblenden Delphi-Quelltext
1:
zResult := zDummy.Add(z1, z2);					

Diese Dummy-Instanz ist wie gesagt vollkommen unnötig, mache aus deiner function eine class function (ich hoffe mal, dass D7 das schon kann, sonst eben eine ganz normale globale Funktion), dann sieht das Ganze so aus:
ausblenden Delphi-Quelltext
1:
zResult := TKForm1.Add(z1, z2);					


Es gibt die Kartesische Form, die Polarform und die Exponentialform von Komplexen Zahlen, letztere entsteht durch die Eulerformel, diese gibt einen Zusammenhang zwischen den trigonometrischen Funktionen und der Eulerschen Zahl, man ersetzt einfach in der Polarform cos alpha+sin alphai=e^(phi*i), der Betrag r bleibt erhalten und die Rechnungen sind analog der in Polarform, der Logarithmus lässt sich einfacher ermitteln.

Ich gebe dir recht, es müssen nur 3 und nicht 4 Objekte sein und so wie du es gesagt hast, hab ich die Methoden auch aufgerufen, wodurch ich das Ergebnis wegschmeiße. class function ist in Delphi 7 möglich, aber ich habe keine Ahnung wie das bei mir jetzt aussehen müsste. Muß ich meine gesamten Methoden als class function deklarieren oder nur die Winkelkorrektur und wenn wie, ein anschauliches Beispiel würde mir sehr weiterhelfen.

Meine eine Unit Komplex sieht ie folgt aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
unit KOMPLEX;                                                                              interface
    uses Sysutils,math;
type
TKomplexeZahl=class
private
    a,b,r,alpha,phi: EXTENDED;
public
    function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function konjugieren(z1: TKomplexeZahl):TKomplexeZahl;virtual;abstract;
    function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; virtual;abstract;
    function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; virtual;abstract;
    function logarithmieren(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function Ausgabe1():String;
    function Ausgabe2():String;
    function Ausgabe3():String;
    end;
    TKartesischeForm=class(TKomplexeZahl)
    private
    public
        constructor Create(a1,b1: EXTENDED);
        function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function konjugieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; override;
        function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; override;
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; override;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; override;
    end;
    TPolarform=class(TKomplexeZahl)
    private
    public
        constructor Create(r1,alpha1: EXTENDED);
        function Winkelkorrektur(alpha1: EXTENDED):EXTENDED;
        function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function konjugieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; override;
        function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; override;
        function logarithmieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; override;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; override;
    end;
    TExponentialform=class(TKomplexeZahl)
    private
    public
        constructor Create(r1,phi1: EXTENDED);
        function Winkelkorrektur(phi1: EXTENDED):EXTENDED;
        function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        function konjugieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; override;
        function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; override;
        function logarithmieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; override;
        function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; override;
    end;
implementation


    function TKomplexeZahl.Ausgabe1():String;
    begin
        if (a<>0then begin
            if ((b>0or (b<0)) then
                if (b>0then
                    if (b<>1then result:='z='+FloatToStr(a)+'+'+FloatToStr(b)+'i'
                    else result:='z='+FloatToStr(a)+'+i'
                else
                    if (b<>-1then result:='z='+FloatToStr(a)+FloatToStr(b)+'i'
                    else result:='z='+FloatToStr(a)+'-i'
            else result:='z='+FloatToStr(a);
        end else begin
            if ((b>0or (b<0)) then
                if (b>0then
                    if (b<>1then result:='z='+FloatToStr(b)+'i'
                    else result:='z=i'
                else
                    if (b<>-1then result:='z='+FloatToStr(b)+'i'
                    else result:='z=-i'
            else result:='z=0';
        end;
    end;
    function TKomplexeZahl.Ausgabe2():String;
    begin
        result:='z='+FloatToStr(r)+'(cos '+FloatToStr(alpha)+'+sin '+FloatToStr(alpha)+'i)';
    end;
    function TKomplexeZahl.Ausgabe3():String;
    begin
        if(r<>1then result:='z='+FloatToStr(r)+'e^('+FloatToStr(phi)+'i)'
        else result:='z=e^('+FloatToStr(phi)+'i)';
    end;

    constructor TKartesischeForm.Create(a1,b1: EXTENDED);
    begin
      a:=a1;b:=b1;
    end;
    function TKartesischeForm.addieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=z1.a+z2.a;b:=z1.b+z2.b;
        result:=TKartesischeForm.Create(a,b);
    end;
    function TKartesischeForm.subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=z1.a-z2.a;b:=z1.b-z2.b;
        result:=TKartesischeForm.Create(a,b);
    end;
    function TKartesischeForm.multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=z1.a*z2.a-z1.b*z2.b;b:=z1.a*z2.b+z2.a*z1.b;
        result:=TKartesischeForm.Create(a,b);
    end;
    function TKartesischeForm.dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        if ((z2.a<>0or (z2.b<>0)) then begin
            a:=(z1.a*z2.a+z1.b*z2.b)/(SQR(z2.a)+SQR(z2.b));
            b:=(z2.a*z1.b-z1.a*z2.b)/(SQR(z2.a)+SQR(z2.b));
            result:=TKartesischeForm.Create(a,b);
        end else raise ERangeError.Create('Division durch null(r²=0 von z2)');
    end;
    function TKartesischeForm.konjugieren(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=z1.a;b:=-z1.b;result:=TKartesischeForm.Create(a,b);
    end;
    function TKartesischeForm.potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl;
    var
        z2,z3: TKomplexeZahl;
        a2,b2: EXTENDED;
        k: WORD;
    begin
        z3:=TKartesischeForm.Create(1,0);
        k:=1;a2:=z1.a;b2:=z1.b;
        if (n=0then
            if ((z1.a<>0or (z1.b<>0)) then a:=1
            else raise ERangeError.Create('0^0 ist nicht definiert');
        if (n=1then begin
            a:=z1.a;b:=z1.b;
        end else begin
            while (k<ABS(n)) do begin
                a:=z1.a*a2-z1.b*b2;
                b:=z1.a*b2+a2*z1.b;
                a2:=a;b2:=b;
                INC(k);
            end;
        end;
        z2:=TKartesischeForm.Create(a2,b2);
        if (n<0then result:=dividieren(z3,z2)
        else result:=TKartesischeForm.Create(a,b);
    end;
    function TKartesischeForm.radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl;
    begin
        a:=SQRT((                   SQRT(SQR(z1.a)+SQR(z1.b))       +z1.a)/2);
        if (z1.b>0then b:=SQRT((    SQRT(SQR(z1.a)+SQR(z1.b))       -z1.a)/2)//erstzen durch hypot
        else b:=-SQRT((             SQRT(SQR(z1.a)+SQR(z1.b))       -z1.a)/2);
        if (k=2then begin
           a:=-a;b:=-b;
        end;
        result:=TKartesischeForm.Create(a,b);
    end;
    function TKartesischeForm.Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=hypot(z1.a,z1.b);
        alpha:=arctan2(z1.b,z1.a);alpha:=RadToDeg(alpha);
        result:=TKartesischeForm.Create(r,alpha);
    end;
    function TKartesischeForm.Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=hypot(z1.a,z1.b);
        phi:=arctan2(z1.b,z1.a);
        result:=TKartesischeForm.Create(r,phi);
    end;



    constructor TPolarform.Create(r1,alpha1: EXTENDED);
    begin
        if (r1>0then begin
            r:=r1;alpha:=Winkelkorrektur(alpha1);
        end else raise ERangeError.Create('Betrag hat den Wert 0');
    end;

    function TPolarform.Winkelkorrektur(alpha1: EXTENDED):EXTENDED;
    begin
        if (ABS(alpha1)>=360then
            alpha1:=alpha1-360*int(alpha1/360);
        if (ABS(alpha1)>=180then
            if (ABS(alpha1)=180then alpha1:=180
            else alpha1:=alpha1-360*ABS(alpha1)/alpha1;
        result:=alpha1;
    end;
    function TPolarform.addieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
       z1.alpha:=DegToRad(z1.alpha);z2.alpha:=DegToRad(z2.alpha);
       r:=hypot(z1.r*cos(z1.alpha)+z2.r*cos(z2.alpha),
                z1.r*sin(z1.alpha)+z2.r*sin(z2.alpha));
       if (iszero(r)) then begin
           r:=0;alpha:=0;
       end else
           alpha:=
           arctan2(z1.r*cos(z1.alpha)+z2.r*cos(z2.alpha),
                   z1.r*sin(z1.alpha)+z2.r*sin(z2.alpha));
       alpha:=RadToDeg(alpha);
       result:=TPolarform.Create(r,alpha);
    end;
    function TPolarform.subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        z1.alpha:=DegToRad(z1.alpha);z2.alpha:=DegToRad(z2.alpha);
        r:=hypot(z1.r*cos(z1.alpha)-z2.r*cos(z2.alpha),
                 z1.r*sin(z1.alpha)-z2.r*sin(z2.alpha));
        if (iszero(r)) then begin
            r:=0;alpha:=0;
        end else
            alpha:=arctan2(z1.r*cos(z1.alpha)-z2.r*cos(z2.alpha),
                           z1.r*sin(z1.alpha)-z2.r*sin(z2.alpha));
        alpha:=RadToDeg(alpha);
        result:=TPolarform.Create(r,alpha);
    end;
    function TPolarform.multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r*z2.r;alpha:=Winkelkorrektur(z1.alpha+z2.alpha);
        result:=TPolarform.Create(r,alpha);
    end;
    function TPolarform.dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r/z2.r;alpha:=Winkelkorrektur(z1.alpha-z2.alpha);
        result:=TPolarform.Create(r,alpha);
    end;
    class function TPolarform.konjugieren(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r;
        alpha:=Winkelkorrektur(z1.alpha);
        if (alpha<>180then alpha:=-alpha;
        result:=TPolarform.Create(r,alpha);
    end;
    function TPolarform.potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl;
    begin
        r:=EXP(LN(z1.r)*n);
        alpha:=Winkelkorrektur(n*z1.alpha);
        result:=TPolarform.Create(r,alpha);
    end;
    function TPolarform.radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl;
    begin
        r:=EXP(LN(z1.r)*(1/n));
        alpha:=(z1.alpha+2*k*180)/ABS(n);
        if (n<0then alpha:=-alpha;
        alpha:=Winkelkorrektur(alpha);
        result:=TPolarform.Create(r,alpha);
    end;
    function TPolarform.logarithmieren(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=LN(z1.r);
        alpha:=Winkelkorrektur(z1.alpha);
        b:=DegToRad(alpha);
        result:=TPolarform.Create(a,b);
    end;
    function TPolarform.Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=z1.r*cos(DegToRad(z1.alpha));b:=z1.r*sin(DegToRad(z1.alpha));
        result:=TKartesischeForm.Create(a,b);
    end;
    function TPolarform.Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r;
        alpha:=Winkelkorrektur(z1.alpha);phi:=DegToRad(alpha);
        result:=TExponentialform.Create(r,phi);
    end;


    constructor TExponentialform.Create(r1,phi1: EXTENDED);
    begin
       if (r1>0then begin
           r:=r1;phi:=phi1;
       end else raise ERangeError.Create('Betrag hat den Wert 0');
    end;

    function TExponentialform.Winkelkorrektur(phi1: EXTENDED):EXTENDED;
    begin
        if (ABS(phi1)>=360then
            phi1:=phi1-360*int(phi1/360);
        if (ABS(phi1)>=180then
            if (ABS(phi1)=180then phi1:=180
            else phi1:=phi1-360*ABS(phi1)/phi1;
        result:=phi1;
    end;
    function TExponentialform.addieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=hypot(z1.r*cos(z1.phi)+z2.r*cos(z2.phi),
                 z1.r*sin(z1.phi)+z2.r*sin(z2.phi));
        if (iszero(r)) then begin
            r:=0;phi:=0;
        end else
            phi:=arctan2(z1.r*cos(z1.phi)+z2.r*cos(z2.phi),
                         z1.r*sin(z1.phi)+z2.r*sin(z2.phi));
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=hypot(z1.r*cos(z1.phi)-z2.r*cos(z2.phi),
                 z1.r*sin(z1.phi)-z2.r*sin(z2.phi));
        if (iszero(r)) then begin
            r:=0;phi:=0;
        end else
            phi:=arctan2(z1.r*cos(z1.phi)-z2.r*cos(z2.phi),
                         z1.r*sin(z1.phi)-z2.r*sin(z2.phi));
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r*z2.r;phi:=Winkelkorrektur(z1.phi+z2.phi);
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r/z2.r;phi:=Winkelkorrektur(z1.phi-z2.phi);
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.konjugieren(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r;
        phi:=WInkelkorrektur(z1.phi);
        if (phi<>PI) then phi:=-phi;
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl;
    begin
        r:=EXP(LN(z1.r)*n);
        phi:=Winkelkorrektur(n*z1.phi);
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl;
    begin
        r:=EXP(LN(z1.r)*(1/n));
        phi:=(z1.phi+2*k*PI)/ABS(n);
        if (n<0then phi:=-phi;
        phi:=Winkelkorrektur(phi);
        result:=TExponentialform.Create(r,phi);
    end;
    function TExponentialform.logarithmieren(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=LN(z1.r);
        b:=Winkelkorrektur(z1.phi);
        result:=TExponentialform.Create(a,b);
    end;
    function TExponentialform.Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        a:=z1.r*cos(z1.phi);b:=z1.r*sin(z1.phi);
        result:=TKartesischeForm.Create(a,b);
    end;
    function TExponentialform.Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl;
    begin
        r:=z1.r;
        phi:=Winkelkorrektur(z1.phi);alpha:=RadToDeg(phi);
        result:=TPolarform.Create(r,alpha);
    end;
end.


Meine andere Unit die KOMPLEX einbindet und für die GUI verantwortlich ist sieht wie folgt aus.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
unit GUI;

interface

uses
  Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
  Dialogs,StdCtrls,KOMPLEX,INFO, Menus, ExtCtrls;

type
  TfmKZ = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    CBAuswahl1: TComboBox;
    CBAuswahl2: TComboBox;
    btnRechnen: TButton;
    btnEnde: TButton;
    ListBox1: TListBox;
    PopupMenu1: TPopupMenu;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Hilfe1: TMenuItem;
    Hilfe2: TMenuItem;
    INFO1: TMenuItem;
    Leeren1: TMenuItem;
    Beenden1: TMenuItem;
    Leeren2: TMenuItem;
    Beenden2: TMenuItem;
    procedure Edit1KeyPress(Sender: TObject;var Key: Char);
    procedure Edit5KeyPress(Sender: TObject;var Key: Char);
    procedure CBAuswahl1KeyPress(Sender: TObject;var Key: Char);
    procedure CBAuswahl1Change(Sender: TObject);
    procedure CBAuswahl2Change(Sender: TObject);
    procedure Leeren1Click(Sender: TObject);
    procedure btnRechnenClick(Sender: TObject);
    procedure btnEndeClick(Sender: TObject);
    procedure Hilfe2Click(Sender: TObject);
    procedure INFO1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmKZ: TfmKZ;

implementation

{$R *.dfm}

...

procedure TfmKZ.btnRechnenClick(Sender: TObject);
var
    z1,z2,erg: TKomplexeZahl;
    k: WORD;
begin
    k:=0;
    if ((CBAuswahl1.ItemIndex<>-1and (CBAuswahl2.ItemIndex<>-1)) then begin
        try
            if (Listbox1.Items.Count<>0then Listbox1.Clear;
            ...
            z1:=TKartesischeForm.Create(StrToFloat(Edit1.Text),StrToFloat(Edit3.Text));
            if (CBAuswahl2.ItemIndex<4then
               z2:=TKartesischeForm.Create(StrToFloat(Edit2.Text),StrToFloat(Edit4.Text));
            case CBAuswahl2.ItemIndex of
                0: erg.addieren(z1,z2);
                1: erg.subtrahieren(z1,z2);
                2: erg.multiplizieren(z1,z2);
                3: erg.dividieren(z1,z2);
                4: erg.konjugieren(z1);
                5: erg.potenzieren(z1,StrToInt(Edit5.Text));
                ...
            end;
        except
           ...
        end;
    end;
end;

procedure TfmKZ.btnEndeClick(Sender: TObject);
begin
    close;
end;
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Mi 30.09.09 18:55 
user profile iconbaphumet hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
...
                0: erg.addieren(z1,z2);
...

Was passiert hier mit dem neu erzeugten Objekt welches Du als Result zurückgibst? -> Nix, ausser das es permanent Speicher belegt und mangels Verweis nicht mehr ansprechbar ist.

Moderiert von user profile iconNarses: Delphi-Tag repariert.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 30.09.09 19:26 
@user profile iconTryer: Ich glaube, das hat er verstanden ;) ...

user profile iconbaphumet hat folgendes geschrieben Zum zitierten Posting springen:
der Betrag r bleibt erhalten
Alphi und Phi enstprechen sich doch genauso. Du hast zwei Klassen, die exakt die gleichen Parameter enthalten und in fast allen Fällen genau gleich rechnen, deswegen ist die trigonometrische Form imo unnötig. Exponential- und algebraische Form reichen vollkommen aus.


user profile iconbaphumet hat folgendes geschrieben Zum zitierten Posting springen:
class function ist in Delphi 7 möglich, aber ich habe keine Ahnung wie das bei mir jetzt aussehen müsste.
Wie gesagt: Für Polymorphie sehe ich hier wenig Chancen. Wenn du trotzdem in der Lage sein willst, zwei TKomplexeZahl-Instanzen zu addieren, ohne ihre genaue Form zu kennen, wirst du in der Basisklasse solche Methoden erstellen müssen:
ausblenden Delphi-Quelltext
1:
class function TComplex.Add(z1 : TComplex; z2 : TComplex) : TComplex;					

In der Implementierung überprüfst du dann per is, um welche Formen es sich handelt, und führst die entsprechende Rechnung durch. Damit hättest du effektiv Algebraic Data Types und Pattern Matching aus der funktionalen Programmierung nachgebaut.
Die "Winkelkorrigierung" kann ruhig im Konstruktor bleiben, dort gehört sie hin. Was du allerdings unbedingt ändern solltest: Wozu braucht die kartesische Form denn ein "phi"? Deklariere die Klassenfelder erst in der Klasse, in der du sie brauchst. Also a und b in der kartesischen, r und phi in der polaren.

Wenn du auf diese Abstraktion verzichten kannst, stellst du lieber konkrete Methoden wie
ausblenden Delphi-Quelltext
1:
2:
3:
class function TComplexCartesian.Add(z1 : TComplexCartesian; z2 : TComplexCartesian) : TComplexCartesian;
...
class function TComplexPolar.Add(z1 : TComplexPolar; z2 : TComplexPolar) : TComplexPolar;

und Methoden zum Umwandeln bereit. Dann gibt es auch keinen wirklichen Grund mehr, überhaupt noch Klassen statt Records zu benutzen.

_________________
>λ=
baphumet Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: Do 01.10.09 00:18 
Hi, Kha deine Antwort klingt logisch und ich ist für mich nachvollziehbar. Versuche diese gerade anzuwenden und zu programmieren, wie ich richtig sehe können die Konstruktoren in den abgeleiten Klassen unverändert bleiben, benötigen also keine class.

Außerdem möchte ich mich hiermit bei allen in aller Form für mein Benehmen entschuldigen, ist nicht meine Art, aber wenn man paar Tage an einem Problem hängt und verzweifelt nach einer ordentlichen Lösung sucht, dann liest man nicht mehr richtig und ist schon mit den Nerven am Ende. Nochmals Entschuldigung.

Mein Code sieht so aus, das mit dem is Operator muß in jeder Methode getan werden, es muss also georüft werden was für Objekte z1 und z2 sind, also von welcher Klasse.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
TKomplexeZahl=class
private
public
    class function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    class function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    class function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    class function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    class function konjugieren(z1: TKomplexeZahl):TKomplexeZahl;virtual;abstract;
    class function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; virtual;abstract;
    class function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; virtual;abstract;
    class function logarithmieren(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    class function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    class function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; virtual;abstract;
    function Ausgabe1():String;
    function Ausgabe2():String;
    function Ausgabe3():String;
    end;
    TKartesischeForm=class(TKomplexeZahl)
    private
        a,b
    public
        constructor Create(a1,b1: EXTENDED);
        class function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function konjugieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; override;
        class function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; override;
        class function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; override;
    end;
    TPolarform=class(TKomplexeZahl)
    private
        r,alpha: EXTENDED;
    public
        constructor Create(r1,alpha1: EXTENDED);
        class function Winkelkorrektur(alpha1: EXTENDED):EXTENDED;
        class function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function konjugieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; override;
        class function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; override;
        class function logarithmieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; override;
    end;
    TExponentialform=class(TKomplexeZahl)
    private
        r,phi: EXTENDED;
    public
        constructor Create(r1,phi1: EXTENDED);
        class function Winkelkorrektur(phi1: EXTENDED):EXTENDED;
        class function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function subtrahieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function multiplizieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function dividieren(z1,z2: TKomplexeZahl):TKomplexeZahl; override;
        class function konjugieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function potenzieren(z1: TKomplexeZahl;n: SmallInt):TKomplexeZahl; override;
        class function radizieren(z1: TKomplexeZahl;k,n: SmallInt):TKomplexeZahl; override;
        class function logarithmieren(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function Umwandlung1(z1: TKomplexeZahl):TKomplexeZahl; override;
        class function Umwandlung2(z1: TKomplexeZahl):TKomplexeZahl; override;
    end;

implementation



class TPolarform.function addieren(z1,z2: TKomplexeZahl):TKomplexeZahl;
begin
    if z1 is TPolarform and z2 is TPolarform then result:=TPolarform(Rechnung);

end;


Meine Frage ist das mit dem is jetzt richtig und wie ich das Ergebnis zurückgebe oder hab ich etwas falsch gemacht nach deiner Ansicht?