Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [Api win32] cannot convert parameter 2 from 'std::string' to 'char *'

    Ciao a tutti,
    devo inserire i campi di un file txt con delimitatore in una listview.
    Il cocice che uso é:

    codice:
    int GetItems()
    {
     char buf[BUFSIZ];
    int i=0;
     
    string strRem;
    string strCombo1;
    string strDate;
    string strTime;
    string strStatus;
    
      if ((fp = fopen("file.txt", "r")) == NULL)
      {
        perror ("file.txt");
        return (EXIT_FAILURE);
      }
      
     
      ifstream file ( "file.txt" ); // declare file stream: http://www.cplusplus.com/reference/iostream/ifstream/
    string value;
     while (fgets(buf, sizeof(buf), fp) != NULL)
      {
    while ( file.good() )
    { for (int i=0 ; i<5 ; i++) {
         getline ( file, value, '|');
    	
        
    
    
    	 
    			 strRem=string( value, 0, value.length());
    			 
    			
    			 strCombo1=string( value, 0, value.length());
    		
    			 strDate=string( value, 0, value.length());
    			 
    			 strTime=string( value, 0, value.length());
    			 
    			 strStatus=string( value, 0, value.length());
    			 
    			 
    	
      
    }
    }
    
    InsertRow(hWndListView,strRem,strCombo1,strDate ,strTime,strStatus);
    
        i++;
      }
    return(0);	
    }
    La funzione InsertRow ha i parametri del tipo *char:

    codice:
    void InsertRow (const HWND hWnd, char *col1, char *col2, char *col3, char *col4,char *col5)
    {
    	LV_ITEM		lvItem;
    
    	lvItem.mask = 0;
    	lvItem.iItem = 0;
    	lvItem.iSubItem = 0;
    	lvItem.iItem = ListView_InsertItem (hWnd, &lvItem);
    	
    	lvItem.mask = LVIF_TEXT;
    	lvItem.pszText = col1;
    	lvItem.cchTextMax = strlen (lvItem.pszText);
    	ListView_SetItem (hWnd, &lvItem);
    
    	lvItem.iSubItem = 1;
    	lvItem.pszText = col2;
    	lvItem.cchTextMax = strlen (lvItem.pszText);
    	ListView_SetItem (hWnd, &lvItem);
        
    	lvItem.iSubItem = 2;
    	lvItem.pszText = col3;
    	lvItem.cchTextMax = strlen (lvItem.pszText);
    	ListView_SetItem (hWnd, &lvItem);
        
    	lvItem.iSubItem = 3;
    	lvItem.pszText = col4;
    	lvItem.cchTextMax = strlen (lvItem.pszText);
    	ListView_SetItem (hWnd, &lvItem);
        
    	lvItem.iSubItem = 4;
    	lvItem.pszText = col5;
    	lvItem.cchTextMax = strlen (lvItem.pszText);
    	ListView_SetItem (hWnd, &lvItem);
    }
    Tutto funziona bene fino a quando non cerco di inserire i campi nella listview. Ho fatto delle ricerche ma purtroppo il compilatore non mi accetta la conversione da string a *char.
    Come posso risolvere?
    Grazie.
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [Api win32] cannot convert parameter 2 from 'std::string' to 'char *'

    Originariamente inviato da giorgiogio48
    Ho fatto delle ricerche ...
    Non devi fare delle ricerche ma studiare bene la classe

    string

    che utilizzi. E vedrai che esiste il metodo

    c_str()

    che serve allo scopo. Passerai i parametri usando

    strRem.c_str()

    e similmente per gli altri
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ciao Oregon,
    grazie per la risposta. Ho modificato la riga così:

    codice:
    InsertRow(hWndListView,strRem.c_str(),strCombo1.c_str(),strDate.c_str()  ,strTime.c_str(),strStatus.c_str ());
    ma ora mi dà l'errore "cannot convert parameter 2 from 'const char *' to 'char *'".
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

  4. #4
    c_str() restituisce un const char * perché la stringa C restituita punta ad un buffer interno di sola lettura, ma i parametri della tua funzione sono dichiarati (inutilmente) come char * invece che come const char *.
    Dovresti abituarti a specificare sempre const nei parametri puntatori e reference delle funzioni quando queste non hanno ragione di modificarli: questo ti consente di rendere più chiaro quali parametri sono di input e quali di output e di usare comodamente puntatori costanti ottenuti da altre funzioni.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Ciao Mytaly,
    con i suggerimento tuo mi da ora l'errore "cannot convert from 'const char *' to 'LPSTR'"
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ciao

    prova:


    codice:
    string s;
    s = "ciao";
    MessageBox(NULL,(char *) s.c_str(),"Esempio",0);
    sarebbe preferibile scrivere al posto di char* TCHAR * //include<tchar.h>

    ricorda che se usi visual studio 2010 potresti aver bisogno se non usi TCHAR e TEXT()
    di premere alt+F7 e su opzioni mettere multy byte charatter set.


    avevo anche un altro metodo più funzionale ma adesso non mi viene propio in mente.... te lo dirò se me lo ricorderò...

  7. #7

    Re: ciao

    Originariamente inviato da giorgiogio48
    Ciao Mytaly,
    con i suggerimento tuo mi da ora l'errore "cannot convert from 'const char *' to 'LPSTR'"
    Il problema è che nella struttura il membro pszText è dichiarato come LPTSTR e non come LPCTSTR (poiché la struttura in questione è usata anche per scopi per cui è necessario che il puntatore in questione non sia const).
    In questo caso comunque credo che sia sicuro semplicemente effettuare un const_cast per rimuovere il const dal puntatore nel momento in cui lo assegni a pszText; l'alternativa è creare un buffer temporaneo e copiare lì il contenuto della stringa.

    Originariamente inviato da kirakira93
    prova:


    codice:
    string s;
    s = "ciao";
    MessageBox(NULL,(char *) s.c_str(),"Esempio",0);
    sarebbe preferibile scrivere al posto di char* TCHAR * //include<tchar.h>
    Questo se anche s fosse una stringa basata su TCHAR, ma dato che è dichiarata come string sarà sempre e comunque un char *. Se si volessero fare le cose per bene, bisognerebbe definire un tipo tstring come std::basic_string<TCHAR> e usare quello invece di string; a quel punto c_str() restituirebbe effettivamente un const TCHAR *.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    si

    si in effetti hai ragione su quest'ultimo punto....
    forse allora col buffer temporaneo.

    una cosa del genere:

    codice:
    tstring tsS;
    const TCHAR * tcBuffer; //ps. è giusto tc come TCHAR  :confused: 
    tcBuffer = new TCHAR [50];
    tcBuffer = tsS.c_str();
    //Uso di tcBuffer
    delete tcBuffer [];
    //Ecco non psso assicurare la massima funzionalità del programma perchè ultimaente
    //non vado d'accordo con l'allocazione dinamica... :D :D :D

  9. #9
    Non va bene; in primo luogo, se allochi dinamicamente alloca della dimensione giusta (che ottieni tramite tsS.size()+1). Inoltre, non puoi assegnare a tcBuffer il contenuto di tsS in quella maniera: devi usare _tcscpy; se non erro, poi, le quadre della delete vanno prima del nome della variabile.
    Il tuo codice ora come ora andrebbe a creare un memory leak di almeno 50 byte (visto che il puntatore alla memoria allocata andrebbe perduto, poiché lo sovrascrivi con quello restituito da tsS.c_str()), e il delete andrebbe a deallocare il buffer interno di tsS; a quel punto con ogni probabilità ci sarebbe un double free al momento della distruzione di tsS, e il programma probabilmente andrebbe in crash.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    azz

    cavolo...!!!! ma dove le hai lette tutte queste cose..... diciamo che con le stringhe, char array di char e chi più ne ha più ne metta non vado molto d'accordo...xDxDxD

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 © 2024 vBulletin Solutions, Inc. All rights reserved.