Comment convertir double* un double?
Des idées pour ce typecasting problème?
Voici ce que je suis en train de faire. Ce n'est pas le code:
LinkedList* angles;
double dblangle;
dblangle = (some function for angle calculation returning double value);
(double*)LinkedListCurrent(angles) = &double;
J'espère que vous obtenez l'idée. La dernière ligne est à l'origine du problème. Initialement angles est void*
type donc je dois d'abord le convertir en double*
.
Ce n'est pas une bonne idée de convertir un lit double* une chambre double. Pourquoi voulez-vous le faire? De toute façon, vous pouvez utiliser le reinterpret_cast pour de telles conversions.
Lire ceci: stackoverflow.com/questions/332030/...
J'ai copié votre commentaire à partir des réponses à votre question réelle, et ajouté un peu de mise en forme. Cela devrait lui permettre d'être vu et lu plus facilement. C'est généralement une bonne idée d'inscrire un extrait de code dans votre question initiale.
Merci beaucoup pour passer à travers les difficultés.
Que de pseudo n'est pas toujours très utile. Ce qui est censé être sur le côté droit? Ce n'LinkedListCurrent(angles)? Pourquoi êtes-vous en œuvre votre propre liste liée dans C++ plutôt que d'utiliser std::list? Êtes-vous sûr que vous voulez être à l'aide de C?
Lire ceci: stackoverflow.com/questions/332030/...
J'ai copié votre commentaire à partir des réponses à votre question réelle, et ajouté un peu de mise en forme. Cela devrait lui permettre d'être vu et lu plus facilement. C'est généralement une bonne idée d'inscrire un extrait de code dans votre question initiale.
Merci beaucoup pour passer à travers les difficultés.
Que de pseudo n'est pas toujours très utile. Ce qui est censé être sur le côté droit? Ce n'LinkedListCurrent(angles)? Pourquoi êtes-vous en œuvre votre propre liste liée dans C++ plutôt que d'utiliser std::list? Êtes-vous sûr que vous voulez être à l'aide de C?
OriginalL'auteur Muhammad Farhan | 2009-12-24
Vous devez vous connecter pour publier un commentaire.
Vous utilisez le unaire
*
opérateur de déréférencement d'un pointeur. Un déréférencement d'un pointeur désigne l'extraction de la valeur souligné, pour obtenir une valeur du type d'origine.edit 2: (supprimé edit 1 comme il n'était pas pertinent à votre question, mais a été basée sur un malentendu)
De vos éclaircissements, on dirait que vous vous demandez comment définir une valeur pointé par un pointeur qui a été jeté d'un
void *
à undouble *
. Pour ce faire, nous avons besoin d'utiliser le unaire*
sur le côté gauche de la mission, afin d'indiquer que nous voulons écrire à l'emplacement pointé par le pointeur.Donc, je suis en supposant que votre
LinkedListCurrent
est de retour unevoid *
pointant vers un élément dans la liste que vous souhaitez mettre à jour. Dans ce cas, vous devez effectuer les opérations suivantes:Cette mise à jour de la valeur pointée par le pointeur retourné à partir de
LinkedListCurrent
être égale àdbangle
. Je crois que c'est ce que vous essayez de faire.Si vous essayez de mettre à jour le pointeur retourné par
LinkedListCurrent
, vous ne pouvez pas le faire. Le pointeur a été copiés dans un emplacement temporaire pour le retour de la fonction. Si vous avez besoin de retourner un pointeur que vous pouvez mettre à jour, vous devez retourner un pointeur vers un pointeur, et la mise à jour de l'intérieur.Mon explication ci-dessus est basée sur ce que je crois que vous essayez de faire, basée sur l'exemple de l'extrait de code que vous avez posté et quelques suppositions que j'ai fait à propos de l'interface. Si vous voulez une meilleure explication, ou si l'une de mes hypothèses est mauvais, vous voudrez peut-être essayer de poster un code, les messages d'erreur que vous obtenez, et une explication plus détaillée de ce que vous essayez de faire. Montrant l'interface de la liste chaînée type de données permettrait de fournir un contexte pour que votre question est à propos.
modifier 3: Comme l'a souligné dans les commentaires, vous ne devriez pas être en jetant ici de toute façon; jette devrait être utilisé aussi peu que possible. Vous devez généralement utiliser la collection basée sur des modèles types, de sorte que le compilateur peut réellement faire le typage pour vous. Si vous avez besoin de stocker hétérogène types dans la même structure, elle doit partager une super-classe et ont des méthodes virtuelles d'effectuer des opérations sur celles-ci, et utilisez
dynamic_cast
si vous avez vraiment besoin de jeter une valeur d'un type particulier (commedynamic_cast
pouvez vérifier au moment de l'exécution que le type est correct).Yay, la seule bonne réponse! +1
C'est bien que les gens non seulement à répondre aux questions, mais en fait poser plus de questions pour comprendre ce que le réel problème. J'ai supprimé ma réponse si cela aura voté, puisque c'est beaucoup plus complète. +1.
reinterpret_cast
veut être utilisée. 🙁Vraiment, il ne devrait pas besoin d'être tout type de fonte utilisée. Vous ne devriez pas utiliser une liste chaînée type de données avec le vide des pointeurs en C++, mais devrait plutôt utiliser un
templated
structure de données, ou une structure de données contenant des pointeurs vers des objets avec des fonctions virtuelles. Au pire, vous devriez être en utilisant dynamic_cast si vous avez besoin d'extraire des objets d'un type particulier. Il est difficile d'expliquer tout cela en une seule réponse, surtout, sans plus d'information sur ce qu'il essaie de faire, alors j'ai pensé que je voudrais essayer de répondre juste à la question immédiate et ne pas aller plus loin dans les enjeux de style.OriginalL'auteur Brian Campbell
pourquoi sur terre serait vous souhaitez utiliser une adresse de mémoire comme un nombre à virgule flottante?
si vous signifiait de déréférencement:
Je ne comprends pas. le code n'est à la fois: stocke une adresse dans un pointeur, puis déréférence le pointeur pour obtenir le nombre pointé. Je vais ajouter des commentaires.
si vraiment vous voulez dire que vous souhaitez utiliser l'adresse de
dp
danse
, alors vous aurez à expliquer pourquoi.Voici ce que je suis en train de faire. Ce n'est pas le code: LinkedList* angles; double dblangle; dblangle = (une fonction pour le calcul de l'angle de retour de la double valeur); (double*)LinkedListCurrent(angles) = &double; j'espère que vous obtenez l'idée. La dernière ligne est à l'origine du problème. Initialement angles est void* type donc je dois d'abord le convertir en double*.
OriginalL'auteur just somebody
Remarque cette ligne:
où vous avez écrit
&double
, je pense qu'il devrait être&dbangle
. Pour améliorer la lisibilité, je voudrais écrire:Cependant, vous ne devriez pas faire ce type de conversion que d'autres l'ont mentionné.
OriginalL'auteur Donotalo
Utilisation d'un syndicat. Si vous voulez le stocker deux variables dans un emplacement de mémoire (mais pas en même temps), vous n'avez pas à prétendre que l'un est l'autre.
OriginalL'auteur Potatoswatter
Utilisation reinterpret_cast.
OriginalL'auteur fushar
En réponse à cela:
Vous ferait quelque chose comme ceci:
Cela peut être fait comme dans un vrai programme:
OriginalL'auteur Seth