AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [C] Pointer&Datentypen signed/unsigned kommen durcheinander

[C] Pointer&Datentypen signed/unsigned kommen durcheinander

Ein Thema von Phoenix · begonnen am 15. Mai 2006 · letzter Beitrag vom 16. Mai 2006
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

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

[C] Pointer&Datentypen signed/unsigned kommen durcheinan

  Alt 15. Mai 2006, 11: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
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.605 Beiträge
 
#2

Re: [C] Pointer&Datentypen signed/unsigned kommen durche

  Alt 15. Mai 2006, 11:47
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: [C] Pointer&Datentypen signed/unsigned kommen durche

  Alt 16. Mai 2006, 07:33
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)?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 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