fehler in ai schleife: "illegal memory acces"

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Wesley

Betreff: fehler in ai schleife: "illegal memory acces"

BeitragFr, Jan 14, 2005 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
hab ich schon erwähnt dass das mein erstes game in bb ist?
nagut, dann tuh ich das mal Embarassed

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

BeitragSa, Jan 15, 2005 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Wesley

BeitragSa, Jan 15, 2005 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 15, 2005 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Wesley

BeitragSa, Jan 15, 2005 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused
wie gesagt, der debugger ist bei mir immer an, habe keinen grund ihn auszustellen

Hubsi

BeitragSa, Jan 15, 2005 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, ja ist schon etwas komisch. Nur ein Gedanke, könnte vielleicht auch am System liegen. Glaub ich aber eigentlich auch wieder nicht Smile
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Wesley

BeitragSa, Jan 15, 2005 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 15, 2005 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, auch möglich, schließlich wird durch so einen Speicherpfusch auch solch ein Fehler verursacht, hm...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group