View Full Version : [C++] string e char[]
alesnoce
07-02-2006, 11:41
Ciao a tutti.
Questa è la dichiarazione di una funzione che ho scritto e di cui ritengo la definizione non importante, almeno per il momento.
void ExecuteAction(string _action, bool _writeSignal);
Debuggando il mio codice, mi sono accorto che se invoco la funzione così:
string trAction(GetTransition(it)->GetAction());
ExecuteAction(trAction, true);
non ci sono errori né a compile time né a run time, però il programma non funziona.
Per farlo funzionare ho dovuto scrivere:
string trAction(GetTransition(it)->GetAction());
char bufAction[trAction.size()+1];
memset(bufAction, '\0', trAction.size()+1);
trAction.copy(bufAction, trAction.size());
ExecuteAction(bufAction, true);
Perché se il primo parametro è string devo passare un char* affinché il programma funzioni?
Seconda domanda: ci sono problemi a definire una stringa di un solo carattere?
So che potrei spulciare i manuali, però preferisco avere risposte da un programmatore che mi fornisca suggerimenti pratici: ho scritto un programma da oltre 4500 righe effettive di codice, e sto scoprendo una miriade di bug; mi sembra che anche quelli che non ho ancora risolto siano tutti concernenti la gestione delle stringhe, quindi mi interesserebbero dritte su come trattarle, in particolar modo quelle ottenute come dereferenziazione di iterator STL. Qualcuno può spedirmi per raffronto qualche riga di codice?
Grazie anticipatamente
AnonimoVeneziano
07-02-2006, 12:36
Bisognerebbe capire cosa ritorna , e cosa fa la funzione "GetAction()" .
Questa dovrebbe ritornare un reference a "string" a quanto ho capito, ma bisogna vedere come lo riempie questo string .
Inoltre per caso la funzione ExecuteAction fa riferimento in qualche modo al fatto che la stringa finisca con '\0' ? Non sono completamente sicuro che le "string" in C++ ritengano anche il carattere di terminazione nullo (mentre nel char[] che crei con memset il '\0' ce lo metti, quindi potrebbe essere una causa) .
Magari per risolvere velocemente e senza mal di testa puoi provare con :
ExecuteAction(trAction.c_str(), true);
Ciao
alesnoce
07-02-2006, 15:15
Grazie, adesso provo
alesnoce
07-02-2006, 15:35
Anzi, dal momento che ci sono ti faccio vedere GetAction()
string GetAction() const
{
return action;
}
come vedi è una funzione elementare.
Avrei dovuto implementarla così?
string* GetAction() const
{
return &action;
}
AnonimoVeneziano
07-02-2006, 16:10
No.
Senti , per fare una prova del 9 perchè fai
string trAction(GetTransition(it)->GetAction() + "\0");
Così vediamo se è proprio un problema del '\0' :)
Ciao
alesnoce
07-02-2006, 16:21
Purtroppo ora devo andare ma domani ti faccio sapere.
Grazie mille anche per avermi fatto conoscere la funzione c_str() che essendo niubbo sostituivo con più righe di codice.
Ciao
alesnoce
08-02-2006, 10:43
Servono char[] null terminated; aggiungere '\0' limita i danni, per così dire.
Adesso mi metterò a eseguire il programma passo per passo per capire il perché di alcuni comportamenti che non riesco a spiegarmi. Appena lo scopro scriverò cosa ho fatto, chissà che non serva a qualcun altro.
Esempio di comportamento inspiegabile.
Quando legge la stringa "intA=2", il programma deve capire, dalla presenza di "=", che ha a che fare con una variabile, il cui tipo ho imposto possa essere solo int, double o boolean;
poi deve passare a isolare il nome della variabile, in questo caso intA, e il valore della stessa, in questo caso 2;
infine deve aggiungere in map<string, int> integerVariables nome e valore ottenuti.
Bene. Se gli passo intA=2 funziona, se gli passo intB=2 no!, aggiunge intB alla map delle variabili booleane.
Comunque grazie ancora per l'aiuto AnonimoVeneziano, mi ha tolto il dubbio su '\0'.
OT
Mi servirò del tuo howto per aggiornare il kernel di debian; per ora gli ho dato solo un'occhiata, ma è strutturato in maniera chiara
/OT
Ciao :)
AnonimoVeneziano
08-02-2006, 11:16
Servono char[] null terminated; aggiungere '\0' limita i danni, per così dire.
Adesso mi metterò a eseguire il programma passo per passo per capire il perché di alcuni comportamenti che non riesco a spiegarmi. Appena lo scopro scriverò cosa ho fatto, chissà che non serva a qualcun altro.
Esempio di comportamento inspiegabile.
Quando legge la stringa "intA=2", il programma deve capire, dalla presenza di "=", che ha a che fare con una variabile, il cui tipo ho imposto possa essere solo int, double o boolean;
poi deve passare a isolare il nome della variabile, in questo caso intA, e il valore della stessa, in questo caso 2;
infine deve aggiungere in map<string, int> integerVariables nome e valore ottenuti.
Bene. Se gli passo intA=2 funziona, se gli passo intB=2 no!, aggiunge intB alla map delle variabili booleane.
Comunque grazie ancora per l'aiuto AnonimoVeneziano, mi ha tolto il dubbio su '\0'.
OT
Mi servirò del tuo howto per aggiornare il kernel di debian; per ora gli ho dato solo un'occhiata, ma è strutturato in maniera chiara
/OT
Ciao :)
Prova a ripassarti un po' il codice di ExecuteAction e vedi un po' cosa fa di strano :)
Comunque per l'howto sul kernel , adesso dovrebbe essere un po' datato, la configurazione dei sorgenti del kernel linux da 2.4 ( che è il kernel per cui avevo fatto l'howto) a 2.6 è cambiata un po' , mentre la fase di build sotto debian (usando make-kpkg) è rimasta pressochè identica. Purtroppo non l'ho mai aggiornato e me ne dispiaccio, lo farò in futuro :fagiano:
Ciao
alesnoce
09-02-2006, 11:21
Risolto il busillis.
I bachi non erano nel codice, ma nei dati di ingresso!!!
Il mio programma infatti acquisisce in input dati provenienti da due file, che io erroneamente reputavo entrambi XML, mentre uno è simil XML.
Per questo la gestione di stringhe all'apparenza identiche era diversa: le stringhe ERANO diverse.
Che peccato però, credevo di aver creato per primo del "codice quantistico"
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.