Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]db e LPSTR == ""

    ciao.
    ho il seguente codice:
    codice:
    UpdateData(FALSE);
    
    	ConnectProfileDb();
    
    	CADOTable RsProfili;
    	CString strSql= "SELECT * from Profili";
    	m_db.Execute(strSql.GetBuffer(20),RsProfili);
    
    	LPSTR chrOldType = new TCHAR[50];LPSTR chrType = new TCHAR[50];
    
    	chrOldType = "";
    	while(!RsProfili.ISEOF()){
    		 
    		RsProfili.Get("Tipo", chrType);
    		
    		TVINSERTSTRUCT tvTypeInsert;
    		tvTypeInsert.hParent = NULL;
    		tvTypeInsert.hInsertAfter = NULL;
    		tvTypeInsert.item.mask = TVIF_TEXT;
    		
    		tvTypeInsert.item.pszText = chrType;
    		 
    	
    		HTREEITEM hType = m_TreeSections.InsertItem(&tvTypeInsert);
    
    		while(!strcmp(chrOldType, chrType)|| !strcmp(chrOldType,""))
    		{
    			TVINSERTSTRUCT tvDesign;
    			tvDesign.hParent = hType;
    			tvDesign.hInsertAfter = NULL;
    			tvDesign.item.mask = TVIF_TEXT;
    
    			LPSTR chrDes = new TCHAR[50]; 
    			
    			RsProfili.Get("Designazione", chrDes);
    			RsProfili.Get("Tipo", chrOldType);
    			
    			tvDesign.item.pszText = chrDes;
    
    			HTREEITEM hDes = m_TreeSections.InsertItem(&tvDesign);
    			RsProfili.MoveNext();
    		}
    	}
    	UpdateData(TRUE);
    devo capire come vanno inizializzati i tipi LPSTR in mfc , vorei fare un buon lavoro e voglio prima capire(i memory leak li sistemo poi):
    Conosco la diffferenza tra tchar Cstring, LPSTR ,se le inizializzo con il new TCHAR[xx] è tutto ok , solo che se le setto a "" non riesco piu a prendere il valore dal recordset ado, penso per il problema delle stringhe 0 terminate , ma non ne sono sicuro .
    Mi interessserebbe inizializzare le variabili a "" per riconoscere la prima volta , ad es qui:
    !strcmp(chrOldType,"")
    dopo la prima leggo un valore dal recordset, e devo poter leggere i valori successivi.

    se per es faccio questo:
    codice:
        chrOldType =""
        RsProfili.Get("Tipo", chrOldType);
    si pianta.
    perchè?

    grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    inoltre , quando cancellare i puntatori?
    dopo averli cancellati vanno ricreati?
    o c'è il modo di usare sempre quelli?
    grazie

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Le stringhe C sono molto diverse da quelle di altri linguaggi, per utilizzarle devi prima studiare bene i puntatori.
    Altrimenti viene spontaneo scrivere
    codice:
    chrOldType =""
    ma purtroppo in C ha un significato completamente diverso da quello che uno si aspetta.

    Puoi provare ad utilizzare delle classi che permettono di lavorare con le stringhe come negli altri linguaggi di programmazione, ad esempio std::string o CString. Tutte due le classi hanno un metodo per convertirle in stile C nel momento del bisogno.

  4. #4
    Originariamente inviato da giuseppe500
    inoltre , quando cancellare i puntatori?
    dopo averli cancellati vanno ricreati?
    o c'è il modo di usare sempre quelli?
    grazie
    Quando fai un delete non cancelli il puntatore ma l'oggetto a cui punta. Quindi il puntatore continua a contenere l'indirizzo di memoria che aveva prima dell'operazione (e qui sorgono i problemi!). Quindi si, puoi riutilizzare lo stesso puntatore per altri scopi. Se non lo riutilizzi, io per sicurezza dopo delete azzero sempre il puntatore:
    codice:
    delete ptr;
    ptr = 0;
    // oppure
    ptr = NULL;
    // o, meglio ancora, in C++11
    ptr = nullptr;
    Comunque anche io utilizzerei std::string e lascerei perdere le stringhe alla C!
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  5. #5
    LPSTR è semplicemente un typedef per char * (o wchar_t * se compili in modalità Unicode), per cui valgono tutte le usuali regole delle stringhe C. Il tipo stringa delle MFC è CString.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]c char*

    ciao.
    E' 5 anni che lavoro in c++ e non ho ancora capito le stringhe tipo c , di solito usavo std::string , ma il mio capo non le vuole e quindi...

    Ho un controllo ctreectrl in c++ mfc.
    Devo recuperare delle LPSTR dal db e assegnarle ai varie proprietà lpstr dei controlli mfc.
    Recuperate le stringhe le ho recuperate e assegnate, solo che non so come e quando cancellarle.
    per es:
    codice:
        LPSTR des = new TCHAR[299];//alloco un po di spazio per il puntatore
        RsProfili.Get("designazione", des);//leggo la stringa dal db
        tvRootInsert.item.pszText = des;//assegno la stringa c al item di un controllo ad albero
        //problema : quando cancellare lo spazio allocato???????? des?
    e cosi via per tutti i controlli mfc , quando assegno una proprietà non viene automaticamente cancellata dal controllo, quindi?
    creare una copia non puntatore?

    grazie.

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Usi strcpy al posto dell'assegnazione! Si trova in cstring alias string.h
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Sicuramente dopo l'inserimento dell'elemento, ma verifica la documentazione della funzione di inserimento per verificare se per caso la stringa non viene copiata ma viene semplicemente trasferita la "proprietà" della memoria della stringa al controllo treeview.

    In ogni caso, non puoi programmare in C++ e non saper usare le stringhe C.
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.