PDA

Visualizza la versione completa : [C++] tchar.h


gianvituzzi
16-02-2010, 15:27
Salve,

non riesco a capire perchè il seguente codice non funziona:



TCHAR marameo[256] = {0};
strncpy(marameo, _T("Hello World!"), 10);


mi ritorna: error C2664: 'strncpy' : cannot convert parameter 1 from 'TCHAR [256]' to 'char *'

Inoltre mi piacerebbe con il seguente codice mostrare le coordinate bottom e right della finestra:



RECT rc;
memset(&rc,0,sizeof(RECT));
GetWindowRect(hDlg, &rc);

char szBottom[5] = {0};
_itoa_s(rc.bottom,szBottom,5,10);

char szRight[5] = {0};
_itoa_s(rc.right,szRight,5,10);

TCHAR marameo[256] = {0};
strncpy(marameo, _T("Bottom: "), 10);
strncpy(marameo, szBottom, 10);
strncpy(marameo, _T(" Right: "), 10);
strncpy(marameo, szRight, 10);

SetWindowText(hDlg, (LPTSTR)marameo);



ma di nuovo ho gli stessi problemi di prima....

oregon
16-02-2010, 15:32
Nelle proprietà di progetto hai impostato Unicode?

gianvituzzi
16-02-2010, 15:34
si: Use Unicode Character Set

MItaly
16-02-2010, 15:40
Se usi i TCHAR devi usare le apposite funzioni generiche per lavorare con essi, nello specifico devi usare la _tcsncpy. Trovi le versioni generiche di ogni funzione in fondo alla loro documentazione su MSDN.
Inoltre, se usi i TCHAR da una parte ti conviene usarli ovunque invece di mischiare char e TCHAR (il che ti espone a bug se fai le cose male o ti costringe ad effettuare continue conversioni se le vuoi fare bene).

oregon
16-02-2010, 15:41
Originariamente inviato da gianvituzzi
si: Use Unicode Character Set

La strncpy no ... :)

Vedi quello che scrive MItaly ...

gianvituzzi
16-02-2010, 15:48
Ok, naturalmente userò la _tcsncpy_s ora però ho un problema, se faccio:



TCHAR marameo[256] = {0};

_tcsncpy_s(marameo, _T("A"),5);
_tcsncpy_s(marameo, _T("B"),5);
_tcsncpy_s(marameo, _T("C"),5);
_tcsncpy_s(marameo, _T("D"),5);


in "marameo" avrò D e non ABCD...devo usare per forza la std::copy?

grazie

MItaly
16-02-2010, 15:52
La _tcsncpy copia una stringa nell'altra; se vuoi concatenare dovrai usare la _tcsncat.
In generale comunque se vuoi fare un favore a te stesso sbarazzati delle stringhe C e usa le stringhe C++: ti risparmierai molti mal di testa e/o bug. Per la questione dei TCHAR, li puoi usare tranquillamente anche con le stringhe C++, dato che sono templatizzate (qui (http://forum.html.it/forum/showthread.php?s=&postid=12832633#post12832633) del codice che ti può aiutare).

gianvituzzi
16-02-2010, 15:57
questa è veramente l'ultima che ti chiedo, infatti dato il seguente codice:



RECT rc;
memset(&rc,0,sizeof(RECT));
GetWindowRect(hDlg, &rc);

TCHAR szBottom[5] = {0};
_itoa_s(rc.bottom,szBottom,5,10);

TCHAR szRight[5] = {0};
_itoa_s(rc.right,szRight,5,10);

TCHAR marameo[256] = {0};
_tcsncat_s(marameo, _T("Bottom: "),10);
_tcsncat_s(marameo, szBottom,10);
_tcsncat_s(marameo, _T(" Width: "),10);
_tcsncat_s(marameo, szRight,10);


mi ritorna:



error C2664: 'errno_t _itoa_s(int,char *,size_t,int)' : cannot convert parameter 2 from 'TCHAR [5]' to 'char *'

:bhò:

oregon
16-02-2010, 16:03
Provo ad indovinare ....

_itot_s

?

gianvituzzi
16-02-2010, 16:07
vi ringrazio, ora me li studio tutti: http://www.koders.com/c/fidC920B03557EFCAA1D3C700F25F1CAAF6ADFE9BB8.aspx

Loading