3 Stimmen

Wie wandelt man double* in ein double um?

Haben Sie eine Idee für dieses Typecasting-Problem?

Ich versuche Folgendes zu tun. Dies ist nicht der eigentliche Code:

LinkedList* angles;
double dblangle; 
dblangle = (some function for angle calculation returning double value);
(double*)LinkedListCurrent(angles) = &double; 

Ich hoffe, Sie verstehen die Idee. Die letzte Zeile ist die Ursache des Problems. Ursprünglich sind die Winkel void* Typs, also muss ich ihn zunächst in double* .

8voto

Brian Campbell Punkte 304982

Sie verwenden das unäre * Operator, um einen Zeiger zu derefenzieren. Die Dereferenzierung eines Zeigers bedeutet, dass der Wert, auf den er zeigt, extrahiert wird, um einen Wert des ursprünglichen Typs zu erhalten.

// Create a double value
double foo = 1.0;
// Create a pointer to that value
double *bar = &foo;
// Extract the value from that pointer
double baz = *bar;

bearbeiten 2 (löschte Edit 1, da er für Ihre eigentliche Frage nicht relevant war, sondern auf einem Kommunikationsfehler beruhte)

Aus Ihrer Klarstellung geht hervor, dass Sie sich fragen, wie Sie einen Wert setzen können, auf den ein Zeiger zeigt, der von einem void * zu einer double * . Um dies zu tun, müssen wir die unäre * auf der linken Seite der Zuweisung, um anzuzeigen, dass wir an die Stelle schreiben wollen, auf die der Zeiger zeigt.

// Get a void * pointing to our double value.
void *vp = &foo;
// Now, set foo by manipulating vp. We need to cast it to a double *, and
// then dereference it using the * operator.
*(double *)vp = 2.0;
// And get the value. Again, we need to cast it, and dereference it.
printf("%F\n", *(double *)vp);

Ich gehe also davon aus, dass Ihr LinkedListCurrent gibt eine void * die auf ein Element in der verknüpften Liste zeigt, das Sie aktualisieren möchten. In diesem Fall müssen Sie wie folgt vorgehen:

*(double*)LinkedListCurrent(angles) = dbangle;

Dies aktualisiert den Wert, auf den der Zeiger zeigt, der von LinkedListCurrent gleichzusetzen mit dbangle . Ich glaube, das ist es, was Sie zu tun versuchen.

Wenn Sie versuchen, die Zeiger zurückgegeben von LinkedListCurrent können Sie das nicht tun. Der Zeiger wurde an einen temporären Ort kopiert, um aus der Funktion zurückzukehren. Wenn Sie einen Zeiger zurückgeben müssen, den Sie aktualisieren können, müssen Sie einen Zeiger auf einen Zeiger zurückgeben und den inneren Zeiger aktualisieren.

Meine obige Erklärung basiert auf dem, was ich glaube, dass Sie versuchen, zu tun, auf der Grundlage des Beispiels Snippet Sie gepostet und einige Vermutungen, die ich über die Schnittstelle gemacht haben. Wenn Sie eine bessere Erklärung wünschen, oder wenn eine meiner Annahmen falsch war, sollten Sie versuchen, etwas tatsächlichen Code, alle Fehlermeldungen, die Sie erhalten, und eine detailliertere Erklärung dessen, was Sie zu tun versuchen, zu posten. Das Aufzeigen der Schnittstelle zum Datentyp der verknüpften Liste würde helfen, einen Kontext für Ihre Frage zu schaffen.

bearbeiten 3 : Wie in den Kommentaren erwähnt, sollten Sie hier wahrscheinlich sowieso nicht werfen; Würfe sollten so wenig wie möglich verwendet werden. Im Allgemeinen sollten Sie schablonenhafte Auflistungstypen verwenden, damit Ihr Compiler die Typüberprüfung für Sie durchführen kann. Wenn Sie heterogene Typen in derselben Struktur speichern müssen, sollten sie sich im Allgemeinen eine Oberklasse teilen und über virtuelle Methoden verfügen, um Operationen mit ihnen durchzuführen, und Sie sollten dynamic_cast wenn Sie einen Wert wirklich auf einen bestimmten Typ übertragen müssen (wie dynamic_cast kann zur Laufzeit prüfen, ob der Typ korrekt ist).

2voto

just somebody Punkte 17584

Warum in aller Welt sollten Sie eine Speicheradresse als Gleitkommazahl verwenden?

wenn Sie meinten Dereferenzierung :

double d = 1.0;  // create a double variable with value 1.0
double *dp = &d; // store its address in a pointer
double e = *dp;  // copy the value pointed at to another variable

1voto

Donotalo Punkte 12360

Beachten Sie diese Zeile:

(double*)LinkedListCurrent(angles) = &double;

wo Sie geschrieben haben &double sollte es meiner Meinung nach lauten &dbangle . Um die Lesbarkeit zu verbessern, würde ich schreiben:

((double*)LinkedListCurrent(angles)) = &dbangle;

Sie sollten diese Art der Umwandlung jedoch nicht vornehmen, wie bereits von anderen erwähnt.

0voto

Potatoswatter Punkte 130562

Verwenden Sie eine Gewerkschaft. Wenn Sie zwei Variablen an einem Speicherort speichern wollen (aber nicht gleichzeitig), müssen Sie nicht so tun, als sei die eine die andere.

union double_and_ptr {
    double d;
    double *p;
};

double_and_ptr x, y;
x.d = 0.1;
y.p = &x.d; // store a pointer in the same place as a double
y.d = x.d * 1.2; // store a double in the same place as a ptr

0voto

fushar Punkte 388

Verwenden Sie reinterpret_cast.

double foo = 3.0;
double* pfoo = &foo;
double bar = reinterpret_cast<double>(pfoo);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X