Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] Pointer&Datentypen signed/unsigned kommen durcheinander (https://www.delphipraxis.net/69445-%5Bc%5D-pointer-datentypen-signed-unsigned-kommen-durcheinander.html)

Phoenix 15. Mai 2006 11:40


[C] Pointer&Datentypen signed/unsigned kommen durcheinan
 
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?

Phoenix 15. Mai 2006 11:47

Re: [C] Pointer&Datentypen signed/unsigned kommen durche
 
Also, ich hab schon erstmal nen Workaround gefunden:

Ich habe mir eine Struktur gebaut die an der Stelle im Speicher einen long Datentypen definiert und greife nun über dieses 'Hilfsstrukt' auf den Speicher zu. Und schon liest er den richtigen Wert raus. Eine Antwort wäre mir aber dennoch recht, weil sich extra ein Strukt bauen nur um einen Wert zu lesen in meinen Augen ein etwas grosser Overhead ist.

NicoDE 16. Mai 2006 07:33

Re: [C] Pointer&Datentypen signed/unsigned kommen durche
 
Anstatt
Code:
long nextfree = (unsigned long)smptr[NEXTFREE];
Meinst du vielleicht
Code:
unsigned long nextfree = *((unsigned long *)&smptr[NEXTFREE]);
(Adresse per Char-Array-Index auf ULong-Pointer casten und dereferenzieren)
oder
Code:
unsigned long nextfree = ((unsigned long *)smptr)[NEXTFREE];
(Char-Pointer auf ULong-Pointer casten und per ULong-Index zugreifen)?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz