Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 25
  1. #11
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Originariamente inviato da stefanoB
    mentre utilizzare la macro TEXT, che però non riesco ad includere winnt.h (ho questo messaggio #include expects "FILENAME" or <FILENAME>) eviterebbe il cast const wchar_t* ???

    codice:
    wcscpy(txt,(TEXT)"Titolo test: ");
    ho sbagliato:

    codice:
    #include <tchar.h>
    
    
    wcscpy(txt,TEXT("Titolo test: ")); 
    
    oppure
    wcscpy(txt,_T("Titolo test: "));

  2. #12
    Allora:
    • questo
      codice:
      #if !defined( UNICODE )
        #define UNICODE
      #endif
      generalmente non serve, dovresti impostare l'utilizzo di Unicode nelle proprietà del progetto (che compilatore/IDE usi?).
    • se imposti il progetto per essere solo Unicode non hai bisogno di tchar.h e delle macro TEXT e _T; ti basta semplicemente fare così:
      codice:
      wcscpy(txt,L"Titolo test: ");
      ; la L fa sì che "Titolo test:" venga intesa come una stringa Unicode (const wchar *).
    • se invece vuoi impostare il progetto per essere compilabile sia in ANSI che in Unicode, usa tchar.h, la macro _T e le funzioni generiche:
      codice:
      _tcscpy(txt,_T("Titolo test: "));
      .
      Questo fa in modo che se UNICODE è definito il codice verrà espanso come
      codice:
      wcscpy(txt,L"Titolo test: ");
      , altrimenti come
      codice:
      strcpy(txt,"Titolo test: ");
      ; per ulteriori informazioni sui generic text mappings dai un'occhiata qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #13
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    in vista wcscopy non funzica ???!!!! :master:

    1)
    creato un nuovo progetto GUI ed impostato come UNICODE, ma c'è qualcosa che non va:

    codice:
    wchar_t *txt;
    wcscpy(txt,L"prova unicode");
    da prima in compilazione error: expected constructor, destructor, o type conversion before '(' token


    2)
    creato un progetto console compila ma poi in esecuzione si pianta (errore segmentation)

    in altro progetto Gui (era console trasformato in GUI) compila ma da questo errore:
    codice:
    Management.exe caused an Access Violation at location 76f1fc37 in module msvcrt.dll Writing to location 00000000.
    
    Registers:
    eax=00007270 ebx=00000000 ecx=00000000 edx=004380e0 esi=00000110 edi=00000000
    eip=76f1fc37 esp=0022f0b4 ebp=0022f0b4 iopl=0         nv up ei pl nz ac pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010212
    
    Call stack:
    76F1FC37  msvcrt.dll:76F1FC37  wcscpy
    00401E5A  Management.exe:00401E5A  _Z6InitCbP6HWND  ctrlfunction.cpp:28
    0040C693  Management.exe:0040C693  _Z11Dlg_ricercaP6HWND__jjl  dlg_ricerca.cpp:30
    779B1A10  USER32.dll:779B1A10  GetMessageW
    7799F203  USER32.dll:7799F203  SetWindowRgn
    
    ...
    anche con:
    codice:
    wsprintf((LPTSTR)txt,"%s",(LPCTSTR)"prova unicode 2");
    3) wstring

    codice:
    std::wstring tmp(L"stringa prova");
    se tento di appendere o concaternare: expected constructor, destructor, o type conversion before '('


  4. #14
    Originariamente inviato da stefanoB
    in vista wcscopy non funzica ???!!!! :master:

    1)
    creato un nuovo progetto GUI ed impostato come UNICODE, ma c'è qualcosa che non va:

    codice:
    wchar_t *txt;
    wcscpy(txt,L"prova unicode");
    da prima in compilazione error: expected constructor, destructor, o type conversion before '(' token
    A parte che c'è un errore logico (vedi dopo), hai incluso string.h?

    2)
    creato un progetto console compila ma poi in esecuzione si pianta (errore segmentation)
    Ovvio, stai tentando di scrivere su un'area di memoria sconosciuta (txt è un puntatore non inizializzato!).
    [code]
    in altro progetto Gui (era console trasformato in GUI) compila ma da questo errore:
    anche con:
    codice:
    wsprintf((LPTSTR)txt,"%s",(LPCTSTR)"prova unicode 2");
    Stesso errore, e in più ti sei dimenticato tutte le L:
    codice:
    wsprintf(txt,L"%s",L"prova unicode 2");
    .
    Inoltre, a parte il fatto che qui tutti quei cast non servivano, se stai lavorando solo in Unicode non devi usare LPTSTR e LPCTSTR, ma LPWSTR e LPCWSTR. Per capire quando usarle, è fondamentale capirne la "grammatica" e il significato:
    codice:
    LP[C][T|W]STR
    LP = puntatore (teoricamente basterebbe P, L è un relitto dei tempi dei 16 bit)
    C = se c'è significa che è costante
    W = se c'è significa che è una stringa Unicode (basata su wchar_t)
    T = se c'è significa che è una stringa TCHAR (ANSI o Unicode a seconda di come è impostata la macro _UNICODE)
    se non c'è ne W né T la stringa è ANSI
    STR = stringa
    
    Quindi:
    LPSTR		char *
    LPCSTR		const char *
    LPTSTR		TCHAR *
    LPCTSTR		const TCHAR *
    LPWSTR		wchar_t *
    LPCWSTR		const wchar_t *
    3) wstring

    codice:
    std::wstring tmp(L"stringa prova");
    se tento di appendere o concaternare: expected constructor, destructor, o type conversion before '('
    Mostra il codice con cui cerchi di concatenare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #15
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    [QUOTE]Ovvio, stai tentando di scrivere su un'area di memoria sconosciuta (txt è un puntatore non inizializzato!).

    questo era un test per capire i funzionamenti delle stringhe unicode, e txt è una variabile puntatore definita in WM_CREATE, ma non credo sia questo perchè provandola a definire anche global stesso risultato;

    si string.h è incluso come base dall'ide

    ho provato con:

    codice:
    wchar_t *txt=NULL;
    
    wchar_t *txt;=new wchar_t*();
    
    wsprintf(txt,L"%s",L"Managemente Unicode");
    che lo inizializzi o meno presenta sempre lo stesso problema:

    codice:
    Management.exe caused an Access Violation at location 776d1375 in module USER32.dll Writing to location 00000001.
    
    Registers:
    eax=00000012 ebx=0000000a ecx=004192a0 edx=0000004d esi=00000001 edi=00000000
    eip=776d1375 esp=0022f48c ebp=0022f4d8 iopl=0         nv up ei pl nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
    
    Call stack:
    776D1375  USER32.dll:776D1375  DialogBoxParamW
    776A61D1  USER32.dll:776A61D1  wsprintfW
    00402530  Management.exe:00402530
    776C1A10  USER32.dll:776C1A10  GetMessageW


    Inoltre, a parte il fatto che qui tutti quei cast non servivano, se stai lavorando solo in Unicode non devi usare LPTSTR e LPCTSTR, ma LPWSTR e LPCWSTR.
    in primo ti ringrazio per i precedenti approfondimenti!
    l'uso dei cast era dato dal fatto che anche se avevo creato un progetto test Unicode se non utilizzavo i cast non erano interpretate come stringhe unicode, questo perà lavorando in codeblock 8.02 mingw 3.4.5; in Dev non ho necessità di castare.

    toglimi questo dubbio:

    LPTSTR in win 32 SDK è definito così ... "Pointer to a null-terminated Windows or Unicode character string."
    visto questo pensavo andasse bene !?!


    Attualmente ho creato nuovo progetto c++ Unicode e conversione file Ansi in dev-c++ 4.9.9.2 mingw 3.4.2 in Vista

    usando vocali accentate ... se non le uso non ho problemi

    codice:
    wchar_t **Imenu=new wchar_t *[31]; 
    
    ...
    Imenu[2]=L"Città";
    
    
    C:\Dev-Cpp\Progetti\ManagementXpVista\Makefile.win [Build Error] n\make.exe: *** [obj/struct.o] Error 1 
    
    struct.cpp:33:47: converting to execution character set: Invalid argument
    non è un carattere "strano" comunque supportato da unicode, perchè ciò che c'è che non va?

  6. #16
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Ovvio, stai tentando di scrivere su un'area di memoria sconosciuta (txt è un puntatore non inizializzato!).
    questo era un test per capire i funzionamenti delle stringhe unicode, e txt è una variabile puntatore definita in WM_CREATE,
    ma non credo sia questo perchè provandola a definire anche global stesso risultato;

    si string.h è incluso come base dall'ide


    ho provato con:

    codice:
    wchar_t *txt=NULL;
    
    wchar_t *txt;=new wchar_t*();
    
    wsprintf(txt,L"%s",L"Managemente Unicode");
    che lo inizializzi o meno presenta sempre lo stesso problema:

    codice:
    Management.exe caused an Access Violation at location 776d1375 in module USER32.dll Writing to location 00000001.
    
    Registers:
    eax=00000012 ebx=0000000a ecx=004192a0 edx=0000004d esi=00000001 edi=00000000
    eip=776d1375 esp=0022f48c ebp=0022f4d8 iopl=0         nv up ei pl nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
    
    Call stack:
    776D1375  USER32.dll:776D1375  DialogBoxParamW
    776A61D1  USER32.dll:776A61D1  wsprintfW
    00402530  Management.exe:00402530
    776C1A10  USER32.dll:776C1A10  GetMessageW


    Inoltre, a parte il fatto che qui tutti quei cast non servivano, se stai lavorando solo in Unicode non devi usare LPTSTR e LPCTSTR, ma LPWSTR e LPCWSTR.
    in primo ti ringrazio per i precedenti approfondimenti!
    l'uso dei cast era dato dal fatto che anche se avevo creato un progetto test Unicode se non utilizzavo i cast non erano interpretate come stringhe unicode, questo perà lavorando in codeblock 8.02 mingw 3.4.5; in Dev non ho necessità di castare.

    toglimi questo dubbio:

    LPTSTR in win 32 SDK è definito così ... "Pointer to a null-terminated Windows or Unicode character string."

    visto questo pensavo andasse bene !?!

    Attualmente ho creato nuovo progetto c++ Unicode e converto i file Ansi in dev-c++ 4.9.9.2 mingw 3.4.2 in Vista

    #usando vocali accentate ... se non le uso non ho problemi

    codice:
    wchar_t **Imenu=new wchar_t *[31]; 
    
    ...
    Imenu[2]=L"Città";
    
    
    C:\Dev-Cpp\Progetti\ManagementXpVista\Makefile.win [Build Error] n\make.exe: *** [obj/struct.o] Error 1 
    
    struct.cpp:33:47: converting to execution character set: Invalid argument

    non è un carattere "strano" comunque supportato da unicode, perchè ciò che c'è che non va?

  7. #17
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma in questo codice

    wchar_t *txt=NULL;

    wchar_t *txt;=new wchar_t*();

    wsprintf(txt,L"%s",L"Managemente Unicode");
    cosa vuol dire la seconda riga (con quel ; prima di = ?) e perche' dichiari e inizializzi due volte la stessa variabile?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #18
    Originariamente inviato da stefanoB
    questo era un test per capire i funzionamenti delle stringhe unicode, e txt è una variabile puntatore definita in WM_CREATE,
    ma non credo sia questo perchè provandola a definire anche global stesso risultato;

    si string.h è incluso come base dall'ide


    ho provato con:

    codice:
    wchar_t *txt=NULL;
    
    wchar_t *txt;=new wchar_t*();
    
    wsprintf(txt,L"%s",L"Managemente Unicode");
    che lo inizializzi o meno presenta sempre lo stesso problema:
    Questa riga
    codice:
    wchar_t *txt;=new wchar_t*();
    non ha nessun senso. Il codice corretto è
    codice:
    wchar_t * txt = new wchar_t[256]; //alloca una stringa Unicode di 256 caratteri nell'heap
    //...
    delete[] txt;
    ; se le dimensioni sono fisse fai anche prima a scrivere
    codice:
    wchar_t txt[256]; //alloca una stringa Unicode di 256 caratteri sullo stack
    .
    Ma qui non è una faccenda di Unicode, sono rudimenti di C++, queste considerazioni valgono ugualmente sia per caratteri ANSI (char) che per Unicode (wchar_t), nonché per qualunque array stile C in genere!
    in primo ti ringrazio per i precedenti approfondimenti!
    l'uso dei cast era dato dal fatto che anche se avevo creato un progetto test Unicode se non utilizzavo i cast non erano interpretate come stringhe unicode, questo perà lavorando in codeblock 8.02 mingw 3.4.5; in Dev non ho necessità di castare.
    Anche DevC++ usa MinGW, il problema era che non mettevi le "L" davanti alle stringhe; tra l'altro forzando il cast di una stringa ANSI (char *) ad Unicode (wchar_t *) ottenevi delle stringhe Unicode potenzialmente senza senso.
    toglimi questo dubbio:

    LPTSTR in win 32 SDK è definito così ... "Pointer to a null-terminated Windows or Unicode character string."

    visto questo pensavo andasse bene !?!
    Se lavori solo in Unicode, usi LPWSTR ("Pointer to a null-terminated Unicode character string."). LPTSTR serve per poter compilare nei due modi differenti (ANSI e Unicode), come spiegato nel link che ti ho postato in precedenza.
    #usando vocali accentate ... se non le uso non ho problemi

    codice:
    wchar_t **Imenu=new wchar_t *[31]; 
    
    ...
    Imenu[2]=L"Città";
    
    
    C:\Dev-Cpp\Progetti\ManagementXpVista\Makefile.win [Build Error] n\make.exe: *** [obj/struct.o] Error 1 
    
    struct.cpp:33:47: converting to execution character set: Invalid argument

    non è un carattere "strano" comunque supportato da unicode, perchè ciò che c'è che non va?
    Si tratta di un bug di gcc (link); prova a salvare il file come UTF8.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #19
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Originariamente inviato da MItaly
    Questa riga
    codice:
    wchar_t *txt;=new wchar_t*();
    non ha nessun senso.


    codice:
    wchar_t *txt=NULL;
    
    wchar_t *txt;=new wchar_t*();
    
    wsprintf(txt,L"%s",L"Managemente Unicode");
    cosa vuol dire la seconda riga (con quel ; prima di = ?) e perche' dichiari e inizializzi due volte la stessa variabile?

    scusatemi ma nella fretta ..., qui intendevo due dichiarazioni distinte non contemporanee:

    codice:
    1.  wchar_t *txt=NULL;
    
    oppure
    
    2.  wchar_t *txt=new wchar_t*();     //senza ;
    ok per le altre spiegazioni ...

  10. #20
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Originariamente inviato da MItaly
    Un paio di appunti:
    • usa Unicode (imposta il progetto per l'uso di Unicode e non usare char ma wchar_t, non string ma wstring);
    • per il passaggio di dati al momento della creazione di un dialog non usare variabili globali, ma sfrutta piuttosto la funzione DialogBoxParam.
    per completezza rispondo qui, ma credo sia il caso aprire una nuova discussione.

    Si, per le dialog utilizzo DialogBox/... Param, ma per le embedded questo non è possibile.

    Ho finito di trasformare il progetto da ansi ad Unicode ... lo fatto con Dev 4.9.9.9.2 Mingw 3.4.2 in vista qui gira bene, non ha problemi!

    mentre facendo girare l'applicazione in Xp home sp2 da diversi problemi, strani es.:
    - inserimento elementi di un Listview
    - chiusura di window mdi
    - return DefMdiChildProc()


    installato Dev in Xp e ricompilato il progetto, con le stesse configurazioni di compilazione e link manifesta gli stessi
    problemi di cui non mi capacito


    ... come è possibile??? :master:

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.