1

コンピューター制御のポンプにシリアルポート通信を行っています。通信に使用したcreatefile関数では、comポート名をwchar_tポインターとして解析する必要があります。

また、QTを使用してフォームを作成し、COMポート名をQStringとして取得しています。

このQStringはchar配列に変換され、次のように示されます。

   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;
   }

したがって、char *(mychar)をwchar_t *(portNumber)に変更するにはどうすればよいですか?

ありがとう。

4

5 に答える 5

5

wchar_t 配列に char 配列が必要なだけの場合は、次の解決策があります。

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;
}
于 2011-03-31T17:24:24.983 に答える
1

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;
}

バイトごとに長さを返す strlen とは異なり、unistrlen は文字列内の文字数 (シングルまたはマルチバイト文字) を返し、文字列にマルチバイト文字が含まれている場合はメモリを浪費する可能性があります。

于 2017-01-03T09:48:19.283 に答える
0

toWCharArrayの関数を使用しQStringてwchar_t*値を取得し、関数からwchar_t*を返すことができますGetPumpSerialPortNumber

于 2010-09-15T09:27:14.980 に答える
0

MSDN で役立つ記事を見つけました - How to: Convert Between Various String Types。私はそれが役に立つはずだと思います。

于 2011-08-31T06:49:19.413 に答える
-1

QString::toWCharArray ( wchar_t * array )

于 2010-09-15T09:24:39.603 に答える