2010-09-15 9 views
1

Je réalise une communication par port série vers une pompe commandée par ordinateur et la fonction createfile que je communiquais nécessite que le nom du port COM soit analysé comme un pointeur wchar_t. J'utilise également QT pour créer un formulaire et acquérir le nom du port COM en tant que QString.Besoin de convertir char * (pointeur) en wchar_t * (pointeur)

Ce QString est converti en un tableau de caractères et souligné comme suit:

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

je maintenant besoin de mettre mon numéro de port qui est stocké comme wchar_t * dans mon objet de la pompe. Je le fais en appelant la fonction suivante:

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

Alors, comment puis-je changer mon char * (MyChar) dans un wchar_t * (portNumber)?

Merci.

+2

Vous avez un problème de mémoire potentiel avec votre fonction, il renvoie un pointeur vers la mémoire à l'intérieur d'une variable temporaire (le résultat de toLatin1()); –

Répondre

-1
+0

Je fais clairement quelque chose de mal mon code: wchar_t * Dialog :: GetPumpSerialPortNumber() { QString mystring; mystring = ui-> comboBox_2-> currentText(); wchar_t * moncharPointer; wchar_t mychar [mystring.size()]; mychar [mystring.size() - 1] = '\ n'; mystring.toWCharArray (mychar); mycharPointer = mychar; cout << * mycharPointer; return mycharPointer; } semble retourner une adresse plutôt que le tableau char à "COM6" – Zac

0

Vous pouvez utiliser la fonction toWCharArray de QString pour avoir votre valeur wchar_t * et retourner un wchar_t * à partir de votre fonction GetPumpSerialPortNumber.

4

Si vous parlez juste besoin d'un tableau de caractères à un tableau wchar_t, voici une solution pour vous:

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 est tout à fait obsolète .. mais cela fonctionne. BTW J'ai trouvé un bel article MSDN qui montre la conversion entre différentes chaînes. Regardez ma réponse pour les détails .. – RredCat

+0

mais cela pourrait perdre de la mémoire car strlen comptera le nombre de caractères par octet et non le nombre de wchar dont vous aurez besoin. Vérifiez ma réponse et corrigez-moi si je me trompe car je suis nouveau sur ce sujet. – Naheel

+0

@Naheel Cela suppose que le caractère * contient des caractères larges. Si le caractère * est simplement une chaîne de caractères ascii qui n'est pas complétée pour une chaîne wchar et que vous voulez qu'elle soit, alors c'est ce que vous utiliseriez. Si vous voulez obtenir la longueur d'une chaîne wchar, vous devez utiliser wcslen au lieu de lancer la vôtre. – leetNightshade

0

une amélioration de la réponse de leetNightshade pourrait être

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

Où unistrlen retournera le nombre de caractères (simples ou caractères multi octets) dans votre chaîne contrairement strlen qui retourne l'octet de longueur par octet et qui pourraient perdre un peu de mémoire si votre chaîne contient des caractères multi-octets.

Questions connexes