Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#1

[C] Pointer&Datentypen signed/unsigned kommen durcheinan

  Alt 15. Mai 2006, 12:40
Hi Leute,

ich hätte da gern mal ein kleines Problem. Für ein Praktikum in Systemsoftware müssen wir eine kleine Client/Server Anwendung in native C schreiben. An und für sich kein allzu grossen Problem, wenn die Clients nicht über einen SharedMemory miteinander kommunizieren müssten.

Auf den Sharedmemory habe also nur einen Pointer und muss da drin alles selber managen. Ist an und für sich auch ganz klar, aber bei der Umsetzung hakt es jetzt. Ich poste mal etwas Code:

Code:
   char * smptr = getSMPtr();
   long nextfree = (unsigned long)smptr[NEXTFREE];
   if (DEBUG) printf("DEBUG: Offset to SM-Start: %i\n", nextfree);
   SMMessage * new = (SMMessage *) (nextfree + smptr);

   // copy struct values into sm
   new->BefehlsId = newCommand.BefehlsID;
   new->Size = sizeof(SMMessage);
   new->BefehlsArt = newCommand.Befehlsart;
   new->Pid = newCommand.pid;

   nextfree += new->Size;
   if (DEBUG) printf("DEBUG: Neuer Offset to SM-Start: %i\n", nextfree);
   smptr[NEXTFREE] = nextfree;
   (int)smptr[MESSAGECOUNT]++;
   releaseSMPtr(smptr);

So, und nun mein Problem: Irgendwann nimmt nextfree (der Pointer auf das nächste Element in das geschrieben werden kann) einen so grossen Wert an, dass das hochwertigste Bit umkippt (also > 128). Obwohl das ganze ein long (4-byte) ist und ich ihn sogar noch epxlizit auf unsigned caste steht zwar der richtige Wert im Speicher (ein Dump zeigt mir das an), aber wenn ich ihn dann herauslese beim Hinzufügen des nächsten Elementes nimmt er einen negativen Wert.

Beispiel: 141 steht drin (8d 00 00 00), mit -115 wird weitergerechnet (gleicher code wie oben, beim Lesen wird auf unsigned long gecastet).

Ich bekomme da noch die Endkrise im Moment. Ich weiss absolut nicht mehr weiter. Wie bekomme ich den gleichen Wert wieder raus, den ich da reinschreibe?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat