| Autor |
Beitrag |
Fred Ferkel
      
Beiträge: 87
|
Verfasst: Mo 17.02.03 16:14
:hi:
ich hab da ein kleines prob... hab da so "versucht" nen snake clon zu proggen.. funktionierte auch alles ganz gut bis, ja bis ich eine weitere funktion hinzugefügt habe und jetzt kommt immer irgendeine fehlermeldung, kein plan wieso denn stack overflows bin ich nur von rekusionen bzw. fehlerhaften rekusionen gewohnt naja jedenfalls wärs echt supi wenn einer von euch oder möglichst viele eben sich mal ansehen könnten woran es liegt, der einfachheit halber hab ich mal das ganze dingelchen geuppt und bitte bitte seht es euch an..ich verzweifle noch...sonst kann ich die fehler ja immern noch irgendwie finden aber es sieht echt alles ok aus...durch debuggen hab ich nix herausgefunden...das ist echt merkwürdig..*wunder*
fred_ferkel.tripod.com/snake.zip
fred_ferkel.tripod.com/snake.rar
und eine compo-sammlung die ich verwendet habe
fred_ferkel.tripod.com/05_-_flatstyle.rar
fred_ferkel.tripod.com/05_-_flatstyle.zip
mfg Sven aka the ferkel[/url]
Zuletzt bearbeitet von Fred Ferkel am Sa 22.02.03 02:12, insgesamt 3-mal bearbeitet
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Mo 17.02.03 22:24
ich habe delphi 5 und win2k
und was ich auch nicht sagte ist das man noch auf play klicken muss...
hab delphi sogar schon neu installiert aber naja..
sagt mal bitte auch dann bescheid wenn ihr keine ahung habt damit ich so den überblick hab ob sich überhaupt jemand um mein prob kümmert...
cya
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.02.03 22:54
Win2k SP3. Nach Eingabe den Namens und Klick auf Play verabschiedet sich das Programm einfach.
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Mo 17.02.03 23:09
ja genauso bei mir..
hast du mal versucht zu debuggen?? bei mir krepiert er direkt am anfang der readlevel prozedur.. 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.02.03 23:13
Wenn das Ding ohne fremd Komponenten unter D6 personal laufen würde wäre das kein Problem. Aber ich habe keien Lust mir wegen diesen einem mal mir die Kompos zu installieren, weil ich weiß, dass ich sie nie wieder brauchen werde für eigene Anwendungen.
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Mo 17.02.03 23:28
achja irgendwie werden die highscores auch nicht so angeziegt wie ich mir das denke, die werden richtig geladen aber irgendwie springen die namen dann wieder auf ''...!? ohne das es dazu einen befehl gibt...
für die die keinen bock auf die kompo haben, hier mit den standard kompos:
fred_ferkel.tripod.com/snake_without.zip
fred_ferkel.tripod.com/snake_without.rar
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mo 17.02.03 23:39
Hi,
also bei mir startet das Programm.. ich klick auf dieses SchlangenBild und dann hänger er wohl in ner EndlosSchleife fest... (Keine Fehlermeldung) werd es mir gleichmal anschauen
Au'revoir,
Aya
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mo 17.02.03 23:43
Soo....
erste sache... mach UNBEDINGT ein DoubleBuffered mit rein..
gleich als erstes im OnCreate:
Quelltext
Ansonsten konnte ich nich weitertesten... sobald ich ne Pfeiltaste drücke gibt's ne AccessViolation und ich hab nich gefunden wo du auf die Tastendrücke reagierst..
Au'revoir,
Aya
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Di 18.02.03 00:17
hi
thx bei mir kommt zumindest imernoch an derselben stelle der fehler (die stelle ist bei den versionen mit/ohne die komponentensammlung zwar unterschiedlich aber naj egal) die tasteneingeben verarbeite ich in der funktion
Quelltext 1:
| function getkeycommands(var won,lost,quit:boolean):boolean; |
tut mir echt leid das es so unübersichtlich ist... ich hatte die units wieder zusammengelegt um da irgendwelche fehler auszuschließen aber naja... trotzdem danke erstmal!!
cya
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 18.02.03 00:33
Wenn ich die SplashScreen rausnehme bekomme ich keine AccessViloation, aber ich sehe dann nur einen baby-blauen Bildschirm.
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Di 18.02.03 06:29
hi
hm und die buttons sind dann auch nicht da?? ich bekomme auch dann noch die accessviolation am anfang der loadlevelprocedur..  aber erklär mal bitte wie dus gemacht hast
mfg Sven
ps: wenn cih die loadlevelprozedur rausnehme dann krepelt er in der paintblocksprozedur ab und wenn ich die rausnehme dann in der depaintsnake-prozedur... und bei keinem der fehler erkenne ich den grund denn wieso kann es bei den 3anweisungen an den anfängen der 3 obigen prozeduren zu soclhen exceptions kommen?
Quelltext 1: 2: 3:
| ini:=Tinifile.create(extractfilepath(application.exename)+'level.dat'); form1.image1.canvas.brush.color:=clnavy; form1.image1.canvas.pen.color:=rgb(118,176,248); |
Moderiert von Tino: Code-Tags hinzugefügt.
sorry fürs verplanen der tags
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Di 18.02.03 19:32
hi
ich habe jetzt soviel gelöscht wie möglich ohne den fehler zu eliminieren
jetzt müsste es einfacher sein herauszufidnen woran es liegt..aber ich hab keine ahnung...
die datei pak0.pak ist acuh in den files oben dabei.^.
mfg sven
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) B_play: TButton; Image1: TImage; procedure B_playClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var form1:Tform1; pakim:array[0..18]of TBitmap; snakepoints:array of Tpoint; snakeheaddir:integer; gamepoints:integer; gottarget:integer=0;
const snakewidth:integer=21; snakestep:integer=1; speedvar:extended=0.005; //1=0.005 3=0.015 7=0.035 21=0.105
function getkeycommands(var won,lost,quit:boolean):boolean;
implementation
{$R *.DFM}
procedure loaddximagelist; var ms:Tmemorystream; buffer:array[0..1023]of char; bmpname:string; filenumber,i,currentfilepos,bmpsize,numread:integer; f:file; begin currentfilepos:=0; assignfile(f,extractfilepath(application.exename)+'pak0.pak'); reset(f,1); seek(f,9); blockread(f,filenumber,4); for i:=0 to filenumber-1 do begin ms:=Tmemorystream.create; seek(f,13+i*24); zeromemory(@buffer,sizeof(buffer));
blockread(f,bmpsize,4); blockread(f,buffer,20); bmpname:=buffer; seek(f,13+filenumber*24+currentfilepos); ms.SetSize(bmpsize);
currentfilepos:=currentfilepos+bmpsize; numread:=0; repeat bmpsize:=bmpsize-numread; if bmpsize>=sizeof(buffer) then blockread(f,buffer,sizeof(buffer),numread) else blockread(f,buffer,bmpsize,numread); ms.writebuffer(buffer,numread); until numread=0; ms.Position := 0; pakim[i]:=Tbitmap.create; pakim[i].LoadFromStream(ms); freeandnil(ms); end; closefile(f); end;
function getkeycommands(var won,lost,quit:boolean):boolean; var i:integer; begin result:=false; if getasynckeystate(VK_ESCAPE)<0 then quit:=true else begin if (getasynckeystate(VK_LEFT)<0)and((snakeheaddir=1)or(snakeheaddir=2)) then begin snakeheaddir:=4; result:=true; setlength(snakepoints,length(snakepoints)+1); for i:=high(snakepoints)-1 downto 0 do snakepoints[i+1]:=snakepoints[i]; end else if (getasynckeystate(VK_RIGHT)<0)and((snakeheaddir=1)or(snakeheaddir=2)) then begin snakeheaddir:=3; result:=true; setlength(snakepoints,length(snakepoints)+1); for i:=high(snakepoints)-1 downto 0 do snakepoints[i+1]:=snakepoints[i]; end else if (getasynckeystate(VK_UP)<0)and((snakeheaddir=3)or(snakeheaddir=4)) then begin snakeheaddir:=1; result:=true; setlength(snakepoints,length(snakepoints)+1); for i:=high(snakepoints)-1 downto 0 do snakepoints[i+1]:=snakepoints[i]; end else if (getasynckeystate(VK_DOWN)<0)and((snakeheaddir=3)or(snakeheaddir=4)) then begin snakeheaddir:=2; result:=true; setlength(snakepoints,length(snakepoints)+1); for i:=high(snakepoints)-1 downto 0 do snakepoints[i+1]:=snakepoints[i]; end; end; end;
procedure TForm1.B_playClick(Sender: TObject); var lost,won,quit:boolean; keyblock:integer; begin keyblock:=0; B_play.visible:=false;
lost:=false; won:=false; quit:=false; setlength(snakepoints,2); snakeheaddir:=3; snakepoints[0]:=point(200,100); snakepoints[1]:=point(137,100); snakepoints[2]:=point(137,130); gamepoints:=0; // bitblt(form1.image1.canvas.handle,0,0,21,21,pakim[18].canvas.handle,0,0,SRCCOPY); form1.image1.canvas.Draw(100,100,pakim[18]); while not((won)or(lost)or(quit))do begin if keyblock=0 then if getkeycommands(won,lost,quit)then keyblock:=snakewidth; if keyblock>0 then dec(keyblock,snakestep); image1.repaint; end; b_play.visible:=true; end;
procedure TForm1.FormDestroy(Sender: TObject); var i:integer; begin for i:=0 to 18 do if pakim[i]<>nil then freeandnil(pakim[i]); end;
procedure TForm1.FormCreate(Sender: TObject); begin loaddximagelist; end;
end. |
Zuletzt bearbeitet von Fred Ferkel am Di 18.02.03 19:54, insgesamt 1-mal bearbeitet
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Di 18.02.03 19:35
Hi,
ich könnte mir vorstellen das es daran liegt das du getkeycommands in einer While-Schleife aufrufst...
denn dadurch wird auch der Array snakepoints in ner WhileSchleife erhöht wenn man ne Taste drückt... eventuell geht ihm das zu schnell = StackOverflow...
Au'revoir,
Aya
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Di 18.02.03 20:02
hm naja also
1. liegen durch keyblock die tasteneingaben mind. alle 21 schleifendurchläufe auseinander und
2. hatte ich durch den highspeedcounter so eingestellt das es nicht so oft aufgerufen und
3. müsste
Quelltext 1: 2: 3: 4: 5: 6:
| var x:array of integer; begin for i:=1 to 10000 setlength(x,length(x)+1); end; |
auch klappen
das ist aber irgendwie alles sehr merkwürdig..aber daran scheiont es nicht zu liegen...? trotzdem danke 
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Di 18.02.03 20:26
:hi:
ich hab herausgefunden das es an dieser prozedur liegen muss:
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:
| procedure loaddximagelist; var x:Tpicture; ms:Tmemorystream; buffer:array[0..1023]of char; bmpname:string; filenumber, i, currentfilepos, bmpsize, numread:integer; f:file; begin currentfilepos:=0; assignfile(f,extractfilepath(application.exename)+'pak0.pak'); reset(f,1); seek(f,9); blockread(f,filenumber,4); for i:=0 to filenumber-1 do begin ms:=Tmemorystream.create; x:=Tpicture.create; seek(f,13+i*24); zeromemory(@buffer,sizeof(buffer)); blockread(f,bmpsize,4); blockread(f,buffer,20); bmpname:=buffer; seek(f,13+filenumber*24+currentfilepos); ms.SetSize(bmpsize); currentfilepos:=currentfilepos+bmpsize; numread:=0; repeat bmpsize:=bmpsize-numread; if bmpsize>=sizeof(buffer) then blockread(f,buffer,sizeof(buffer),numread) else blockread(f,buffer,bmpsize,numread); ms.writebuffer(buffer,numread); until numread=0; ms.Position := 0; x.Bitmap.LoadFromStream(ms); pakim[i]:=Tbitmap.create; pakim[i].Width:=x.Bitmap.Width; pakim[i].height:=x.Bitmap.Height; bitblt(pakim[i].canvas.handle,0,0,pakim[i].width,pakim[i].height,x.bitmap.canvas.handle,0,0,SRCCOPY); freeandnil(ms); freeandnil(x); end; closefile(f); end; |
das problem ist nur das ich die bitmaps so aus einer adtei laden möchte damit sie nicht verändert werden... deswegen hab ich zu der obigen prozedur das untere programm geschrieben, aber wieso kommt es jetzt zu einem stack overflow?? (welcher aber nicht in dieser prozedur oben auftritt..??) wird speicher eventuell belegt und nicht wieder freigegeben? ich hab damit nicht soviel ahnung...
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:
| program make_res_paks;
uses sysutils, classes, windows;
var f:Tstringlist; f1,f2:file; buffer:array[0..1023]of char; numread:integer; writepos:integer; totalsize:integer; i,tmp:integer;
param1,param2,param3:string;
procedure suchdateien(a:string;var b:Tstringlist;c:boolean); var sr:Tsearchrec; begin if FindFirst(a+'*.*', faAnyFile, sr)=0 then begin if sr.name[1]<>'.' then if sr.size<>0 then b.add(a+sr.name) else if c then suchdateien(a+sr.name+'\',b,c); while FindNext(sr) = 0 do if (sr.name[1]<>'.')and(sr.size<>0) then b.add(a+sr.name) else if c then suchdateien(a+sr.name+'\',b,c); end; FindClose(sr); end;
begin f:=Tstringlist.create; f.LoadFromFile(paramstr(1)); param1:=f.Strings[0]; param2:=f.Strings[1]; param3:=f.Strings[2]; f.Clear; suchdateien(param1,f,false); f.savetofile(param2); (*HEADER SCHREIBEN anmerkung , die position der datensätze ist eigentlich günstiger als die datei größe... 5 byte versionsnummer z.B: 1790a 4 byte pakx.pak dateigröße 4byte dateianzahl im package 4 byte dateigröße1 20 byte dateiname1 etc. sizeof(HEADER)=5+4+4+files*(4+20)=13+files*24 danach folgen die dateien selbst *) assignfile(f1,param3); rewrite(f1,1); (*- versionnummer*) tmp:=1; Blockwrite(f1,tmp,sizeof(tmp)); buffer[0]:='a'; Blockwrite(f1,buffer[0],sizeof(buffer[0])); (*- platz halten für pakx.pak filesize*) zeromemory(@buffer,sizeof(buffer)); Blockwrite(f1,buffer,4); (*- anzahl der files*) tmp:=f.count; Blockwrite(f1,tmp,sizeof(integer)); (*- dateigröße 0..i*) for i:=0 to f.count-1 do begin (*- platz halten für file1 filesize*) zeromemory(@buffer,sizeof(buffer)); Blockwrite(f1,buffer,4); (*- filename(max. 20 chars)*) if length(extractfilename(f.strings[i]))>20 then // this should not happen begin closefile(f1); exit; end; strpcopy(buffer,extractfilename(f.strings[i])); Blockwrite(f1,buffer,20); end; totalsize:=13+f.count*24; (*HEADER ENDE*) (*FILES SCHREIBEN*) for i:=0 to f.Count-1 do begin assignfile(f2,f.strings[i]); reset(f2,1); writepos:=filepos(f1); seek(f1,13+24*i); tmp:=filesize(f2); totalsize:=totalsize+tmp; Blockwrite(f1,tmp,sizeof(tmp)); seek(f1,writepos); repeat zeromemory(@buffer,sizeof(buffer)); BlockRead(f2, Buffer, SizeOf(Buffer), NumRead); Blockwrite(f1,buffer,NumRead); until (NumRead = 0); closefile(f2); end; seek(f1,5); blockwrite(f1,totalsize,sizeof(totalsize)); closefile(f1); freeandnil(f); end. |
cya
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Di 18.02.03 20:31
Ich hab das Problem bis jetzt auf eine Anweisung zurückgeführt:
Quelltext
Kein Scherz, genau an dieser Stelle steigt er mir mit einer Schutzverletzung aus. Die Version mit FlatStyle stieg zwar anders aus, aber ich wollte die net debuggen (keine FlatStyle, hab näümlich delphi7, da müsste ich wohl zuviel ändern!).
Forsche weiter...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Di 18.02.03 20:35
Gaaaanz komisch: Jetzt hab ich application.exename durch den richtigen Pfad ersetzt und jetzt krieg ich im Delphi ne Schutzverletzung, starte ich ohne Debugger stiegt er einfach ohne Meldung aus....
Mach morgen weiter
|
|
Fred Ferkel 
      
Beiträge: 87
|
Verfasst: Di 18.02.03 20:43
thx ür die hilfe...ja das ist ne ganz merkwürdige sache weil wenn man was rasunimmt kommt der fheler eingfach woanders..!? und jetzt bin ich mir auch nciht mehr so sicher ob es wie ich oben behauptet hab an der einen prozedur liegt...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 19.02.03 09:01
Ja, also es liegt an einem StackOverflow, der zeigt es nur nicht richtig dran. Während ich das schreibe, läuft Dein Programm im Hintergrund (hab den Stack vergrößert). Inzwischen verbraucht das Programm schon 46MB im Speicher!. SO, jetzt sinds 50 und jetzt kommt die erste Schutzverletzung. Jetzt müssen wir nur noch rauskriegen, worans liegt.....
Gruß
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 19.02.03 09:10
So, weiter gehts, inzwischen vermute ich, dass es an der procedure loaddximagelist liegt, denn sonst führt er mir nur beim Laden der Levels dieses blocks[i].x1:=ini.readinteger('level'+s1,'block'+s2+'x1',0); Ewigkeiten bis zur Schutzverletzung aus....
Aber da dieses gnze Zeuch mit BlockRead und so, laut .NET-Meldungen eh unsicherer Code ist, bin ich der Meinung es liegt an der... weil da oben kanns net dran liegen... 
|
|
|