Type im Type lesen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

maxinet

Betreff: Type im Type lesen?

BeitragSo, Sep 30, 2007 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich hab ein kleines Problem beim verschachtelten auslesen:

Code: [AUSKLAPPEN]

.....

Type client
  Field name$
  Field sav_client
End Type

.....

    clients.client = New client
    clients\name=c_name$
    clients\sav_client=daten

.....

For clients.client = Each client

  .....

  For clients.client = Each client
    .....
  next

  .....

next


blitz stürtzt beim Ausführen immer ab, aber warum?

Gruß,
MaX!
 

Dreamora

BeitragSo, Sep 30, 2007 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
weil der innere und äussere schleifen iterator gleich sind.

Nenns aussen Mal Clients1 und innen Clients2, sonst änderst du das fortwährend.
Mit debug wird er dir vermutlich genauer sagen, warums aussteigt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

maxinet

BeitragSo, Sep 30, 2007 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

  ......

  For clients1.client = Each client

       ...........

          For clients2.client = Each client
            WriteString clients2\sav_client,"coords"
            WriteString clients2\sav_client,temp_colors$
            WriteString clients2\sav_client,temp_mausx
            WriteString clients2\sav_client,temp_mausy
          Next

         ......

  Next

 .......


Er stürtzt nichtmehr ab, scheint aber so, dass der nicht auf den Datensatz von clients1 zugreift..
 

Dreamora

BeitragSo, Sep 30, 2007 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein wird er auch nicht. Er greift auf alle Client zu nicht nur auf irgendwelche Unterdaten eines bestimmten Clients.

Wenn du das willst musst du dir mit Types eine Lineare Liste aufbauen oder die Handle der Objects in eine Bank speichern die im Type drin ist.
Als weitere variante kannst du allen Types ihren "Besitzerdatensatz" speichern und einfach schauen ob dieser mit dem aktuellen Client 1 übereinstimmt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

maxinet

BeitragMo, Okt 01, 2007 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
d.h. ich soll noch einen Ordner in dem Type anlegen und das alles parallel (1:1) in client speichern, also clients und dann noch copy_clients, damit ich das in der Schleife 2mal verwenden kann?!
o.O
 

Dreamora

BeitragMo, Okt 01, 2007 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm?
Was willst du denn genau erreichen.

Gemäss deiner beschreibung wolltest du es so das es in Type A verschiedene Type B referenzen gespeichert hat, das war zumindest was ich verstanden habe. Und in dem Falle wird das mit Each etc nichts, da der immer über alle Type Instanzen geht, nich nur über die, die in einer anderen Type Instance XY gespeichert sind.

Anderfalls bitte eine möglichst vollständige Beschreibung dessen was du erreichen willst
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

maxinet

BeitragMo, Okt 01, 2007 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, wie gewünscht nochmal eine sehr ausführliche beschreibung:

Ich habe einen Server und einen Client, in dem Client kann man etwas malen. Alles, was man malt wird an den Server geschickt, der es dann an alle Clients, die gerade verbunden sind überträgt. Quasi ein Multiplayer Malprogramm Wink

So, ok. Der Server speichert in dem Type, welche Clients genau verbunden sind, das heißt der Name, der vom Clienten eingegeben wurde und natürlich der Stream, dass alle neuen coordinaten an an Client gesendet werden können.

Gut, der Server geht nun in der 1. For-schleife den Type "client" durch, dabei ließt er die vom Client an den Server geschickten Daten (coords+farbe..), falls jemand etwas gemalt hat, wird es gleich an alle z.z. verbundenen clients geschickt, denn den STREAM hab ich ja im Type.

Damit es keine Fehler gibt, wird am Anfang der For-schleife geprüft, ob der Client schon disconnected hat (EOF). Ist dies der fall, wird er aus dem Type gelöscht.

Das Problem ist nun, dass der Server ja die gerade vom Clienten abgerufenen Daten an den rest (alle die verbunden sind) senden möchte. Das heißt er schnappt sich wieder den TYPE wo alle STREAM's drinstehen, und sendet seine neuen Informationen einmal rum. Wie wir oben schon zum entschluss gekommen sind, funktioniert das nicht:

Code: [AUSKLAPPEN]

.....

Type client
  Field name$
  Field sav_client
End Type

.....

   daten=Accept...

    if daten<>0 then
       ......
       clients.client = New client
       clients\name=c_name$
       clients\sav_client=daten
    endif

.....

For clients.client = Each client

  .....
  ;Prüfen ob ein Client neues material hat;)
  ;wenn ja, dann:
  For clients.client = Each client
    ;die soeben erhaltenen Informationen an alle Clients, die verbunden sind schicken
  next

  .....

next

Ist denke ich klar, dass bei den Punkten jeweils noch was anderes ausgeführt wird.

MaX!
 

Dreamora

BeitragMo, Okt 01, 2007 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so ok.

Das is net schwer. Da musst du einfach an alle ausser dem gerade ausgewählten Client schicken.
Allerdings hast du den oben schonma erwähnten und korrigierten fehler wieder eingebaut mit den Variablennamen der For-Each schleife Smile

Hier ein simples konstrukt dass du für deine Bedürfnisse erweitern kannst:

Code: [AUSKLAPPEN]

For clients.client = Each client
  For clientsOther.client = Each client
    if clients <> clientsOther
      ; Sende die soeben erhaltenen Daten
    endif
  next
next


was du dir da allerdings überlegen musst ist wie du neue daten und alte Daten trennst.

Ich hätte eine Bank empfohlen die du erweiterst und füllst. Darüber hinaus merkst du dir jedoch den Byteoffset des letzten übertragenen Bytes.
Dadurch kannst du die Bank dynamisch erweitern und dennoch das versenden der Daten steuern.
Ein String oder so wäre da keine Lösung.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

maxinet

BeitragDi, Okt 02, 2007 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah super, funktioniert, vielen dank Exclamation Exclamation
Ist es noch möglich, ohne großen aufwand die Anzahl der z.z. verbundenen Clients zu zählen?
Also so wie bei PHP: count() ?

MaX!
 

Dreamora

BeitragDi, Okt 02, 2007 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Am einfachsten in einer globalen Variable speichern, die du erhöhst wenn ein Spieler connected und wieder senkst wenn er sich disconnected.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

maxinet

BeitragMi, Okt 03, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, hatte ich auch schon dran gedacht...
Danke,

MaX!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group