C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

printf / sprintf von void* klappt nicht so ganz...

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Erik Rull
Guest





PostPosted: Wed Dec 20, 2006 12:55 am    Post subject: printf / sprintf von void* klappt nicht so ganz... Reply with 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.
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





PostPosted: Wed Dec 20, 2006 2:47 pm    Post subject: Re: printf / sprintf von void* klappt nicht so ganz... Reply with quote



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





PostPosted: Wed Dec 20, 2006 3:21 pm    Post subject: Re: printf / sprintf von void* klappt nicht so ganz... Reply with quote



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.

Quote:
Any Ideas?

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





PostPosted: Thu Dec 21, 2006 3:57 am    Post subject: Re: printf / sprintf von void* klappt nicht so ganz... Reply with quote

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.

Quote:
Any Ideas?

Kommt darauf an, was du eigentlich machen willst.
Back to top
Roland.Csaszar
Guest





PostPosted: Thu Jan 04, 2007 2:08 pm    Post subject: Re: printf / sprintf von void* klappt nicht so ganz... Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.