2010-09-15 3 views
1

Я делаю передачу данных по последовательному порту на насос с компьютерным управлением, а функция createfile, которую я использовал для связи, требует, чтобы имя com-порта обрабатывалось как указатель wchar_t.Нужно преобразовать char * (pointer) в wchar_t * (pointer)

Я также использую QT для создания формы и получения имени COM-порта в качестве QString.

Этот QString преобразуется в массив символов и указал на следующее:

char* Dialog::GetPumpSerialPortNumber(){ 
    QString mystring; 
    mystring = ui->comboBox_2->currentText(); 
    char * mychar; 
    mychar = mystring.toLatin1().data(); 
    return mychar; 

мне теперь нужно установить мой номер порта, который хранится в wchar_t * в моем объекте насоса. Я делаю это с помощью вызова следующей функции:

void pump::setPortNumber(wchar_t* portNumber){ 
     this->portNumber = portNumber; 
    } 

Таким образом, как я могу изменить символ * (MyChar) в wchar_t * (Portnumber)?

Спасибо.

+2

У вас есть потенциальная проблема с памятью с вашей функцией, она возвращает указатель на память внутри временной переменной (результат toLatin1()); –

ответ

-1
+0

Я, очевидно, что-то не так сделал свой код: wchar_t * Dialog :: GetPumpSerialPortNumber() { QString mystring; mystring = ui-> comboBox_2-> currentText(); wchar_t * mycharPointer; wchar_t mychar [mystring.size()]; mychar [mystring.size() - 1] = '\ n'; mystring.toWCharArray (mychar); mycharPointer = mychar; cout << * mycharPointer; return mycharPointer; } , похоже, возвращает адрес, а не массив символов, на «COM6» – Zac

0

Вы можете использовать функцию toWCharArrayQString, чтобы иметь значение wchar_t * и вернуть wchar_t * из вашей функции GetPumpSerialPortNumber.

4

Если вы говорите только нуждаясь в массив символов в wchar_t массива, вот для вас решение:

static wchar_t* charToWChar(const char* text) 
{ 
    size_t size = strlen(text) + 1; 
    wchar_t* wa = new wchar_t[size]; 
    mbstowcs(wa,text,size); 
    return wa; 
} 
+0

mbstowcs довольно устарел .. но он работает. BTW Я нашел хорошую статью MSDN, которая показывает преобразование между различными строками. Посмотрите на мой ответ для подробностей. – RredCat

+0

, но это может привести к потере некоторой памяти, поскольку strlen будет считать байты байт байтом, а не сколько wchars вам понадобится. Проверьте мой ответ и исправьте меня, если я ошибаюсь, поскольку я новичок в этой теме. – Naheel

+0

@Naheel Предполагает, что char * содержит широкие символы. Если char * - это просто строка символов ascii, которые не заполняются для строки wchar, и вы хотите, чтобы это было, тогда это то, что вы будете использовать. Если вы хотите получить длину строки wchar, вы должны использовать wcslen вместо того, чтобы кататься самостоятельно. – leetNightshade

0

Усовершенствование ответа leetNightshade мог быть

size_t unistrlen(const char *s) { 
    size_t sz = 0; 
    const char *sc; 
    for (sc = s; *sc != '\0'; sc+=(
     ((*sc&0x80)==0x80) ? 2 :/*1st byte of 2-byte character*/ 
     ((*sc&0xc0)==0xc0) ? 3 :/*1st byte of 3-byte character*/ 
     ((*sc&0xe0)==0xe0) ? 4 :/*1st byte of 4-byte character*/ 
     ((*sc&0xf0)==0xf0) ? 1 :/*2nd, 3rd, or 4th byte of multi-byte character*/ 
          1) /*single byte character*/) 
     if ((*sc&0xf0)!=0xf0) sz++; 
    return sz; 
} 

wchar_t* charToWChar(const char* text) { 
    size_t size = unistrlen(text) + 1; 
    wchar_t* wa = new wchar_t[size]; 
    mbstowcs(wa,text,size); 
    return wa; 
} 

Где unistrlen вернет количество символов (одного или несколько символов байт) в строке, в отличии от STRLEN, которая возвращает длину побайтна и что может тратить некоторое количество памяти если ваша строка содержит несколько многобайтовых символов.