Typeinträge fehlen in Functions [gelöst]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

NightPhoenix

Betreff: Typeinträge fehlen in Functions [gelöst]

BeitragDi, Dez 22, 2009 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Also entweder ich seh den Wald vor lauter Bäumen nicht, oder irgendwas stimmt da im Speicher nicht.

Also ich habe eine Typliste mit dem Namen "NPC" bzw "pp.NPC"
Dieser Liste sind neben den Spielern auch alle Planeten & Basen zugeordnet, also dind nach dem Laden des Spiels auch schon 20 Einträge drin.

Geht man jetzt alle diese Einträge über eine Function durch so findet er noch alle.
Aber nachdem ich einen neuen Spieler erstellt habe (weil sich einer einloggt) muss ein neuer Eintrag erstellt werden. Doch sobald ich diesen gerade erstellten Eintrag über die vorher noch erfolgreiche Funktion suche, so findet er ihn nicht!
Verfolgt man das Durchblättern der Typeliste in Debugger so sieht man, dass der neue Eintrag garnicht existiert, denn sobald er auf ihn blättert zeigt er "Null" an.
Wenn ich den Inhalt der Function "PPid2GAME(ID)" zum suchen des Types in die Hauptschleife kopiere, anstatt ihn über den Funktionsnamen aufzurufen, dann funktioniert es.

Der Type ist Global, also sollte er doch in der Function vollkommen verfügbar sein?


Hier der Code:
Code: [AUSKLAPPEN]
               pp.NPC = New NPC
               
               pp\Pilotname$=tcpinh2$
               pp\Taufe$=NextTCPKomma$()
               pp\PosX#=NextTCPKomma$()
               pp\PosY#=NextTCPKomma$()
               pp\PosZ#=NextTCPKomma$()
               pp\active=NextTCPKomma$()
               pp\TypID=NextTCPKomma$()
               pp\Mark=NextTCPKomma$()
               pp\ColR=NextTCPKomma$()
               pp\ColG=NextTCPKomma$()
               pp\ColB=NextTCPKomma$()
               pp\Rep=NextTCPKomma$()
               pp\HP#=NextTCPKomma$()
               pp\SP#=NextTCPKomma$()
               pp\ID=2
               pp\Gamer=1
               
               CreatePlayer(BerMoveX#+EntityX(SIPI),BerMoveY#+EntityY(SIPI),BerMoveZ#+EntityZ(SIPI))
               
               PPid2GAME(pp\ID)




Function PPid2GAME (ID)

   If ID<>0 Then

      pp.NPC = First NPC
      While pp\ID<>ID
         pp = After pp
      Wend
      
   EndIf
      
End Function




Ich habe neben dem Client wo dieser Code drin steht auch den Server über blitzcc.exe laufen, sozusagen beide Programme mit debugger über Blitz.
Kann es vielleicht daran liegen? Verheddern sich die Programme im Speicher?
  • Zuletzt bearbeitet von NightPhoenix am Di, Jan 05, 2010 16:55, insgesamt einmal bearbeitet

Jamagin

BeitragDi, Dez 22, 2009 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
liegt es vielleicht daran weil du in der Funktion die pp\ID und pp\Gamer zuweist? Sollte da nicht auch eine Variable übergeben werden?

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

NightPhoenix

BeitragDi, Dez 22, 2009 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Funktion wird nichts der beiden verändert. (Der Code der Function steht übrigens untem im Code dabie Wink)
Die variable pp\ID wird übergeben, aber selbst wenn nicht könnte ich sie erst dann dort lokal speichern um es zu vergleichen, da die Types global sind, folglich sind sie auch überall verfügbar, nur irgendwie nicht in der Function. Alle neuen Einträge fehlen dort, in der Hauptschleife hingegen existieren sie. Die alten Einträge gibt es überall.

Jamagin

BeitragDi, Dez 22, 2009 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist mir eh klar aber pp\ID hat immer den Wert 2. Der kommt da ja gar nicht drüber. pp\ID kann niemals 3 oder höher werden auch nicht mit deinem Code unterhalb!

Sollte ich mich irren, dann tut es mir leid. Aber wenn ich in einer Funktion einen Wert FIX zuweise, dann ist der Wert immer der FIX ZUGEWIESENE!!

Kannst ein wenig mehr Code reinstellen?

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragDi, Dez 22, 2009 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du das Problem in einem kurzen Testcode isolieren? Wenn du nicht noch zwischen drin was anderes mit pp.NPC anstellst, ist es sehr sonderbar.
Hilft es was, wenn du die Funktion direkt die Instanz zurückgeben lässt?
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)

Noobody

BeitragDi, Dez 22, 2009 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Im geposteten Code sehe ich nun keinen Fehler. In einem Testprogramm funktioniert das auch problemlos Code: [AUSKLAPPEN]
Type TTest
   Field ID
   
   Field Value#
End Type

Global Test.TTest
   
For I = 0 To 10
   Test = New TTest
   Test\ID     = I
      Test\Value# = Rnd( 0, 10 )
Next

Test = New TTest
   Test\ID     = 20
   Test\Value# = Pi

FindTestByID( Test\ID )

Print Test\Value#
WaitKey
End

Function FindTestByID( ID )
   Test = First TTest
   
   While Test\ID <> ID
      Test = After Test
   Wend
End Function

Schwer zu sagen, was hier schiefläuft. Nur am geposteten Code liegt es aber vermutlich nicht.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

NightPhoenix

BeitragMi, Dez 23, 2009 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich suche fieberhaft nach dem Problem, weil es ja irgendwas sein muss was ich in den letzten 1,2 Tagen integriert habe. Vorher funktionierten all diese Funktionen und es wurde auch jeder Typeeintrag gefunden. Confused Ich geb euch bescheid, wenn es was neues gibt.

Jamagin

BeitragMi, Dez 23, 2009 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Viel. hilft es wenn du alles was du seit dem letzten einwandfreien Start deines Programmes integriert hast, mal abschaltest und dann nochmals Schritt für Schritt dazuschaltest?

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

mpmxyz

BeitragMi, Dez 23, 2009 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hört sich ziemlich seltsam an...
Ich würde an deiner Stelle mal eine Liste aller Type-Einträge erstellen lassen. (Debuglog, Textdatei etc.)
Denn wenn der gesuchte Eintrag wirklich existiert, dann würde er auch gefunden werden. (dein gezeigter Code ist ja korrekt)
Schreibe dir am Besten eine Debug-Funktion, die das macht, und platziere sie an geeignete Stellen...
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

NightPhoenix

BeitragMi, Dez 23, 2009 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute ich hab mir Blitz zerschossen, da es auf meinem Laptop funktioniert.
Die UDP Daten kommen zwar (obwohl es LAN ist) mit ca. 3-4 Sekunden Verspätung an, aber es funktioniert auf einem Computer.

Bevor ich es mit einer Neuinstallation versuche schreib ich mal einen Debuglog für die Typliste innerhalb der Function und außerhalb.
Ich melde mich gleich mit den Daten.


*edit*
Ich verzweifel gleich... der Debug aus Funktion und Mainloop ergab selbes Ergebnis: alle Daten vorhanden?!

ich installiere Blitz mal neu

NightPhoenix

BeitragMi, Dez 23, 2009 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich konnte noch etwas komisches beobachten:

Code: [AUSKLAPPEN]
      ;empfangen UDP
      
      UDP_input=RecvUDPMsg(UDP_write)
         
      If UDP_input <> 0 Then
         While ReadAvail(UDP_write) > 0
            inhalt$=ReadString(UDP_write)
            
            vor=pp\O
            
            
            
            If Instr(inhalt$,"!/spd1~") > 0 Then
               inh2$=Mid$(inhalt$,8,Instr(inhalt$,";")-1)
               Stop
               inhalt$=Mid$(inhalt$,Instr(inhalt$,";")+1,-1)
                  If PPidExist(Int(inh2$))=1 Then
                  
                     PPid2GAME(Int(inh2$))
               
                     pp\PosX#=NextUDPKomma$()
                     pp\PosY#=NextUDPKomma$()
                     pp\PosZ#=NextUDPKomma$()
                     pp\RotX#=NextUDPKomma$()
                     pp\RotY#=NextUDPKomma$()
                     pp\RotZ#=NextUDPKomma$()
                     
                     pp\SystemID=pl\SystemID
                  
                  EndIf
               
            EndIf
            
            If Instr(inhalt$,"!/spd2~") > 0 Then
               inh2$=Mid$(inhalt$,8,Instr(inhalt$,";")-1)
               inhalt$=Mid$(inhalt$,Instr(inhalt$,";")+1,-1)
               
                  If PPidExist(Int(inh2$))=1 Then
                  
                     PPid2GAME(Int(inh2$))
                  
                     pp\TurX#=NextUDPKomma$()
                     pp\TurY#=NextUDPKomma$()
                     pp\TurZ#=NextUDPKomma$()
                     pp\MovX#=NextUDPKomma$()
                     pp\MovY#=NextUDPKomma$()
                     pp\MovZ#=NextUDPKomma$()
                     
                     pp\SystemID=pl\SystemID
                  
                  EndIf
               
            EndIf
            
            If Instr(inhalt$,"!/spd3~") > 0 Then
               inh2$=Mid$(inhalt$,8,Instr(inhalt$,";")-1)
               inhalt$=Mid$(inhalt$,Instr(inhalt$,";")+1,-1)
               
                  If PPidExist(Int(inh2$))=1 Then
                  
                     PPid2GAME(Int(inh2$))
                  
                     pp\fire=NextUDPKomma$()
                     pp\zielID=NextUDPKomma$()
                     
                     ;User ID zu pp\o ID umwandeln
                     If PPidExist(pp\zielID)=1 Then
                        vor=pp\ID
                        pp\zielID=pp\O
                        PPid2GAME(vor)
                     Else
                        If EntityExist(pp\zielID)=0 Then
                           pp\fire=0
                        EndIf
                     EndIf
                     
                     pp\SystemID=pl\SystemID
                  
                  EndIf
               
            EndIf
            
            PP2GAME(vor)
            
         Wend
      EndIf
      
      



betreffende Zeile:
Code: [AUSKLAPPEN]
If Instr(inhalt$,"!/spd1~") > 0 Then
inh2$=Mid$(inhalt$,8,Instr(inhalt$,";")-1)
Stop


Inhalt ist inhalt$="!/spd1~2;0.0;0.0;0.0;0.0;0.0;0.0
Aus inh2$ ergibt sich aber inh2$="2;0.0;0.

Das ist auch sehr seltsam, da Instr immer nach dem ersten Zeichen in dem Fall ";" sucht, dort findet er aber das 3. als erstes?

Ich glaube einfach irgendwie, dass die Server.exe auf dem Computer hier mit dem Client Speicherkonflikte hat. Auf dem alten Laptop funktioniert es nämlich einwandfrei. Er empfängt dort die Daten und findet auch die Typeinträge.

Setup:
Server.exe läuft auf diesem Computer, sowie eine Client.exe
Eine zweite Client.exe läuft auf meinem Laptop über LAN.

Auf meinem Computer gibt es diese seltsamen Probleme, auf dem Laptop hingegen nicht.

Eingeproggt

BeitragMi, Dez 23, 2009 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
NightPhönix... Ich hab dasselbe Problem... und kann es mir noch weniger erklären als du... Speicherkonflikte könnens nicht sein, weil ich hab lediglich diesen Code ausgeführt:

Code: [AUSKLAPPEN]
inhalt$="!/spd1~2;0.0;0.0;0.0;0.0;0.0;0.0
If Instr(inhalt$,"!/spd1~") > 0 Then
   inh2$=Mid$(inhalt$,8,Instr(inhalt$,";")-1)
EndIf

DebugLog inhalt$
DebugLog inh2$
WaitKey()
End


und bekomme für inh2 2;0.0;0. Shocked

mit verwirrten Grüßen,
Christoph.


EDIT: Hey wir sind beide so blind Laughing
Mid Startet ja vom Anfangs-Index, also 8 (bei 2) und nimmt dann soviele Zeichen mit wie im 2. Parameter angegeben sind. Der Index des ersten ; ist 9, also nimmt er 9-1 Zeichen, beginnend vom 2er heraus.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Noobody

BeitragMi, Dez 23, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte ja auch so heissen Code: [AUSKLAPPEN]
inh2$=Mid$(inhalt$,8,Instr(inhalt$,";")-8)


Mal davon abgesehen rate ich dir wirklich, WriteInt, WriteFloat etc. zu benutzen, wenn du schon mit Streams arbeitest. Alle Daten in einen String zu packen und nachher wieder rauszuschneiden ist mühsam, unübersichtlich und langsam (und produziert mal davon abgesehen auch grössere UDP-Pakete Wink ).

Die Befehle haben durchaus einen Zweck und sollten dementsprechend auch genutzt werden.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

NightPhoenix

BeitragMi, Dez 23, 2009 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
ok ^^ Ja stimmt Mid$ funktioniert ja bisschen anders Embarassed
Wenn es auch mit WriteFloat geht klingt das super Wink


Trotzdem findet er den entspreche4nden Typeintrag in der Funktion nicht und das ist immernoch seltsam, da er die ID zur Funktion, nach der gesucht werden soll, sauber übergibt.


Welche möglichen Erklärungen gibt es denn dafür, dass ein Rechner beim selben Code keine Probleme hat und ein anderer da total spinnt?


*edit 05.01.2010*
Problem konnte durch eine komplette Formatierung der Festplatten gelöst werden. Es war offensichtlich doch ein sehr verwinkeltes Softwareproblem.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group