Autor Beitrag
Dornathal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: So 30.09.07 22:44 
Bin neu bie Delphi und hab mal ne Frage: Bei dieser Funktion stürzt der Compiler ab ich weis nicht wieso. Müsste eigentlich klappen. Soll die Entfernung zwischen zwei pixeln auf dem Bilschirm ausrechnen und dann schauen ob zwei Kreise miteinander Collidieren.

die beiden variablen hatStift.vposition /.. hposition entsprechen einem real typen, zRadius und andererBall.zradius einem Integer (wenn wer was damit anfangen kann von mSuM die GanzeZahl)

Ich hoffe jemadn weis was da passiert und wieso das andauernd abstüzt. Danke im Vorraus.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  function TBall.Collision(andererball:TBall):Boolean;
      begin

      if (sqr(andererBall.hatSTift.hPosition - hatStift.hPosition)+sqr(andererBall.hatStift.vPosition - hatSTift.vPosition)) <= sqr(zRadius + andererBall.zRadius) then
      Result:= true
      else
      Result:= false;
  end;
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.10.07 07:16 
Wie stürzt 'der Compiler' denn ab? Der Compiler ist eigentlich ein sehr stabiles Programm.

Mach doch mal einen Screenshot, denn aus deinen Ausführungen wird man leider nicht schlau.

_________________
Na denn, dann. Bis dann, denn.
Stormwehr
Hält's aus hier
Beiträge: 3

Windows XP
Delphi 7 Prof. | Delphi 2005 Enterprise Edition
BeitragVerfasst: Mo 01.10.07 09:41 
user profile iconDornathal hat folgendes geschrieben:
Bin neu bie Delphi und hab mal ne Frage: Bei dieser Funktion stürzt der Compiler ab ich weis nicht wieso. Müsste eigentlich klappen. Soll die Entfernung zwischen zwei pixeln auf dem Bilschirm ausrechnen und dann schauen ob zwei Kreise miteinander Collidieren.

die beiden variablen hatStift.vposition /.. hposition entsprechen einem real typen, zRadius und andererBall.zradius einem Integer (wenn wer was damit anfangen kann von mSuM die GanzeZahl)

Ich hoffe jemadn weis was da passiert und wieso das andauernd abstüzt. Danke im Vorraus.



Ich vermute einfach mal das du mit der mSum.pas von Ulrich Borghoff arbeitest. Das ganze mal im typischen Schulbeispiel hergenommen und darin deine "Collision" Funktion kurz getestet. Diese funktioniert auch soweit, weshalb du uns mehr Informationen geben müsstest, vor allem was dein Compiler dir mitteilt.

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:
unit Unit2;

interface

uses
  ..., mSum ;
 {Einfaches Beispiel ist auf vielen Schulseiten zu finden. Bsp.:
  ...herr-willenbring.de/info/...  
  der unten nur leicht geänderte Quellcode hab ich von dortigen 
  Beispielen übernommen und kurz für deine Sache angepasst!
  }

type
  TBall = class
    hatStift : Stift;
    zRadius : integer;
    geschwindigkeit: real;
  public
    constructor init(startX : Integer; startY : Integer; startWinkel: Integer; startGeschwindigkeit : real);
    function hPosition: Real;
    function vPosition: Real;
    function Collision(andererBall: TBall): Boolean;
  end;

  TForm2 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  ersterBall, zweiterBall:TBall;

implementation

{$R *.dfm}

constructor TBall.init(startX : Integer; startY : Integer; startWinkel: Integer; startGeschwindigkeit : real);
begin
     hatStift := Stift.init;
     hatStift.bewegeBis(startX,startY);
     hatStift.dreheBis(startWinkel);
     zradius := 10;
     geschwindigkeit := startGeschwindigkeit;
end;

function TBall.hPosition: real;
begin
  Result := hatStift.hPosition;
end;

function TBall.vPosition: real;
begin
  Result := hatStift.vPosition;
end;

function TBall.Collision(andererBall: TBall):Boolean;
begin
if ( sqr(andererBall.hatStift.hPosition - hatStift.hPosition) + sqr (andererBall.hatStift.vPosition - hatStift.vPosition)) <= sqr (zRadius + andererBall.zRadius)  then
  Result:= True
else
  Result := False;
end;

procedure TForm2.FormActivate(Sender: TObject);
begin

  ersterBall  := TBall.init(300,300,100,0.4);
  zweiterBall := TBall.init(200,300,320,0.3);

  if (ersterBall.Collision(zweiterBall)) then
    ShowMessage('Collision')
  else
    ShowMessage('no Collision');

  close;
end;

end.
Dornathal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mo 01.10.07 10:52 
Danke für die Antworten schon mal.

Also das Problem is ja: der Compiler stürzt ab ohne das der was sagt. Also ich starte das Programm und dann verändert sich der Bildschirm für ne 10tel sekunde und dann ist das ganze auch schon wieder weg. Sprich ich seh den Desktop wieder mit genau dem selben Text usw. wie vor dem Ausführen des Programms. OHNE Fehlermeldung.

Das ist es was mich irritiert. und auch mit einzelnen Anweisungen kann man nichts ausrichten.

Also um die Funktion noch beser zu erklären: die mBall.pas (mit der TBall drin) enthält ein Array mit allen Bällen. hab ich dann von der pBilliard.dpr aus übergeben. Eine For schleife in der TBall Klasse ruft nun die Funktion so oft auf wie es Bälle gibt. Lässt das aber sein wenn es derselbe ball ist (glaicher Arraywert).

Nun wurden ja die anderen Bälle an die funktion weitergegeben und es wird halt mit dem Satz des Phytagoras geprüft ob die kollidieren. <<< wär schon wenn hier ist das programm dann plötzlich weg. egal ob collision oder nicht.

Ich hab mal den aktuellen Stand angehängt und hoffe das mir einer helfen kann.

Könnt ihr durch meinen Quelltext durchsteigen?
Wenn ihr kritik an der ordentlichkeit abt dann sagt mir das auch pls.

Moderiert von user profile iconAXMD: Doppelposting entfernt.
Einloggen, um Attachments anzusehen!
Stormwehr
Hält's aus hier
Beiträge: 3

Windows XP
Delphi 7 Prof. | Delphi 2005 Enterprise Edition
BeitragVerfasst: Mo 01.10.07 12:30 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
...

procdure TBall.bewegeDich;
begin
  ...
  for x:=0 to zBaelle do
  begin
    if (self.Collision(andererBall[x])) then Abprallen_Ball(andererBall[x]);
  end;

end;

end;

...


nimm mal einen Ball weg zBaelle - 1, du hast ja auch nur 18 Bälle!
Dornathal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mo 01.10.07 12:48 
Boahr Supi das funzt. Dankö

<wasn funzi Fehler. manchmal halt blind vorm Pc>
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Mo 01.10.07 19:44 
Übrigens vermute ich stark, dass nicht der Compiler abstürzt, sondern dein Programm selber, nachdem es compiliert wurde.

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Di 02.10.07 08:10 
Probier das nächste Mal doch die "Einzele Anweisung (F7)"! :lol:
Dornathal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Sa 06.10.07 19:20 
user profile iconDornathal hat folgendes geschrieben:

Das ist es was mich irritiert. und auch mit einzelnen Anweisungen kann man nichts ausrichten.


Ähhm ja... hab ich ja gemacht bloss irgendwie hab ich damit nur rausgefunden dass der genau bei der funktion abschmiert. Bloss das der Fehler beim Aufrufen der Funktion lag hab ich net mitbekommen.

(Angefangen hab ich mit Delphi durch den Informatikunterricht dieses Jahr. Bloss hab ich schon was in VB6 gemacht weshalb ich nen bisserl schon weiterarbeiten kann. Hab da halt nicht dran gedacht dass es an dem Index liegt. VB6 hat dazu dann ne Fehlermeldung mit dem Inhalt dass es den Index nicht giebt. Daran konnt ich mich bis jetzt orientieren.)