Visualizzazione dei risultati da 1 a 9 su 9

Discussione: C problemi su LPCTSTR

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331

    C problemi su LPCTSTR

    Ciao, sto letteralmente impazzendo a cercare di capire come eseguire operazioni di base su stringhe definite come LPCTSTR.
    Funzioni come strlen e strcmp funzionano senza problemi, altre come strcat invece mi danno errore un "access violation".
    Come diamine devo fare a concatenare due LPCTSTR?

    Ciao
    Grazie
    Sandro

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cioè? Cosa scrivi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Una LPCTSTR è un const TCHAR * (leggi qui), per cui non puoi modificarla... Inoltre, a seconda delle impostazioni Unicode a livello di progetto i TCHAR sono o char o wchar_t, e in base a questo devi usare un set diverso di funzioni per lavorarci su (o, meglio, usare le macro generiche). Leggi qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Grazie a tutti.

    Alla fine ho risolto in modo simile a questo:

    codice:
    LPCTSTR l1 = "str1";
    LPCTSTR l2 = "str2";
    
    char s[256] = "";
    
    strcat(s, (const char *)l1);
    strcat(s, (const char *)l2);
    
    LPCTSTR final = s;
    Poco intuitivo però funziona!
    Quando dava errore passavo gli LPCTSTR anche nel primo parametro della strcat.

  5. #5
    Originariamente inviato da DarthSandr
    Grazie a tutti.

    Alla fine ho risolto in modo simile a questo:

    codice:
    LPCTSTR l1 = "str1";
    LPCTSTR l2 = "str2";
    
    char s[256] = "";
    
    strcat(s, (const char *)l1);
    strcat(s, (const char *)l2);
    
    LPCTSTR final = s;
    No buono... quel cast a (const char *) "a pedate" è una pessima idea, dato che, se il tuo progetto viene compilato in modalità Unicode, ti nasconde un errore fondamentale (ovvero, staresti passando un const wchar_t * ad una funzione che si aspetta un const char *).
    In generale, se usi le LP(C)TSTR, devi usare i generic text mappings dappertutto:
    codice:
    LPCTSTR l1 = _T("str1");
    LPCTSTR l2 = _T("str2");
    
    TCHAR s[256] = "";
    
    _tcscat(s, l1);
    _tcscat(s, l2);
    
    LPCTSTR final = s;
    Rileggi il secondo link del mio post precedente.
    Quando dava errore passavo gli LPCTSTR anche nel primo parametro della strcat.
    Che ovviamente non funziona, visto che è una stringa costante.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Adesso provo, grazie.

    Domanda: funziona anche se il progetto è settato con

    Compile As C Code (/TC) ?

    Per ora lo sto provando nella modalità C++ ma dovrò poi usarlo anche in quella C.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Esiste un'equivalente di quest'inizializzazione

    codice:
     TCHAR s[256] = ""
    Fatta in due tempi.
    Ovvero, prima dichiaro TCHAR s[256] e poi lo inizializzo.
    Io ho provato s = ""; e s = _T(""); e mi da errore in compilazione.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    codice:
    	TCHAR s[256];
    
    	memset(s, 0, sizeof(TCHAR));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    codice:
    TCHAR s[256] = _T("");
    dovrebbe essere corretto.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.