2013-12-13 6 views
6

मैं एक थ्रेड बनाने के लिए beginthreadex का उपयोग करने की कोशिश कर रहा हूं जो एक ऐसा कार्य चलाएगा जो एक तर्क के रूप में चार लेता है। मैं सी ++ में बुरा हूं, हालांकि, और मैं यह नहीं समझ सकता कि चार को एक कॉन्स चार में कैसे चालू किया जाए, जिसे beginthreadex को इसके तर्क की आवश्यकता है। क्या ऐसा करने के लिए कोई रास्ता है? मुझे चार को एक कॉन्स char में परिवर्तित करने के लिए बहुत सारे प्रश्न मिलते हैं, लेकिन एक कॉन्स char * के लिए नहीं।सी ++ एक चार को एक कॉन्स char में परिवर्तित करना *

+0

आप स्पष्ट रूप से 'char *' को 'const char *' में परिवर्तित कर सकते हैं। कुछ भी करने की ज़रूरत नहीं है। – asveikau

+0

@asveikau: इससे आपको 'char' मान को कुछ ऐसा करने में मदद नहीं मिलती है जो पॉइंटर चाहता है। –

+0

प्रलेखन के अनुसार (http://msdn.microsoft.com/en-us/library/kdzttdcb.aspx) 'beginthreadex' एक' शून्य * 'चाहता है। – dalle

उत्तर

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

बेशक, यह ढेर पर है। आप ढेर पर उसकी आवश्यकता है,

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

प्रश्न सी ++ के बारे में है, इसलिए आप इसके बजाय 'new' के साथ जाना चाहेंगे। – filmor

+0

@ फिल्मर, आप सही हैं। किया हुआ। –

0

समारोह एक बाहर निकलने चरित्र आप पॉल ड्रेपर के जवाब के साथ जाना चाहिए करने के लिए एक स्थिरांक सूचक की उम्मीद है। लेकिन ध्यान रखें कि यह एक शून्य समाप्त स्ट्रिंग के लिए सूचक नहीं है, फ़ंक्शन की अपेक्षा क्या हो सकती है। आप std::string::c_str

f(const char* s); 

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

का उपयोग आप एक सूचक की जरूरत है समाप्त स्ट्रिंग शून्य कर सकते हैं के बाद से आप किसी भी कोड यह पता करने के लिए वास्तव में आप क्या चाहते हैं मुश्किल है नहीं दिखा था, लेकिन यहां एक तरह से एक समारोह के रूप में एक चार की उम्मीद कर कॉल करने के लिए है धागे में एक तर्क। यदि आप तर्क को स्वयं परिवर्तित करने के लिए फ़ंक्शन को नहीं बदल सकते हैं तो आपको ऐसा करने के लिए बीच में बैठने के लिए एक ट्रैम्पोलिन फ़ंक्शन की आवश्यकता होती है और वास्तविक फ़ंक्शन को कॉल किया जाता है।

#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; 
} 
संबंधित मुद्दे