PDA

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


giorgiogio48
28-04-2010, 11:22
Ciao a tutti,
devo inserire i campi di un file txt con delimitatore in una listview.
Il cocice che uso é:


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:


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.

oregon
28-04-2010, 11:32
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

giorgiogio48
28-04-2010, 12:10
Ciao Oregon,
grazie per la risposta. Ho modificato la riga così:


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 *'".

MItaly
28-04-2010, 12:18
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.

giorgiogio48
28-04-2010, 12:35
Ciao Mytaly,
con i suggerimento tuo mi da ora l'errore "cannot convert from 'const char *' to 'LPSTR'" :dhò:

kirakira93
28-04-2010, 19:06
prova:




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ò... :D :D

MItaly
28-04-2010, 21:14
Originariamente inviato da giorgiogio48
Ciao Mytaly,
con i suggerimento tuo mi da ora l'errore "cannot convert from 'const char *' to 'LPSTR'" :dhò:
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:




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 *.

kirakira93
28-04-2010, 21:31
si in effetti hai ragione su quest'ultimo punto....
forse allora col buffer temporaneo.

una cosa del genere:



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

MItaly
28-04-2010, 21:37
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.

kirakira93
28-04-2010, 21:41
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

Loading