PDA

Visualizza la versione completa : [C++] Problemi di conversione


tina8
20-04-2010, 19:57
Ciao a tutti..il mio problema è il seguente..si tratta di un problema di conversione.
La classe richiamata è la seguente:


class StrX
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
StrX(const XMLCh* const toTranscode)
{
// Call the private transcoding method
fLocalForm = XMLString::transcode(toTranscode);
}

~StrX()
{
XMLString::release(&fLocalForm);
}

// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
const char* localForm() const
{
return fLocalForm;
}

private :
// -----------------------------------------------------------------------
// Private data members
//
// fLocalForm
// This is the local code page form of the string.
// -----------------------------------------------------------------------
char* fLocalForm;
};

inline XERCES_STD_QUALIFIER ostream& operator<<(XERCES_STD_QUALIFIER ostream& target, const StrX& toDump)
{
target << toDump.localForm();
return target;
}



Il metodo scritto da me(che richiama la precedente) ha la seguente linea di codice mi solleva l'errore:

impossibile convertire da 'StrX' a 'const char *'



const char* n= StrX(name);


Forse chiamando StrX(name ) non viene restituito il tipo di dato const char* o c'è qualche altra funzione da utilizzare.
Grazie e ciaoooooooooo

shodan
20-04-2010, 20:32
Più semplicemente non c'è nessun operatore di conversione implicito.
Dovresti aggiungere:


// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
const char* localForm() const
{
return fLocalForm;
}
// -----------------------------------------------------------------------
// Conversion operator
// -----------------------------------------------------------------------
operator char* const ()
{
return fLocalForm;
}


Personalmente, preferisco convertire i vari XMLCh* in std::wstring per essere più tranquillo.

tina8
20-04-2010, 21:03
Ho aggiunto il codice ma ho due problemi:

1. Se provo a stampare il contenuto di n mi restituisce la seguente stringa fatta di trattini con un triangolo finale, ma non la stringa corretta

2. Quando eseguo il controllo presente nell'if mi restituisce il seguente errore:

error C2446: '==': nessuna conversione da 'const char *' a 'const wchar_t *'
I tipi a cui si punta sono privi di relazioni. La conversione richiede reinterpret_cast, cast di tipo C o cast di tipo funzione
c:\xerces-c-3.1.0\xerces-c-3.1.0\samples\src\saxprint\saxprinthandlers.cpp(20 1) : error C2440: '==': impossibile convertire da 'const char *' a 'const wchar_t *'

p.s. il campo element di elem è di tipo wstring


for (int index = 0; index < len; index++){
elem = pathdata[index];
if(elem.element.data()==n){
.......}


Hai idea di quale sia il problema... :ciauz:

shodan
20-04-2010, 21:17
error C2446: '==': nessuna conversione da 'const char *' a 'const wchar_t *'
I tipi a cui si punta sono privi di relazioni. La conversione richiede reinterpret_cast, cast di tipo C o cast di tipo funzione

Questo dice tutto.
Però dovresti precisare cos'è elem.element ( XMLCh*? std::wstring? altro?), cos'è n e se c'entra la classe che hai fatto.
Nel file che ho io non c'è traccia di quel for.

tina8
20-04-2010, 22:03
elem.element è un elemento presente nel vettore pathdata definiti nel modo seguente:


public : struct PathData {
wstring element;
wstring elementText;
};
//}elem;
vector<PathData> pathdata;


Non è presente nel file che ti ho mandato perchè è nel main del progetto.
Ti posto un pezzo di codice relativo al for:


void SAXPrintHandlers::endElement(const XMLCh* const name)
{
int len = pathdata.size();
PathData elem;
wstring path;

const char* n= StrX(name);
cout<<"\n Valore di n: "<< n;
for (int index = 0; index < len; index++){
elem = pathdata[index];
if(elem.element.data()==n){



Sono stata chiara??? Ciaooooo

shodan
20-04-2010, 22:22
Ti stai complicando la vita per niente.
Introduci una conversione inutile da XMLCh* a const char* (in questa funzione) e poi cerchi di confrontare quest'ultima con una const wchar_t* (due tipi di dati non omogenei) e per di più con l'operatore == (le stringhe C non si confrontano così).

Puoi riscrivere il tutto usando solo std::wstring ed eventualmente convertire il tutto all'ultimo momento.



void SAXPrintHandlers::endElement(const XMLCh* const name)
{
wstring n(name);
int len = pathdata.size();
PathData elem;
wstring path;

cout<<"\n Valore di name: "<< Strx(name);
for (int index = 0; index < len; index++){
elem = pathdata[index];
if(elem.element == n) {

tina8
25-04-2010, 20:35
Allora ho provato a confrontare l'uguaglianza tra stringhe nel modo seguente, ma non funziona, ossia stampa che le stringhe sono uguali anche quando non lo sono, come devo fare per confrontare due stringhe???



if(strcmp(StrX(name),StrX(elem.element.data()))!=0 ){
cout<<"\n Sono uguali";


Grazieeeeee
:ciauz:

tina8
25-04-2010, 20:41
Ho risolto..sbagliavo il controllo..bastava mettere ==0!!! Ciaooooooooooo

shodan
25-04-2010, 20:47
Continuo a non capire il perché di questi arzigogolii con le C string, quando le stringhe C++ rendono tutto più semplice. :master:

Loading