eindeutige ID - Umsetzung
-
wenn ich dich richtig verstehe willst du die adresse der Variable auf dem Server nehmen [...] sowas geht in die Hose, den die Variablen landen ja im RAM wo Platz ist und das ist unberechenbar.
Die Speicheradresse bleibt fuer die Lebensdauer des Objektes konstant und eignet sich darum sehr gut als ID.
-
Juhu,
endlich einer der mir zustimmt, hast du auch ne Idee wie ich die Adresse verwenden kann?
Kann man da vielleicht was mit Struktur Union machen?
Dann müsste ich ja nen Pointer erhalten der auf mehrere Typen zeigt/zeigen kann?Gruß
Scarabol
-
Kann man da vielleicht was mit Struktur Union machen?
Wenn Du unbedingt verschiedene Objekt-Typen unterscheiden musst, kannst Du einfach von einer Basisklasse erben die solche Funktionalitaet bereitstellt:
class Object { public: enum Type { Thing, Enemy, Projectile, ... }; Object(Type type) : mType(type) { } Type getType() const { return mType; } private: Type mType; }; class Projectile : public Object { Projectile() : Object(Object::Projectile) { } void explode() { } }; Object *obj= new Projectile(); if (obj->getType()==Object::Projectile) { Projectile *p= (Projectile*)obj; p->explode(); }
Eleganter ist jedoch ein gemeinsames Interface fuer alle Objekte bereitzustellen und jeweils mit sinnvoller Funktionalitaet zu ueberschreiben.
-
Scarabol schrieb:
Ist ne RAM Adresse nicht immer 6 oder 8 Zeichen lang?
Falls du mit "Zeichen" "Bytes" meinst: Auf 32-Bit-Rechnern ist eine Speicheradresse in der Regel 4 Bytes groß, auf 64-Bit-Rechnern aber schon 8 Bytes.
-
hellihjb schrieb:
wenn ich dich richtig verstehe willst du die adresse der Variable auf dem Server nehmen [...] sowas geht in die Hose, den die Variablen landen ja im RAM wo Platz ist und das ist unberechenbar.
Die Speicheradresse bleibt fuer die Lebensdauer des Objektes konstant und eignet sich darum sehr gut als ID.
Ja aber da er auch von Zeigern sprach hatte ich eher das Gefühl das er mit der Adresse vom Server auf die Stelle im RAM das Clients zugreifen will, deswegen hate ich das geschrieben.
-
mit der Adresse vom Server auf die Stelle im RAM das Clients zugreifen
Muesste aber jedem klar sein dass das nicht geht
-
Nein, nein, das die Speicheradressen auf beiden Systemen unterschiedlich sind ist mir klar, ich will die Adresse nur als Zahlenwert benutzen, um das Objekt eindeutig zu identifizieren...
Stimmt auf einem 32 bit System sind die Adressen 4 byte, dann sollte es doch möglich sein, die Adresse von einer beliebigen Variabeln in einer signed long zu speichern und dann mit sprintf in einen String zu "drucken" und an die Clients mit nem WinSocket zu verteilen, oder?
Gruß
Scarabol
-
Ja das ginge, müsstest halt das Problem mit den 4 und 8Bytes lösen. In einen String würde ichs allerdings nicht drucken, damit wird die variable nur unnötig lange und du brauchst sie ja nur für einen Vergleich, was am Ende genau drin steht ist ansich ja egal. Wenn dus so machen willst würde ich direkt das int oder long verteilen.
-
hmm,
soweit ich weiß kann man Programme doch immer nur entweder für 32 bit ODER für 64 BIT compilieren, also währe das ja nur eine Compiler If Frage um das "Problem" zwischen 4 und 8 byte zu lösen, aber ich schaffs nicht das int bzw. long auszulesen, wie geht das?
Gruß
Scarabol
-
nimm einfach long, der wächst mit.
-
Tut mir leid Leute, ich kapier einfach nicht wie ihr das meint, würde mich riesig über nen kurzen Codeschnippsel freuen, wie ich es schaffe aus die Speicheradresse der long a in long b zu speichern???
So?
long a = 10; long * b = &a;
Was ist wenn a eine Struktur verwendet?
struct1 a.x = 10; struct2 b.z = 20; long * c = &a bzw = &b;
Gruß
Scarabol
-
vielleicht sowas?
long a = 10; long b = reinterpret_cast<long>(&a);
-
Mist zu langsam
Vielen Dank!!!!Ihr seid Spitze!!!
[trash]
hmm, ich denke ich habs:long id = long(&projektile);
Richtig so?
[/trash]Gruß
Scarabol
-
So nächstes Problem
Also ich verwende eine LinkedList, dazu gehört, dass ich einen Iterator habe, dieser zeigt auf ein Element der Liste. Problem ist jetzt das der Link zu dem ListenElement als Privat makiert ist, ergo hab ich erstma keinen Zugriff darauf.
Kann ich das ändern, ich hab von dem Iterator nur die Headerdatei?
Was passiert, wenn ich den Link zu dem Element in den Public Bereich verschiebe?Eigentlich will ich ja nur lesen, also brauch ich doch keinen Vollzugriff, C++ müsste mich nur mal kurz draufschauen lassen
Gruß
Scarabol
-
also wenn als ID die speicheradresse vom server genommen wird, was macht der client mit dieser ID? der hat ja an dieser adresse nix. hat der nicht eine kopie des objekts im speicher? wie findet der anhand der ID seine kopie?
brauchste die IDs auch zum speichern von spielständen?
-
Also das ganze funktioniert so:
Der Server schickt dem Client ne Nachricht die sieht ca so aus:
"&s10,20,30,40&\0"Der Client zerlegt die wieder und erährt daraus:
s => Die Daten sind von einem Spieler
10 => Spieler.id = 10;
20,30,40 => Spieler.position = 20,30,40;Nun checkt der Client seine Liste mit Spieler, ob er der Client bereits ein Objekt mit der ID id hat. Falls das der Fall ist aktualisiert er die Daten von diesem Objekt, falls nicht erstellt er einfach ein neues...
Achso die Frage von mir hat sich erledigt ein Blick in den Header und auf die Rückgabewerte der Funktionen hat gerreicht, tja lesen bildet
Gruß
Scarabol