Wieso gibt es immer ein Illegal memory address??

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Schnäggli92

Betreff: Wieso gibt es immer ein Illegal memory address??

BeitragDi, Dez 11, 2007 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich mache ein multiplayer shooter. Jetzt habe ich schon die steuerung der beiden players. Aber wen ich es spiele kommt nach einer weile immer Illegal memory address und blitz basic hängt sich auf. Ich habe vieles probiert aber es kommt immer wieder.


Code: [AUSKLAPPEN]
AppTitle "mexico_shooter"
Graphics 1280,1024,32,1
SetBuffer BackBuffer()

Global boden = LoadImage ("boden.jpg")
Global lv1 = LoadImage ("Lv1.bmp")
Global speed = 5
Global speed2 = 5
Global laser = LoadImage("shot.bmp")
Global shot_counter = 0
Global shot_counter2 = 0
Global x= 0
Global y = 0
Global gegnerx = 400
Global gegnery = 300
posx#=400
posy#=300
posx2#=400
posy2#=300
winkel=0
Dim ImPlayer(359)
TFormFilter 0
Dim ImPlayer2(359)
TFormFilter 0

;Laden des Spielers
AutoMidHandle True
ImPlayer(0)=LoadImage("b_pistole.bmp")
MaskImage ImPlayer(n),255,0,255
For n=1 To 359
ImPlayer(n)=CopyImage(ImPlayer(0))
MaskImage lv1,255,0,255
MaskImage ImPlayer(n),255,0,255
RotateImage ImPlayer(n),-n
Next

Type shot ;erstellt den Type "shot"
Field shot_x ;x Koordinate
Field shot_y ;y Koordinate
Field w
End Type


;Laden des Spielers
AutoMidHandle True
ImPlayer2(0)=LoadImage("b_pistole.bmp")
MaskImage ImPlayer2(t),255,0,255
For t=1 To 359
ImPlayer2(t)=CopyImage(ImPlayer2(0))
MaskImage ImPlayer2(t),255,0,255
RotateImage ImPlayer2(t),-t
Next

Type shot2 ;erstellt den Type "shot"
Field shot2_x ;x Koordinate
Field shot2_y ;y Koordinate
Field w
End Type
 
Local s.shot2


Color 0,0,0
ClsColor 255,255,255

;Hauptschleife/Mainloop
Repeat
Cls

If KeyDown(75) Then winkel=winkel+5
If KeyDown(77) Then winkel=winkel-5

If KeyDown(72)
posx#=posx#+Cos(winkel) * speed
posy#=posy#-Sin(winkel) * speed
EndIf

If winkel>359 Then winkel=0
If winkel<0 Then winkel=359

If KeyDown(30) Then winkel2=winkel2+5
If KeyDown(32) Then winkel2=winkel2-5

If KeyDown(17)
posx2#=posx2#+Cos(winkel2) * speed2
posy2#=posy2#-Sin(winkel2) * speed2
EndIf

If winkel2>359 Then winkel2=0
If winkel2<0 Then winkel2=359

DrawImage boden,0,0
DrawImage lv1,x,y
DrawImage ImPlayer(winkel),posx#,posy#
DrawImage ImPlayer2(winkel2),posx2#,posy2#

If ImagesCollide(ImPlayer(winkel), posx, posy,frame1, lv1, x, y,frame2 ) Then
speed = speed-2
Else speed = 5
EndIf

If ImagesCollide(ImPlayer2(winkel2), posx2, posy2,frame1, lv1, x, y,frame2 ) Then
speed2 = speed2-2
Else speed2 = 5
EndIf


If KeyDown(208) Then
shot_counter = shot_counter +1
End If

;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
If shot_counter = 5 Then

info.shot = New shot ;hier wird der schuss erstellt
info\shot_x = posx# ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
info\shot_y = posy# ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
info\w = winkel
shot_counter = 0 ; den Zähler auf 0 damit es wieder von vorne losgehen kann
End If

; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

For info.shot = Each shot ; so wird jeder einzelne Schuss angesprochen
info\shot_y = info\shot_y + Cos(info\w+90) * 8
info\shot_x = info\shot_x + Sin(info\w+90) * 8 ; die Schüsse werden um -8 nach oben bewegt
DrawImage laser,info\shot_x,info\shot_y ; jetzt noch jeden schuss malen
Next

For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1, lv1, 0, 0,frame2 ) Then Delete info.shot
Next


If KeyDown(57) Then
shot_counter2 = shot_counter2 +1
End If

;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
If shot_counter2 = 5 Then

s.shot2 = New shot2 ;hier wird der schuss erstellt
s\shot2_x = posx2# ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
s\shot2_y = posy2# ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
s\w = winkel2
shot_counter2 = 0 ; den Zähler auf 0 damit es wieder von vorne losgehen kann
End If

; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

For s.shot2 = Each shot2 ; so wird jeder einzelne Schuss angesprochen
s\shot2_y = s\shot2_y + Cos(s\w+90) * 8
s\shot2_x = s\shot2_x + Sin(s\w+90) * 8 ; die Schüsse werden um -8 nach oben bewegt
DrawImage laser,s\shot2_x,s\shot2_y ; jetzt noch jeden schuss malen
Next

For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1, lv1, 0, 0,frame2 ) Then Delete info.shot
Next

Delay 20
Flip
Until KeyHit(1)
End


Den Fehler zeigt er bei : Code: [AUSKLAPPEN]
If ImagesCollide(ImPlayer2(winkel2), posx2, posy2,frame1, lv1, x, y,frame2 )
Ich kann mir das nicht erklären.
Was bedeutet eigentlich Illegal memory address??? Stimt da irgend etwas mit dem Arbeitsspeicher nicht??


Danke im voraus für eure antworten.

Foppele

BeitragDi, Dez 11, 2007 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann an einem doppelten Variablennamen liegen, vielleicht erstellst du irgendwo eine Variable die es schon gibt. Sag ich mal ohne mir deinen Code angeschaut zu haben...

Schnäggli92

BeitragDi, Dez 11, 2007 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ok ich hab mir den code nochma angesehen aber ich kann nirgens 2 mal den gleichen variablennamen sehen. ich kan mir auch nicht denken dass er erstellt wird.

Eingeproggt

BeitragMi, Dez 12, 2007 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab beim schnellen durchschauen auch grad keinen Fehler gefunden, aber wollte dich auf die etwas "chaotische" Ladereihenfolge aufmerksam machen: Du benutzt 2mal "TFormFilter 0" praktisch hintereinander, ebenso benutzt du 2mal "AutoMidHandle True" im Laden und verwendest "n" ohne sie vorher deklariert zu haben. Ist zwar alles nciht falsch, aber etwas unschön.

Wollte ich mal loswerden.

Illegal Memory Adress heißt übrigens "Ungültige Speicheradresse". Und das heißt soviel wie: Du zwingst Blitz, auf einen Speicherplatz zuzugreifen, der nicht Blitz gehört, sozusagen.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Foppele

BeitragMi, Dez 12, 2007 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt,
ich habs verwechselt mit Memory Acess Violation, also @ schnäggli vergiss das mit der doppelten Variable, sorry.

Xeres

Moderator

BeitragMi, Dez 12, 2007 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If ImagesCollide(ImPlayer2(winkel2), posx2, posy2,frame1, lv1, x, y,frame2 )
Existiert das Bild für den entsprechenden Winkel? Existieren frame1 und frame2? Wenn der Debugger in der Zeile abbricht, schau dir die Werte der Variablen an.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

panky

BeitragMi, Dez 12, 2007 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

MaskImage ImPlayer(n),255,0,255
For n=1 To 359
ImPlayer(n)=CopyImage(ImPlayer(0))
MaskImage lv1,255,0,255
MaskImage ImPlayer(n),255,0,255
RotateImage ImPlayer(n),-n
Next


In der ersten Zeile wird ImPlayer(n) gemasked, obwohl "n" noch nicht definiert ist.

Und: Warum hast du "winkel2" nicht als Global definiert?

Eine Hilfe wäre es noch zu wissen, wann genau der Fehler auftritt... Ist der Winkel ein bestimmter, stürzt es generell nach 10 Sekunden ab oder ist kein verantwortliches Handeln erkennbar?!

MfG
pY

d-bug

BeitragMi, Dez 12, 2007 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


d-bug

Schnäggli92

BeitragDo, Dez 13, 2007 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ehm ne. Nicht nach 10 sekunden. Manchmal nach 5 sekunden manchmal erst nach 5min ich weiss nich wieso und auch nicht bei einer bestimmten bewegung oder so.
 

Dreamora

BeitragDo, Dez 13, 2007 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
2 Möglichkeiten:

1. NVIDIA mit problematischen treibern
2. du lädst einfach zu viele daten für den VRAM der Karte wo du es testests. sollte dein player bild zb 128x128 oder so sein wäre das recht gut möglich auf "billigen" und "office systemen"
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Schnäggli92

BeitragMi, Jan 09, 2008 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also zuerst danke mal für die Antworten. Also mein NVIDIA treiber sollt eigentlich der richtige sein. Und mein pc ist auch nich der billigste also ich hab ne : GeForce 7600GT mit 256MB das sollte doch reichen? CPU: Core2Duo E6300 und 1GB RAM an dem kans nicht liegen. Och ich komm nich weiter. Embarassed Embarassed
 

Dreamora

BeitragDo, Jan 10, 2008 1:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hat nix mit "gut" und "nicht gut" zu tun sondern damit das gewisse NVIDIA treiber (hauptsächlich betatreiber und so, also alles was nicht whql zertifiziert ist) ganz einfach keinen oder fehlerhaften DX7 support haben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ozzi789

BeitragDo, Jan 10, 2008 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Vieleicht hilft es wen du uns sagst was für ein Betriebssystem hast...

Ich hat das auch mal.. Must nur nen neun Treiber raufschmeissn (bei mia gings nacher)
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group