2013-12-13 18 views
6

Ich versuche mit begintreadex einen Thread zu erstellen, der eine Funktion ausführen wird, die ein char als Argument verwendet. Ich bin jedoch schlecht in C++, und ich kann nicht herausfinden, wie man ein Zeichen in eine Const Char , die beginThreadex für sein Argument braucht. Gibt es eine Möglichkeit, das zu tun? Ich finde eine Menge Fragen zum Umwandeln eines Chars in ein Const Char, aber nicht zu einem Const Char *.C++ Konvertieren eines char in ein const char *

+0

Sie können 'char *' implizit in 'const char *' konvertieren. Keine Notwendigkeit, etwas zu tun. – asveikau

+0

@asveikau: Das hilft dir nicht, einen 'char'-Wert an etwas zu übergeben, das einen Zeiger haben möchte. –

+0

Laut der Dokumentation (http://msdn.microsoft.com/en-us/library/kdztttcb.aspx) will 'beginthreadex' ein' void * '. – dalle

Antwort

9
char a = 'z'; 
const char *b = &a; 

Natürlich ist dies auf dem Stapel. Wenn Sie es auf dem Heap benötigen,

char a = 'z'; 
const char *b = new char(a); 
+0

Die Frage bezieht sich auf C++, Sie sollten also stattdessen mit 'new' gehen. – filmor

+0

@filmor, Sie haben Recht. Erledigt. –

0

Wenn erwartet die Funktion einen const Zeiger auf ein Verlassen Zeichen, das Sie mit der Antwort von Paul Draper gehen sollten. Beachten Sie jedoch, dass dies kein Zeiger auf eine mit Null beendete Zeichenfolge ist, was die Funktion erwarten könnte. Wenn Sie einen Zeiger auf Null endende Zeichenfolge benötigen, können Sie std::string::c_str

f(const char* s); 

char a = 'z'; 
std::string str{a}; 
f(str.c_str()); 
0

verwenden Da Sie keinen Code zeigen, hat es genau schwer zu wissen, was Sie wollen, aber hier ist eine Möglichkeit, eine Funktion aufzurufen, eine char erwartet als ein Argument in einem Thread. Wenn Sie die Funktion zum Konvertieren des Arguments selbst nicht ändern können, benötigen Sie eine Trampolinfunktion, um in der Mitte zu sitzen und die eigentliche Funktion aufzurufen.

#include <Windows.h> 
#include <process.h> 
#include <iostream> 

void ActualThreadFunc(char c) 
{ 
    std::cout << "ActualThreadFunc got " << c << " as an argument\n"; 
} 

unsigned int __stdcall TrampolineFunc(void* args) 
{ 
    char c = *reinterpret_cast<char*>(args); 
    std::cout << "Calling ActualThreadFunc(" << c << ")\n"; 
    ActualThreadFunc(c); 
    _endthreadex(0); 
    return 0; 
} 

int main() 
{ 
    char c = '?'; 
    unsigned int threadID = 0; 
    std::cout << "Creating Suspended Thread...\n"; 
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &TrampolineFunc, &c, CREATE_SUSPENDED, &threadID); 
    std::cout << "Starting Thread and Waiting...\n"; 
    ResumeThread(hThread); 
    WaitForSingleObject(hThread, INFINITE); 
    CloseHandle(hThread); 
    std::cout << "Thread Exited...\n"; 

    return 0; 
}