 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Erik Rull Guest
|
Posted: Wed Dec 20, 2006 12:55 am Post subject: printf / sprintf von void* klappt nicht so ganz... |
|
|
Hallo zusammen,
ich habe das Problem, dass printf nur den Pointer-Wert speichert und
nicht mehr - für eine Lösung wäre ich sehr dankbar.
class A
{
public:
double d;
void sendPointer()
{
d = 4.5;
dumpPointer("%lf",&d);
};
};
void dumpPointer(const char * print, void * ptr)
{
printf(print,ptr);
}
andernorts:
A foo;
foo.sendPointer();
Ausgabe: 0.00000
Ein dereferenzieren des void * geht ja leider nicht, um an den Wert
ranzukommen.
Ich könnte zwar explizit auf double casten, aber ich muss damit auch
unsigned long long rausbekommen und die sind ja größer als double,
dasselbe Problem hätte ich auch bei char*, etc.
Any Ideas?
Grüße,
Erik |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Dec 20, 2006 2:47 pm Post subject: Re: printf / sprintf von void* klappt nicht so ganz... |
|
|
Erik Rull <webmasterspam (AT) rdsoftware (DOT) de> writes:
| Quote: | ich habe das Problem, dass printf nur den Pointer-Wert speichert und
nicht mehr - für eine Lösung wäre ich sehr dankbar.
|
Nicht void * verwenden.
| Quote: | class A
{
public:
double d;
void sendPointer()
{
d = 4.5;
dumpPointer("%lf",&d);
|
std::cout << d;
| Quote: | };
};
void dumpPointer(const char * print, void * ptr)
{
printf(print,ptr);
}
andernorts:
A foo;
foo.sendPointer();
Ausgabe: 0.00000
|
Die Funktionsnamen sendPointer und dumpPointer sind ja schon
eigenartig. Was für ein Problem willst Du wirklich lösen?
| Quote: | Ein dereferenzieren des void * geht ja leider nicht, um an den Wert
ranzukommen.
Ich könnte zwar explizit auf double casten, aber ich muss damit auch
unsigned long long rausbekommen und die sind ja größer als double,
dasselbe Problem hätte ich auch bei char*, etc.
Any Ideas?
|
Nicht ohne zu wisse, was Dein eigentliches Problem ist. |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Wed Dec 20, 2006 3:21 pm Post subject: Re: printf / sprintf von void* klappt nicht so ganz... |
|
|
Erik Rull <webmasterspam (AT) rdsoftware (DOT) de> writes:
[...]
| Quote: | d = 4.5;
dumpPointer("%lf",&d);
[...]
printf(print,ptr);
|
Mit der Formatanweisung %f erwartet printf als nächstes Agrument ein
double und nicht ein double* (Zeiger auf double).
Das ist das Problem mit der fehlenden Typsicherheit bei printf.
Du solltest lieber C++ streams verwenden.
#include <iostream>
Cheers,
Rudiger
--
Der folgende Satz ist falsch.
Der vorherige Satz ist richtig. |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Dec 21, 2006 3:57 am Post subject: Re: printf / sprintf von void* klappt nicht so ganz... |
|
|
Erik Rull wrote:
| Quote: | Hallo zusammen,
ich habe das Problem, dass printf nur den Pointer-Wert speichert und
nicht mehr - für eine Lösung wäre ich sehr dankbar.
class A
{
public:
double d;
void sendPointer()
{
d = 4.5;
dumpPointer("%lf",&d);
};
};
void dumpPointer(const char * print, void * ptr)
{
printf(print,ptr);
}
andernorts:
A foo;
foo.sendPointer();
Ausgabe: 0.00000
Ein dereferenzieren des void * geht ja leider nicht, um an den Wert
ranzukommen.
|
Deshalb wäre es einfacher, keinen void* zu verwenden.
| Quote: | Ich könnte zwar explizit auf double casten, aber ich muss damit auch
unsigned long long rausbekommen und die sind ja größer als double,
dasselbe Problem hätte ich auch bei char*, etc.
|
Ein void* ist nichts weiter als die Adresse eines Objekts unbestimmten Typs.
printf hat keinerlei Möglichkeit, rauszubekommen, worauf er zeigt. Du
kannst ihm nicht einfach irgenwas hinwerfen und glauben, es würde den Typ
auf magische Weise erkennen und das Objekt richtig ausgeben.
Kommt darauf an, was du eigentlich machen willst. |
|
| Back to top |
|
 |
Roland.Csaszar Guest
|
Posted: Thu Jan 04, 2007 2:08 pm Post subject: Re: printf / sprintf von void* klappt nicht so ganz... |
|
|
On 2006-12-19, Erik Rull <webmasterspam (AT) rdsoftware (DOT) de> wrote:
| Quote: | class A
{
public:
double d;
void sendPointer()
{
d = 4.5;
dumpPointer("%lf",&d);
};
};
void dumpPointer(const char * print, void * ptr)
{
printf(print,ptr);
}
andernorts:
A foo;
foo.sendPointer();
Ausgabe: 0.00000
|
Wenn du wirklich printf verwenden willst, musst du '%p' verwenden, und
den Pointer nach 'void *' casten (was du in deiner Funktion eh machst),
alles andere erzeugt undefiniertes Verhalten.
Also:
dumpPointer("%p", &d);
--
Roland Csaszar ----------- \\\ /// -------------- +43 316 495 2129
Software Development ------ \\\ /// ----------- http://www.knapp.com
KNAPP Logistics Automation - \\V// - mailto:roland.csaszar (AT) knapp (DOT) com |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|