Blitz spukt - Funktionen wiederholen sich endlos

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

x-pressive

Betreff: Blitz spukt - Funktionen wiederholen sich endlos

BeitragDo, Feb 03, 2005 1:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist nun schon das vierte Projekt, in dem ich dieses Verhalten beobachte: es scheint, als gäbe es einige Ungereimtheiten mit Types, wenn man intensiven Gebrauch davon macht (Erstellen und löschen von vielen Types on-the-fly, Object / Handle / FOR...EACH usw.) Ab einem gewissen Grad tritt dann gerne folgender 'Bug' auf: Blitz fängt an, eine beliebige Funktion aus heiterem Himmel immer wieder in einer Endlosschleife aufzurufen, bis ein Stack Overflow auftritt.

Und das tollste: wenn man das ganze im Debug-Mode reproduzieren will, funktioniert es wieder -die betreffende Funktion wird nur einmal aufgerufen.

Es ist immer genau das selbe. Aus heiterem Himmel fängt Blitz irgendwann an, sich in einer Funktion aufzuhängen -oder sie auch doppelt aufzurufen, wobei es sich beim zweiten Aufruf um einen 'ghost call' handelt. Seltsamerweise aber immer, wenn Types / Object / Handle im Spiel sind.

Hat jemand dieses Verhalten auch schon mal beobachtet? Woran kann das liegen? Es scheint, als käme Blitz mit der Abarbeitung der Funktionen durcheinander.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

soli

BeitragDo, Feb 03, 2005 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein möglichst kurzer Code
der dein Problem reproduziert
wäre gut.
solitaire

x-pressive

BeitragDo, Feb 03, 2005 8:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ja das Problem - ich nehme an, daß es, wenn Blitz einmal anfängt zu spinnen, gar nicht an einer bestimmten Zeile liegt. Oder kannst du dir folgendes erklären:

Code: [AUSKLAPPEN]

Function MoveShip (ShipID% ,xStep#, yStep#, relative% = False)

   Local Ship.TShip   = Object.TShip (ShipID)
   Local Stage.TStage = Object.TStage( Ship\StageID )
   Local i%, x#, y#
   
   If relative = True Then
      EntityParent   DummyPiv, Stage\Mesh,  0
      PositionEntity   DummyPiv, Ship\x, Ship\y, 0
      RotateEntity   DummyPiv, 0,0,Ship\rotation
      x = EntityX    (DummyPiv,0)
      y = EntityY    (DummyPiv,0)
      MoveEntity   DummyPiv, xStep, yStep, 0
      xStep = EntityX(DummyPiv,0) - x
      yStep = EntityY(DummyPiv,0) - y
   End If

   Ship\x = Ship\x + xStep
   Ship\y = Ship\y + yStep

   Stage\update = 1
   Ship\update = 1

End Function


Blitz meldet mir bei dieser Funktion einen Stack Overflow. Die Funktion ruft sich immer wieder selbst auf. Noch seltsamer - wenn ich das billige IF...THEN in der Mitte entferne, tritt der Stack Overflow NICHT auf, die Funktion wird nur einmal abgerufen. Seltsam, nicht?

Wie gesagt -das Problem tritt nur auf, wenn man intensiv Types in längeren Codes nutzt. Das es obige Funktion getroffen hat, ist halt nur Zufall. Ich denke nicht, daß es wirklich an der Funktion selbst liegt.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BladeRunner

Moderator

BeitragDo, Feb 03, 2005 8:33
Antworten mit Zitat
Benutzer-Profile anzeigen
mag jetzt naiv klingen, aber hast Du deib BB schon mal neu installiert? Vielleicht hat sich einfach ein Fehler "eingenistet".

Ich denke der Fehler wie Du ihn beschreibst ist vollkommen neu, daher wäre es sicher nicht verkehrt solche Fehlerquellen auszuschliessen.
Alternativ: gib uns eine Exe die den Fehler produziert damit wir sie testen können. Damit es objektiv und zuverlässig läuft solltest du aber den BB-Code mitliefern zum selbstcompilieren.


Mehr fällt mir dazu nicht ein, ich persönlich hatte noch keine solchen Fehler.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

x-pressive

BeitragDo, Feb 03, 2005 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist leider nicht so einfach möglich, da das Projekt inzwischen recht komplex ist und viele Includes / Media-Resourcen benötigt.

Ich habe noch ein wenig herumexperimentiert und bin mir nicht mehr 100% sicher, ob es an der Benutzung von Types liegt. Ich denke, daß es (eventuell!) auch auftreten kann, wenn man Entities oft von einem Parent zu einem anderen hin- und herwechselt.

Ich habe schon Fälle erlebt, in denen es nach vielen Parent-wechseln nicht mehr möglich war, mittels EntityParent Obj,0 ein Mesh zu "ent-parenten". Und auch das CreateMesh(Parent) nicht immer funktioniert, ist ja bekannt. Vielleicht liegt ja hier der Wurm... *grübel*
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Jan_

Ehemaliger Admin

BeitragDo, Feb 03, 2005 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm,
Ich sage,
Es liegt an der Übergabe
hier:
Code: [AUSKLAPPEN]

Object.TShip (ShipID)
Object.TStage( Ship\StageID )

Ich hatte schon, bei Rezesiven schleifen, das Problem, das ein WErt übergeben werden sollte
in der Funktion war er noch 0, nach return war er invinit
+Stack overflow fehler.
Ich hatte damals, den wert vor der Rückgabe, erst zwischengespeichert, um diesen Bug zu umgehen.

Weitere Bugs:
Ich hatte bei DX-AS den Bug, das eine .BSP Datei 2x vorhanden war, 1x an die Kamera gehängt (was nciht sein durfte) und 1x richtig.
Naja, damals hatte ich eine Kamera erstellt, gelöscht, wieder erstellt und es funktionierte.
between angels and insects

x-pressive

BeitragDo, Feb 03, 2005 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe den IF-Block aus obigen Code rausgenommen:

Code: [AUSKLAPPEN]

      EntityParent   DummyPiv, Stage\Mesh,  0
      PositionEntity   DummyPiv, Ship\x, Ship\y, 0
      RotateEntity   DummyPiv, 0,0,Ship\rotation
      x = EntityX    (DummyPiv,0)
      y = EntityY    (DummyPiv,0)
      MoveEntity   DummyPiv, xStep, yStep, 0
      xStep = EntityX(DummyPiv,0) - x
      yStep = EntityY(DummyPiv,0) - y


-Alles funktioniert wieder 100% normal. Es lag also wohl definitiv daran. Irgendetwas darin mag der Compiler -wenn man es oft wiederholt- ganz und gar nicht. Das beunruhigt mich schon sehr -denn WENN ein Compiler erst mal eine Macke hat, weiß man nie, wann und wo das Problem wieder zuschlägt.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Thoem

BeitragDo, Feb 03, 2005 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Bekannter von mir hatte mal das Problem, das sich bei einem von mir Programmierten Leveleditor die Maus selbstängig gemacht hatte. Der Mauszeiger (DrawImage blabla, MouseX(), MouseY()) fuhr selbstständig auf dem Bildschirm herum und löste sogar Klickereinisse aus. Wobei ich aber sicher bin, ob das Problem nicht am Programm lag. Besagter Editor ist schon seit geraumer Weile auf verschiedenen Systemen im Einsatz und dieses Problem trat nur dieses eine Mal auf.
Wer weiss was da los war...
Thoem...
 

Dreamora

BeitragDo, Feb 03, 2005 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja es wird schon seine gründe haben, warum handle und object nie wirklich eingebunden wurden und geheime befehle waren. Ich vermute, wenn sie immer fehlerfrei funktioniert hätten, hätte mark sie sicher auch offiziell eingebaut.

vielleicht "verläuft" sich die Funktion die aus dem handle den type wieder zurückholen soll irgendwo ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

x-pressive

BeitragFr, Feb 04, 2005 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin mir gar nicht mehr so sicher, ob das wirklich mit den Types zu tun hat -inzwischen denke ich eher, daß es am Parenting lag (also, wenn man ein Entity sehr häufig von einem Parent zu einem anderen wechselt).

Seitdem ich diese Stelle rausgenommen habe, klappt wieder alles einwandfrei (der Type-code macht jedenfalls im Moment keine Probleme mehr) - und wenn ich so drüber nachdenke, könnte das mit dem Parenting auch das Problem in den anderen Projekten gewesen sein. Ich habe definitv schon erlebt, das Blitz einen Memory Access meldet, wenn ich ein Entity mit EntityParent Mesh,0 ent-parenten möchte, obwohl das Objekt natürlich existierte.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

Jake

BeitragFr, Feb 04, 2005 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese unerklärlichen , "albernen" Blitzfehler hab ich auch schon beobachtet.
Ganz oft treten (bei mir) Fehler auf, wenn ich Funktionen als Parameter angebe (also den Return-Wert einer Funktion direkt übergeben will). Deshalb speicher ich vieles in lokalen Variablen zwischen.

IF..THEN..<komplexere Anweisung mit direkten Funktionsübergaben (s.o.)> ist auch so ein Fall, wo Blitz sich dauernd verschluckt. Mach ich alles in einzelnen Zeilen mit IF..ENDIF, dann klappt alles.

Jake
 

sven123

BeitragFr, Feb 04, 2005 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja solche Fehler kenne ich auch zu genüge.Aber nach ein bischen herumknuddeln funktioniert dann alles wieder.
Amd Athlon 2200+,Saphire Atlantis Radeon9800pro,1024 MB DDR RAm,40 Gb Festblatte.
'in shâ'a llâh=so Gott will
Fertiges Projekt:Invasion der Heuschrecken

x-pressive

BeitragFr, Feb 04, 2005 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Apropos IF...THEN: 'komplexere' AND ... OR ... -Verknüpfungen scheinen bei Blitz gar nicht möglich zu sein bzw. werden auch falsch interpretiert. Bin ich schon öfters drüber gestolpert...
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Thoem

BeitragFr, Feb 04, 2005 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich nicht bestätigen:

Code: [AUSKLAPPEN]

a=1
b=2
c=3

If (a=1 And b=2) Or c=3 Then Print "klappt doch"

WaitKey()

End


das funktioniert...
Thoem...
 

Wanderer

BeitragSa, Feb 05, 2005 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ja noch nicht komplex Smile Ich weiß jetzt nicht mehr, in welchen Situationen das genau war, aber das ist mir schon drei- viermal aufgefallen. Erst nachdem ich es in zwei seperate Schleifen aufgeteilt hatte, wollte er dann endlich. Ich werd's mir mal notieren, wenn ich das nächste mal drauf stoße.
Mai Siehgnätschah gohs hiah.

maximilian

BeitragSa, Feb 05, 2005 0:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Also mir ist noch nichts dergleichen passiert! o_O

Finde ich btw. ein starkes Stück das Handle/Object geheim sind. Wer will denn ohne diese beiden Befehle effizient programmieren können?

LordChaos

@x-pressive: Was geht momentan übrigens auf deiner Homepage ab? o_O Sieht ziemlich komisch aus.
Variety is the spice of life. One day ignore people, next day annoy them.

x-pressive

BeitragSa, Feb 05, 2005 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, ohne Object und Handle geht wirklich nichts mehr -unverzichtbar Smile

@LordChaos: Wieso, was meinst du genau? Ist doch alles wie immer... Question
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

Kekskiller

BeitragSa, Feb 05, 2005 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
@x-pressive: Er meint sicher das Intro am Anfang... Das war vor einer ganzen Weile noch nicht da, glaube ich.

Holzchopf

Meisterpacker

BeitragSa, Feb 05, 2005 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Wanderer: Mit den Ungereimtheiten bei If-Konstruktionen meinst du bestimmt Sachen wie diese hier:
Code: [AUSKLAPPEN]

a = 1
b = 2
c = 35

If a Then Print "A"
If b Then Print "B"
If c Then Print "C"

Print

If a And b Then Print "A und B"
If a = 1 And b Then Print "A=1 und B"
If a And b = 2 Then Print "A und B=2"
If a = 1 And b = 2 Then Print "A=1 und B=2"

Print
If a And c Then Print "A und C"
If a = 1 And c Then Print "A=1 und C"
If a And c = 35 Then Print "A und C=35"
If a = 1 And c = 35 Then Print "A=1 und C=35"

Print
If b And c Then Print "B und C"
If b = 2 And c Then Print "B=2 und C"
If b And c = 35 Then Print "B und C=35"
If b = 2 And c = 35 Then Print "B=2 und C=35"

Print
If a And b And c Then Print "A, B und C"
If a And b And c=35 Then Print "A, B und C=35"
If a And b=2 And c Then Print "A, B=2 und C"
If a And b=2 And c=35 Then Print "A, B=2 und C=35"
If a=1 And b And c Then Print "A=1, B und C"
If a=1 And b And c=35 Then Print "A=1, B und C=35"
If a=1 And b=2 And c Then Print "A=1, B=2 und C"
If a=1 And b=2 And c=35 Then Print "A=1, B=2 und C=35"

WaitKey()
Cls
Locate 0,0

Print Right(Bin(a),8) + " A"
Print Right(Bin(b),8) + " B"
Print Right(Bin(c),8) + " C"
Print

Print Right(Bin(a And b),8) + " A und B"
Print Right(Bin(a And c),8) + " A und C"
Print Right(Bin(b And c),8) + " B und C"
Print

Print Right(Bin(a=1),8) + " A=1"
Print Right(Bin(b=2),8) + " B=2"
Print

Print Right(Bin(a And b And c),8) + " A und B und C"
Print Right(Bin(a And b=2 And c),8) + " A und B=2 und C"

WaitKey()

End


Aber guck dir zuerst nur den Code an, den oberen Teil (bis zum ersten Waitkey() ) und überlege dir, wo denn BB überall die IF-Anweisung als Wahr betrachten sollte, dann führ den Code aus. Du wirst staunen Wink aber im zweiten Teil wird dann gleich aufgelöst, wieso das so ist.
Glaub mir, wenn man das vor Augen hält, kann man 500 Zeichen lange If-Konstruktionen mit etlichen Vergleichsoperatoren basteln, ohne, dass Blitz die Übersicht verliert.

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Wanderer

BeitragSo, Feb 06, 2005 7:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Und was ist hiermit?
Zitat:

a = 1
b = 1

If a = 1 And b = 1 Or a = 1 And b = 2 Then Print "OK!"

WaitKey()


Man könnte doch meinen, ein OK zu sehen, oder hakt meine Logik? Wink

EDIT: Oi, erst mit Klammern geht's...

Zitat:

a = 1
b = 1

If (a = 1 And b = 1) Or (a = 1 And b = 2) Then Print "OK!"

WaitKey()
Mai Siehgnätschah gohs hiah.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group