| Autor |
Beitrag |
Jason07
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 24.05.11 16:11
Hi leute,
habe gerade eine Unit zur Vektor Rechnung geschrieben, bei der die additions Funktion nicht funktionieren will.
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:
| uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TVektor3 = class public x,y,z: Integer; constructor Create(x,y,z: Integer); function addiere(V2: TVektor3): TVektor3; function subtrahiere(V2: TVektor3): TVektor3; function skaliere(Sk:Integer):TVektor3; function bildeskalarprodukt(V2: TVektor3): Integer; end;
implementation
constructor TVektor3.Create(x,y,z:Integer); begin self.x := x; self.y := y; self.z := z; end;
function TVektor3.addiere(V2: TVektor3): TVektor3; begin addiere.x := self.x + V2.x; addiere.y := self.y + V2.y; addiere.z := self.y + V2.y; end; |
Exeption: EAccessViolation
Meldung:'Zugriffsverletzung bei Adresse 0044EF1B
Schreiben von Adresse 00000004.
Der Fehler liegt laut Compiler in der Zeile : addiere.x := self.x + V2.x;
Ich sehe in der Funtion addiere keinen Fehler. Hab auch schon als Test ausprobiert die Variablen einzeln auszugeben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function TVektor3.addiere(V2: TVektor3): TVektor3; begin addiere.x := self.x; addiere.y := self.y; addiere.z := self.y; end;
function TVektor3.addiere(V2: TVektor3): TVektor3; begin addiere.x := V2.x; addiere.y := V2.y; addiere.z := V2.y; end; | Beide liefern ein Normales Int Ergebniss. Wo liegt dann das Problem zwei Int-Variablen zu Addieren???? Ich weiß echt net mehr weiter.
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 24.05.11 17:01
Hi und  im Forum!
Schauen wir uns doch mal deine Funktion addieren an:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function TVektor3.addiere(V2: TVektor3): TVektor3; begin addiere.x := self.x + V2.x; addiere.y := self.y + V2.y; addiere.z := self.y + V2.y; end; |
Hier addierst du den Wert der jeweiligen Komponenten deines Vektors v2 auf den deines Vektors v1 und gibst das Resultat als neuen(!) Vektor zurück.
Das Problem an der Sache ist, dieses Objekt existiert an dieser Stelle noch nicht.
Also gibt es beispielsweise zwei Möglichkeiten das ganze korrekt zu gestalten:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TVektor3.addiere(V2: TVektor3); begin self.x := self.x + V2.x; ...
function TVektor3.addiere(V1, V2: TVektor3): TVektor3; begin result := TVektor3.Create(0,0,0); result.x := V1.x + V2.x; result.y := V1.y + V2.y; result.z := V1.z + V2.z; end; |
So oder so ähnlich. Damit sollte man auf jeden Fall weiter arbeiten können.
Bei solchen Problemen bietet sich es im Grunde immer an, in der entsprechenden Methode einen Breakpoint zu setzen und die Routinen zu debuggen.
Beste Grüße,
Marc
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 24.05.11 17:08
Wobei an dieser Stelle ein Record mit überladenen Operatoren geradezu prädestiniert für die Aufgabe wäre.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| TVektor3 = record x, y, z: Integer; procedure Init(x, y, z: Integer); class operator Add(a, b: TVektor3): TVektor3; class operator Subtract(a, b: TVektor3): TVektor3; end; | Der Grund ist, dass du jetzt einfach direkt mit den Variablen von dem Typ rechnen kannst: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var Test1, Test2, Test3: TVektor3; begin Test1.Init(3, 4, 5); Test2.Init(5, 4, 3); Test3 := Test1 + Test2; | Sieht doch schöner aus, oder? 
|
|
Jason07 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 24.05.11 20:15
Danke für eure Antworten =) jetzt kann ich endlich weiter arbeiten.
Es gehts doch hier um die Exitenz von dem Vektor der den Rückgabewert der Funktion aufnimmt oder?
Warum kann ich dann der Funktion einen Int-Wert übergeben, den sie korrekt bearbeitet?
Bsp.:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function TVektor3.addiere(V2:TVektor3):TVektor3; begin addiere.x := 1; ... end; Edit1.text := IntToStr(V1.addiere.x) | So funtioniert die Funtion einwandfrei.
Addiere ich jedoch zwei Werte:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function TVektor3.addiere(V2:TVektor3):TVektor3; begin addiere.x := 1; ... end; ... var test1, test2, test3: Integer; test1 := 1; test2 := 2; test3 := test1+ test2; Edit1.text := IntToStr(V1.addiere.test) | Setz ich nun test1 oder test2 in die Funktion Funtioniert sie optimal.
Stz man Test3 ein dann kommt wieder der oben genannte Error.
Test3 müsste doch eigentlich auch ein Normaler Int-Wert sein oder? Was ist an ihm anders , dass die Funtion nicht Funtioniert?
Übrigens vielen dank für den Tipp mit dme Überladen von Operatoren.
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mi 25.05.11 10:56
Jason07 hat folgendes geschrieben : | Warum kann ich dann der Funktion einen Int-Wert übergeben, den sie korrekt bearbeitet?
Bsp.:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function TVektor3.addiere(V2:TVektor3):TVektor3; begin addiere.x := 1; ... end; Edit1.text := IntToStr(V1.addiere.x) |
So funtioniert die Funtion einwandfrei. |
So kann deine Funktion ja schon einmal nicht aussehen, da diese hier einen Parameter erwartet.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function TVektor3.addiere(V2:TVektor3):TVektor3; begin addiere.x := 1; ... end; ... var test1, test2, test3: Integer; test1 := 1; test2 := 2; test3 := test1+ test2; Edit1.text := IntToStr(V1.addiere.test) |
Was machst du denn hier?
Was haben test1..test3 mit deiner Vektor-Addition zu tun?
So lange ist der Code nun nicht. Post uns doch mal das, was du genau gemacht hast - am besten in den Delphi-Tags verpackt [delphi ] Code [/delphi ].
Manchmal hilft auch einfach nochmal kurz drüber nachdenken. 
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 25.05.11 11:10
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mi 25.05.11 13:25
jaenicke hat folgendes geschrieben : | Das sieht schrecklich aus, ich weiß, dass Delphi das (leider) aus Kompatibilitätsgründen noch kann, aber das Ergebnis heißt eigentlich Result. So wie du es schreibst denkt man jedesmal erst einmal an einen rekursiven Aufruf...
|
Klappt nur begrenzt. Bei mir hats immer Probleme gegeben, wenn ich nicht Result benutzt hab...
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
beastofchaos
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Mi 25.05.11 17:42
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mi 25.05.11 18:07
|
|
beastofchaos
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Mi 25.05.11 22:19
|
|
Jason07 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 27.05.11 22:14
Sry leute kann euch den Quelltext leider nicht mehr zeigen. Das Programm ist mittlerweile komplett überarbeitet und beherscht nun Vektoren und Matritzen rechnung fehlerfrei. Danke nochmal für eurer Hilfe, denn diese Anweisung hab ich häufiger gebraucht: "result := TVektor2.create(0,0,true);". Hatte auch mal versucht die Operatoren, wie im obigen Beispiel zu überladen. Erhalte dabei jedoch immer folgende Fehlermeldung: "[Fehler] Kartenstapel.pas(13): ',' oder ':' erwartet, aber Bezeichner 'Karten' gefunden"
Hab alles genauso geschrieben wie im obigen Beispiel.
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 28.05.11 04:45
Jason07 hat folgendes geschrieben : | Hatte auch mal versucht die Operatoren, wie im obigen Beispiel zu überladen. Erhalte dabei jedoch immer folgende Fehlermeldung: "[Fehler] Kartenstapel.pas(13): ',' oder ':' erwartet, aber Bezeichner 'Karten' gefunden"
Hab alles genauso geschrieben wie im obigen Beispiel. |
"Karten" kommt in dem Beispiel ja gar nicht vor. Wie sieht das denn in deinem Programm bis zu der Fehlerzeile aus?
Da du in deinem Profil keine Delphiversion angegeben hast, bin ich natürlich von einer einigermaßen aktuellen ausgegangen. Denn das Beispiel funktioniert nur ab Delphi 2006, Delphi 1-7 und 2005 konnte das noch nicht.
|
|
|