2010-06-19 9 views
18

Nachdem ich das Web durchgelaufen bin und mich selbst vermasselt habe, kann ich anscheinend kein void * Ziel (welches eine Zeichenkette ist) in eine std :: Zeichenkette umwandeln. Ich habe versucht, sprintf(buffer, "%p", *((int *)point)); wie von this page empfohlen, um zu einem C-String zu bekommen, aber ohne Erfolg. Und leider, ja, ich muss eine void * verwenden, wie SDL in ihrer USEREVENT-Struktur verwendet.Konvertieren von void * in eine std :: string

Der Code, den ich die Userevent füllen bin mit, für die Interessenten ist:

std::string filename = "ResumeButton.png"; 
SDL_Event button_press; 
button_press.type = BUTTON_PRESS; 
button_press.user.data1 = &filename; 
SDL_PushEvent(&button_press); 

Irgendwelche Ideen?

EDIT: Danke für alle Antworten, ich musste nur die void * zu einem std :: string *. Wie dumm von mir. Vielen Dank, Jungs!

+1

Was ist STL, was ist USEREVENT in STL? C++ hat so etwas nicht. – GManNickG

+1

Was versuchst du zu tun? Sie haben einen void * -Zeiger, der auf Was zeigt? –

+0

Ich denke, er meint SDL UserEvent http://linux.die.net/man/3/sdl_userevent – Stephen

Antwort

16

Sie müssen nur dynamisch es zuzuweisen (weil es wahrscheinlich den Umfang überleben muss man es in verwenden), warf es dann hin und her:

// Cast a dynamically allocated string to 'void*'. 
void *vp = static_cast<void*>(new std::string("it's easy to break stuff like this!")); 

// Then, in the function that's using the UserEvent: 
// Cast it back to a string pointer. 
std::string *sp = static_cast<std::string*>(vp); 
// You could use 'sp' directly, or this, which does a copy. 
std::string s = *sp; 
// Don't forget to destroy the memory that you've allocated. 
delete sp; 
+0

Genau das, was ich gesucht habe. Vielen Dank! – Lewis

+0

Beachten Sie, dass diese Antwort einen Vorteil gegenüber den anderen (s) hat, da sie verhindert, dass das Ziel des Zeigers außerhalb des Bereichs liegt. Danke noch einmal! – Lewis

4

Wenn Sie die Adresse als Text zu formatieren versuchen, ein stringstream verwenden können:

std::stringstream strm; 
strm << ptr; 
std::string str = strm.str(); 

// str will now have something like "0x80004567" 

Wenn das nicht das, was Sie interessiert sind, klären Sie bitte Ihre Frage.

+0

Sorry, ich war überhaupt nicht klar. Was ich meinte, war das Konvertieren, worauf das void * (welches eine Zeichenkette ist) in eine Zeichenkette umwandelt. – Lewis

+0

Ich * habe * versucht, das zu tun - danke! (Mod Up) – Brad

7

Basierend auf Ihrem Kommentar "Was ich meinte war, um zu konvertieren, worauf die void * (die eine Zeichenfolge ist) in eine Zeichenfolge."

Angenommen, Sie haben dies:

std::string str = ...; 
void *ptr = &str; 

Sie können nur auf den String zurückgeworfen:

std::string *pstr = static_cast<std::string *>(ptr); 

Beachten Sie, dass es auf Sie ist zu überprüfen, ob ptr Punkte tatsächlich zu einem std::string. Wenn Sie sich irren und auf etwas anderes zeigen, führt dies zu undefiniertem Verhalten.

+0

Genau das habe ich gesucht. Vielen Dank! – Lewis

1

Wenn die Lücke ein const char * , dann können Sie einfach den std :: string Konstruktor damit aufrufen, dh

const char* cakes = something; 
std::string lols = std::string(cakes); 
+0

Sie können im Allgemeinen nicht davon ausgehen, dass dies der Fall ist. Daher würde Ihr Vorschlag wahrscheinlich zu einer Segmentierungsverletzung führen. Bitte überlegen Sie, es zu entfernen. – einpoklum