fehler in ai schleife: "illegal memory acces"
Übersicht

WesleyBetreff: fehler in ai schleife: "illegal memory acces" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hidiho
ich kriege in meiner (selbstgeschriebenen) ai schleife immer den fehler "illegal memory acces". das habe ich sonst nur erlebt wenn man versucht einen gelöschten type eintrag anzusprechen, dieser fehler kommt aber ganz woanders, nähmlich beim "next" von der "for enemy.enemy=each enemy" schleife, ich verstehe das nicht wirklich da vorher geprüft wird ob enemy.enemy<>null ist. wofür kann dieser fehler noch stehen? am anfang gibt es keine enemy.enemy einträge(ai schiffe) nur einen, der vm spieler gesteuert wird, und am anfang der schleife(vor der prüfung ob enemy.enemy vorhanden ist) wird geprüft ob das ai schiff momentan vom spieler gesteuert wird. ist das der fall dann wird "enemy.enemy=after enemy) ausgeführt, könnte das einen soclehn fehler hervorrufen? |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Na wenn du nur den Spieler hast und dann, falls vorhanden die hintere Adresse ansprichst, wird das eh nie was, da bei einem Typ nichts dahinter sein kann...
Immer schön den Code präsentieren, das hilft immer. Und eventuell dein Problem etwas mehr und bitte mit Satzzeichen vormulieren, ist ja grauselig... |
||
Wesley |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
japp, tut mir leid, ist eine meiner schlechten angewohnheiten...^^
zu den types: wie kann ich prüfen ob überhaupt noch ein anderer type da ist wenn das momentane schiff das spierlschiff ist? das kommt nämlich nicht nur am start vor, auch im verlauf des spieles soll es öffters vorkommen dass der spieler mal allein unterwegs ist(gegner schiffe werden bei nähe erstellt) EDIT hier mal der code, auch wenn evtl nicht alles was nützen wird. dies ist der erste abschnitt aus der kimain() funktion die alle KI aktionen regelt(flottenbewegung, schuss bewegung und letztenendes auch die bewegung einzllner AI schiffe) Code: [AUSKLAPPEN] For enemy.enemy=Each enemy
If Handle(enemy)=spieler\ship Then enemy.enemy=After enemy If enemy.enemy<>Null Then;---anfang der ai schleife--- Select enemy\work Case SEARCH ;--------suchmodus------ ;zielsuche If enemy\target=Handle(enemy) Then enemy\target=gettarget(Handle(enemy),enemy\team);zielwahl(zufall) If info(5,enemy\target)<>enemy\team And enemy\target<>Handle(enemy) Then enemy\work=1;fight mode online Else winkel=winkel(Handle(enemy),enemy\fleet,1) If enemy\x=info(30,enemy\fleet) And enemy\y=info(31,enemy\fleet) Then enemy\spx=0:enemy\spy=0 ;drehen zum gegner(solange man noch lebt) If winkel<>enemy\grad And enemy\hp>0 Then If winkel<enemy\grad Or (enemy\grad<20 And winkel>200)Then For move=info(11,enemy\ship) To 0 Step -1 If enemy\grad=winkel Then Exit enemy\grad=enemy\grad-1 If enemy\grad=-1 Then enemy\grad=359 Next EndIf If winkel>enemy\grad Or (enemy\grad>339 And winkel<160)Then For move=info(11,enemy\ship) To 0 Step -1 If enemy\grad=winkel Then Exit enemy\grad=enemy\grad+1 If enemy\grad=360 Then enemy\grad=0 Next EndIf EndIf EndIf Case FIGHT ;--------kampfmodus--------- If info(4,enemy\target)<=0 Then ;pruefen ob gegner tot ist enemy\work=0 enemy\target=Handle(enemy) Else ;wenn gegner lebt, angreifen winkel=winkel(Handle(enemy),enemy\target,0) If winkel<>enemy\grad And enemy\hp>0 Then ;drehen zum gegner(solange man noch lebt) If winkel<enemy\grad Then For move=info(11,enemy\ship) To 0 Step -1 If enemy\grad=winkel Then Exit enemy\grad=enemy\grad-1 If enemy\grad=-1 Then enemy\grad=359 Next EndIf If winkel>enemy\grad Then For move=info(11,enemy\ship) To 0 Step -1 If enemy\grad=winkel Then Exit enemy\grad=enemy\grad+1 If enemy\grad=360 Then enemy\grad=0 Next EndIf Else If enemy\hp>0 Then sh_art=Rnd(1,3) If dist(Handle(enemy),enemy\target,0)<=info(24,enemy\slot[sh_art]) Then schiess(Handle(enemy),sh_art,enemy\energie#) EndIf EndIf EndIf Case ESCAPE ;--------fluchtmodus-------- Default End Select ;--------bewegen-------- maxspeed#=info(10,enemy\ship) speed#=info(12,enemy\ship) If enemy\spx#<Cos(enemy\grad)*maxspeed# Then enemy\spx#=enemy\spx#+Abs(Cos(enemy\grad)*speed#) If enemy\spx#>Cos(enemy\grad)*maxspeed# Then enemy\spx#=enemy\spx#-Abs(Cos(enemy\grad)*speed#) If enemy\spy#<Sin(enemy\grad)*maxspeed# Then enemy\spy#=enemy\spy#+Abs(Sin(enemy\grad)*speed#) If enemy\spy#>Sin(enemy\grad)*maxspeed# Then enemy\spy#=enemy\spy#-Abs(Sin(enemy\grad)*speed#) enemy\x#=enemy\x#+enemy\spx# enemy\y#=enemy\y#+enemy\spy# ;regenerieren If enemy\energie<0 Then enemy\energie=0 enemy\energie#=enemy\energie#+0.1 If enemy\energie>info(13,enemy\ship) Then enemy\energie#=info(13,enemy\ship) For i=1 To 3 enemy\time[i]=enemy\time[i]-1 If enemy\time[i]<=0 Then enemy\time[i]=0 Next EndIf;---ende der ai schleife--- Next wenn sonst noch infos fehlen, einfach fragen, ich schreib sie hinerher, habe leider keine ahnung wo der fehler genau liegt, da er ja die letzte next zeile markiert |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also wie ich das jetzt verstanden habe, willst du die Spieler auch in Types setzen...
Finde ich nicht gut gelöst, eine zweite Typereihe sollte herhalten, das ist einfacher zu verwalten und schließt solche Fehler aus. Aber wenn dich das nicht zufriedenstellt, solltest du einen Zähler laufen lasse, welcher die Anzahl der Gegner festhält, oder besser gleich ein Handle der Spielerposition. Jedenfalls sehr seltsam das System... versteh ich nicht. |
||
Wesley |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hab ich schon erwähnt dass das mein erstes game in bb ist?
nagut, dann tuh ich das mal ![]() der spieler selbst ist nicht im enemy.enemy type, er hat ein spieler type für sich, kann das aber auch leicht ändern und ihn in ein dim feld setzen. ich muss sagen dass ich nichtmehr weiss was ich geändert habe dass es nun so ist, habe etwas rumgewerkelt aber es bringt nix, gleicher fehler am start. wofür kann "illegal memory acces" noch stehen? evtl hilft es weiter wenn man einfach weiss durch was so ein fehler hervorgerufen wird und dann einfach durch das gute alte ausschlussverfahren alles abchekt. |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du den Debugger anmachst (Menüpunkt Program) erhälst Du eine genaue Fehlermeldung, das ist schon mal viel wert. Ein Memory access violation ist ein falscher Speicherzugriff. Darunter fallen nicht vorhandene Type-Instanzen, fehlende Grafiken oder falsche Adressen. Lass es wie gesagt nochmal mit Debugger laufen, dann klärt Dich Blitz darüber auf was schief läuft ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Wesley |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke für den tipp, hab in der zeit ein bisschen die suchfunktion missbraucht, aber nichts brauchbares gefunden...
der debugger ist bei mir standartmässig an. ich versuchs jetzt mal auf ne ganz einfache art zu lösen, wenns klappt weiss ich, dass ich den code einfach falsch aufgebaut hab. Code: [AUSKLAPPEN] If enemy.enemy<>Null Then;---anfang der ai schleife---
wird zu Code: [AUSKLAPPEN] If enemy.enemy=Null Then Exit
es funktioniert so und die gegner scheinen sich auch noch zu bewegen. also: illegal memory acces kann vorallem dadurch hervorgerfuen wird wenn man informationen aufrufen will die bereits aus dem speicher entfernt wurden, oder? |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau. Alles was gelöscht oder nicht geladen / erstellt wurde, also nicht (mehr) im Speicher vorhanden ist, bringt diese Fehlermeldung. Allerdings drückt sich der Debugger in der Regel etwas genauer aus, bleistiftsweise "Object does not exist" oder ähnliches ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Wesley |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
schon, aber ich kriege so einen fehler recht oft, und er ist nicht näher erklährt.
zb hatte ich den fehler ebengrade beim laden der schiffsbilder, ohne jedoch etwas zu ändern ging es beim 2. versuch wieder ![]() wie gesagt, der debugger ist bei mir immer an, habe keinen grund ihn auszustellen |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm, ja ist schon etwas komisch. Nur ein Gedanke, könnte vielleicht auch am System liegen. Glaub ich aber eigentlich auch wieder nicht ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Wesley |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ist aber die einzige möglichkeit, immerhin kahm und ging der fehler ja wieder.
ich habe kurz zuvor ein programm geschlossen, evtl lag es daran dass windows irgendwie durcheinander kahm beim laden des einen progs und beenden des anderen... |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Stimmt, auch möglich, schließlich wird durch so einen Speicherpfusch auch solch ein Fehler verursacht, hm... | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group