2013-12-13 15 views
6

Próbuję użyć beginthreadex, aby utworzyć wątek, który uruchomi funkcję, która pobiera znak jako argument. Jestem jednak zły w C++ i nie mogę wymyślić, jak zamienić char w konst char , który beginthreadex potrzebuje do swojej argumentacji. Czy jest jakiś sposób na zrobienie tego? Znajduję wiele pytań dotyczących konwersji char na const char, ale nie na const char *.C++ Konwertowanie znaków na znaki stałe *

+0

Można niejawnie przekształcić "char *" w "const char *". Nie musisz nic robić. – asveikau

+0

@asveikau: To nie pomaga przekazać wartości 'char' do czegoś, co chce wskaźnika. –

+0

Zgodnie z dokumentacją (http://msdn.microsoft.com/en-us/library/kdzttdcb.aspx) 'beginthreadex' chce' void * '. – dalle

Odpowiedz

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

Oczywiście jest to na stosie. Jeśli jest to potrzebne na stercie,

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

Pytanie dotyczy języka C++, więc zamiast tego możesz użyć 'nowego'. – filmor

+0

@filmor, masz rację. Gotowe. –

0

Jeśli funkcja oczekuje const wskaźnik do opuszczającego charakteru należy udać się z odpowiedzią Paul Draper. Należy jednak pamiętać, że nie jest to wskaźnik do zakończonego znakiem null łańcucha, czego funkcja mogłaby się spodziewać. Jeśli potrzebujesz wskaźnik do NUL łańcuch można użyć std::string::c_str

f(const char* s); 

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

Ponieważ nie wykazały żadnego kodu trudno wiedzieć dokładnie, co chcesz, ale tutaj jest sposób, aby wywołać funkcję spodziewa char jako argument w wątku. Jeśli nie możesz zmienić funkcji konwersji samego argumentu, potrzebujesz funkcji trampoliny, aby usiąść w środku i wywołać rzeczywistą funkcję.

#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; 
} 
Powiązane problemy