![]() |
Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Hallo erstmal :)
Ich bin so verzweifelt, dass ich mich extra in nem Delphi-Forum angemeldet hab o_O Also ich schreib meine Facharbeit in Informatik, ein vereinfachtes, listenbasiertes Tetris Wäre ich nicht unter Zeitdruck würd ich mich ja vorstellen und so, aber da ich meine Facharbeit bis Montag einreichen muss und bisher am Verzweifeln bin, mach ich es kurz: Ich soll ein vereinfachtes Tetris programmieren, welches auf Listen basier, Programmiersprache: Delphi7 Bedenkt bitte, dass ich erst seit der 11 in Delphi programmiere und auch abgesehen von Schule 0 mit Informatik zu tun hab :P Und ja, das Thema ist kacke, man hätte es anders machen können, etc. aber es ist halt jetzt einfach so^^ Aktuelles Problem: Bei TCurrent.draw; tritt eine EAccessViolation auf... Das Problem liegt ziemlich genau hier:
Delphi-Quellcode:
Es wird nämlich versucht, von NIL eine procedure aufzurufen, sprich
If SteinListe.findelem(k.copy)<>Nil Then Form1.Image1.Canvas.Rectangle((k.x*50)-50,(k.y*50)-50, k.x, k.y);
Code:
Delphi-Quellcode:
führt dazu, dass NIL.compare versucht wird und alles spektakulär abstürzt
TListe.findElemFromCurrentPos(nil)
Hier mal mein gesamter Quelltext (ich vermute, dass es am Compare scheitert, bin aber nicht sicher): Für sonstige Anregungen/Verbesserungsvorschläge bin ich sehr offen :)
Delphi-Quellcode:
So far, vielen Dank im Vorraus und wäre über schnelle Hilfe unglaublich dankbar :)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, baseclss, listclss; type TForm1 = class (TForm) Image1: TImage; Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure play; private { Private-Deklarationen } public { Public-Deklarationen } end; type TStein = class (TBase) private x,y:integer; public constructor create(a,b:integer); function compare(tb:TBase):integer;OVERRIDE; function copy:TBase;OVERRIDE; end; type TBlock = class private a,b,c,d: TStein; public constructor create(w,x,y,z:TStein); procedure drop; function iswand(cc:TStein):boolean; procedure check; procedure draw; procedure right; procedure left; end; var Form1: TForm1; Block:TBlock; Stein:TStein; SteinListe:TListe; implementation {$R *.dfm} function TStein.compare(tb:TBase):integer; begin If x < TStein(tb).x Then result:=-1; If x > TStein(tb).x Then result:=+1; If y < TStein(tb).y Then result:=-1; If y > TStein(tb).y Then result:=+1; If (x = TStein(tb).x) AND (y = TStein(tb).y) Then result:=0; end; constructor TStein.create(a,b:integer); begin x:=a; y:=b; end; function TStein.copy:TBase; begin result:=TStein.create(x,y); end; procedure TBlock.right; begin IF (a.x<10) AND (b.x<10) AND (c.x<10) AND (d.x<10) Then Begin If SteinListe.findElem(a.copy)<>Nil Then begin a:=TStein.create((a.x)+1,(a.y)); SteinListe.update(a.copy); End; If SteinListe.findElem(b.copy)<>Nil Then begin b:=TStein.create((b.x)+1,(b.y)); SteinListe.update(b.copy); End; If SteinListe.findElem(c.copy)<>Nil Then begin c:=TStein.create((c.x)+1,(c.y)); SteinListe.update(c.copy); End; If SteinListe.findElem(d.copy)<>Nil Then begin d:=TStein.create((d.x)+1,(d.y)); SteinListe.update(d.copy); End; draw; end; End; Procedure TBlock.left; Begin IF (a.x>0) AND (b.x>0) AND (c.x>0) AND (d.x>0) Then Begin If SteinListe.findElem(a.copy)<>Nil Then begin a:=TStein.create((a.x)-1,(a.y)); SteinListe.update(a.copy); End; If SteinListe.findElem(b.copy)<>Nil Then begin b:=TStein.create((b.x)-1,(b.y)); SteinListe.update(b.copy); End; If SteinListe.findElem(c.copy)<>Nil Then begin c:=TStein.create((c.x)-1,(c.y)); SteinListe.update(c.copy); End; If SteinListe.findElem(d.copy)<>Nil Then begin d:=TStein.create((d.x)-1,(d.y)); SteinListe.update(d.copy); End; draw; end; End; constructor TBlock.create(w,x,y,z:TStein); begin a:=w; SteinListe.insertlast(w); b:=x; SteinListe.insertlast(c); c:=y; SteinListe.insertlast(y); d:=z; SteinListe.insertlast(z); end; procedure TBlock.drop; begin While (iswand(a)=false) AND (iswand(b)=false) AND (iswand(c)=false) AND (iswand(d)=false) Do Begin If SteinListe.findElem(a.copy)<>Nil Then begin a:=TStein.create((a.x),(a.y)+1); SteinListe.update(a.copy); End; If SteinListe.findElem(b.copy)<>Nil Then begin b:=TStein.create((b.x),(b.y)+1); SteinListe.update(b.copy); End; If SteinListe.findElem(c.copy)<>Nil Then begin c:=TStein.create((c.x),(c.y)+1); SteinListe.update(c.copy); End; If SteinListe.findElem(d.copy)<>Nil Then begin d:=TStein.create((d.x),(d.y)+1); SteinListe.update(d.copy); End; draw; sleep(500); application.processmessages; End; check; end; function TBlock.iswand(cc:TStein):boolean; var bi:TStein; begin result:=false; Bi:=TStein.create(cc.x,(cc.y)+1); If (SteinListe.findelem(bi.copy)<>NIL) Then result:=true; If (bi.y)>12 Then result:=true; end; procedure TBlock.check; var Ai:integer; function checkone(ac:integer):boolean; var kx,i : integer; k:TStein; begin i:=0; For kx:=1 to 10 Do Begin k:=TStein.create(kx,ac); If SteinListe.lookUp(k.copy)<>NIL Then i:=i+1; End; If i=10 Then result:=true Else result:=false; End; procedure dropall; var k:TStein; xi,yi:integer; begin For Yi:=1 to 13 Do Begin For Xi:=1 to 10 Do Begin k:=TStein.create(xi,yi+1); If SteinListe.findElem(k.copy)<>Nil Then SteinListe.update(k.copy); End; End; End; begin For Ai:=1 to 13 Do Begin If checkone(AI) Then Begin dropall; draw; end; end; end; procedure TBlock.draw; var k:TStein; xi,yi:integer; begin For Yi:=1 to 13 Do Begin For Xi:=1 to 10 Do Begin k:=TStein.create(xi,yi); If SteinListe.findelem(k.copy)<>Nil Then Form1.Image1.Canvas.Rectangle((k.x*50)-50,(k.y*50)-50, k.x, k.y); End; End; end; procedure TForm1.FormCreate(Sender: TObject); begin Image1.Canvas.brush.Color:=clblue; SteinListe:=TListe.create; end; procedure TForm1.Button3Click(Sender: TObject); begin play; end; procedure TForm1.play; begin randomize; CASE random(6) OF 1: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(6,1),TStein.create(6,2)) end; 2: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(6,1),TStein.create(4,2)) end; 3: Begin Block:=TBlock.create(TStein.create(4,2),TStein.create(5,1),TStein.create(6,1),TStein.create(5,2)) end; 4: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(6,2),TStein.create(5,2)) end; 5: Begin Block:=TBlock.create(TStein.create(4,2),TStein.create(5,2),TStein.create(6,2),TStein.create(3,2)) end; 0: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(5,2),TStein.create(4,2)) end; end; Block.draw; Block.drop; Block.draw; play; end; INITIALIZATION registerclass(TStein); end. MfG, shervine |
Aussagekräftiger Titel
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.
|
Re: Hilfe bei Facharbeit (EAccess Violation) u.v.m.
Kann doch nicht schaden, wenn der Thread öfter geöffnet wird xP
Ich find EAccessViolation ist schon relativ stark eingegrenzt, aber ich änder es nochmal :) |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Na dann such mal nach EAccessViolation hier im Forum.
|
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Hab ich schon vor der Registrierung^^
Da muss ich dir Recht geben ;) |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Benötige immer noch dringende Hilfe :( Abgabe ist am Montag, ich schreib zwar grad den Textteil dazu, wie es funktionieren sollte, aber ein funktionierendes Programm ist immer besser
|
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Das Problem ist,d u hast uns hier einfach Quellcode vor die Füße geworfen. Eine Fehlermeldung hast du uns zwar genannt, aber nicht wo und wann sie im Quellcode auftritt. Was sollen wir jetzt machen? Im Kopf dein ganzes Programm debuggen? Uns aus dem Quellcode mühsam ein lauffähiges Projekt erstellen? Also entweder grenzt du die Fehlerquelle selber etwas ein oder du hängst hier mal das ganze Projekt an.
Hast du denn schon selber mal das Projekt debuggt? Haltepunkte gesetzt und/oder mal in Einzelschritten den Code durchgegangen und dir mal die Werte der Variablen angeguckt? Die Zugriffsverletzung deutet darauf hin, dass du auf ein nicht initialisiertes Objekt zugreifst oder in einem dynamischen Array auf einen nicht vorhandenes Element außerhalb des Arrays. |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab doch oben die Prozedur genannt, an der alles scheitert und sogar schon rausgefunden, dass NIL als Parameter weitergegeben wird, was unweigerlich zum Absturz führt :(
Aber bitte, hier das gesamte Projekt |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Na dann übergib eben nicht NIL.
|
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Da liegt ja das Problem :(
Ich hab keinen blassen Schimmer, wieso dort NIl übergeben wird An der Klasse TListe/TListNode kann es nicht liegen, die funktionierte immer fehlerfrei (genauso wie ihre Methoden), immerhin hab ich die auch von der Schule bekommen |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Das musst du doch wissen. Du hast den Code doch geschrieben.
|
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Dann frag doch einfach ab, ob:
k.copy <> nil und führ deine weitere Abfrage erst anschließend durch ... |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Erstens:
Delphi-Quellcode:
Die letzte If Anweisung kannst du dir sparen, wenn du vorher result auf 0 setzt.
function TStein.compare(tb:TBase):integer;
begin If x < TStein(tb).x Then result:=-1; If x > TStein(tb).x Then result:=+1; If y < TStein(tb).y Then result:=-1; If y > TStein(tb).y Then result:=+1; If (x = TStein(tb).x) AND (y = TStein(tb).y) Then result:=0; end; zweitens: Du verwendest diese Methode überhaupt nicht. Drittes: Ist immer gewährleitest das der richtige Datentyp in tb drin ist ? du castest "hard" ändere da mal in (tb as TStein).x um. Du kannst auch mit tb.classname schauen ob die richtige Klasse drin ist. Viertens: Du kannst mit Assigned prüfen ob tb einen Wer hat. Fünftens: Deine Art und weise wie du den Code geschrieben hast, ist nicht gerade "Praktisch", wenn du mehr Zeit hättest, würde ich dir noch weitere Vorschläge machen. Aber das würde ein kompletten Neu Anfang bedeuten. Sechstens: Es gibt eine Praktische Funktion die sich ptInPoint nennt. Schau sie dir mal an. edit01: Danke an "fkerber". Ist mir beim Schreiben Gar nicht aufgefallen. *G* |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
|
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Hi,
es schmiert in TListe.getElem() ab. Und zwar hier:
Delphi-Quellcode:
Vermutlich setzt du next in den anderen Funktionen nicht richtig. Ausserdem ist mir aufgefallen, dass du bei TBlock.draw den Speicher nicht wieder freigibst, der von "k.copy" reserviert wird. Leider muss ich mich auf "fünftens" von mimi anschließen, das ist alles nicht gerade schön oder optimal, aber das hilft dir wohl jetzt nicht besonders weiter, weil die Zeit so knapp ist :( ...
IF NOT endpos
THEN result := current.next.value // Bumm ELSE result := NIL |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Mir ist noch was aufgefallen:
in der Procedure TBlock.right; verwendest du eine Variable b, ich finde nicht die stelle wo du diese Variable Erstellst bzw. Zuweist. und in den anderen Methoden wie left und soweit ist das der gleiche Fall. Warum machst du das Eigentlich so Kompliziert über "Verkette" listen ? Es gibt TObjectList oder dient das jetzt nur zu Schluschen Zwecken ? PS: Gehört Eigentlich nicht herein, aber: Ich frage mich: Wie bringt eurer Lehrer euch Informatik bei ? Gut, dass man es nicht lieben muss ist eine Sache. Aber dem Lehrer würde ich eine Glatte Sechs geben, wenn es darum geht Informatik zu Unterrichten, oder Täuscht das ? |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Also mich wundert überhaupt, dass sich das kompilieren lässt. Zumindest muss es Warnungen geben.
|
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Mit ein paar Eingriffen lässt es sich kompilieren.
Wenn das auf dem Mist des Lehrers gewachsen ist... schließe ich mich mimi noch einmal an... |
Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Ich glaube da fällt uns noch die Hälfte.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz