CString in INT umwandeln: Kein cast - Kein Format, nichts klappt... !?



  • Hallo,

    ich lese aus einer ComboBox einen selektierten Eintrag aus.
    Das mache ich so

    CComboBox* pCombo = (CComboBox*) GetDlgItem(IDC_COMBO1);
    	CString str;	
    
    	pCombo->GetLBText( pCombo->GetCurSel(), str );
    

    Jetzt möchte ich einen Timer starten (SetTimer), dazu muss ich den Text aus der ComboBox in ein Int Wert umwandeln.
    Doch jetzt entsteht das Problem, dass ich den CString-Wert nicht per Format oder einem cast in ein Int wert machen kann. Da SetTimer das nicht kennt, es entstehen dann Fehler...

    // Umwandeln mit Format
    
    CString strSel;
    	strSel.Format("%d", str);
    

    Und dann versuche ich mit SetTimer den Timer zu starten, doch dieser Fehler entsteht

    // Timer starten
    
    SetTimer(del, strSel, NULL);
    

    Fehler

    SetTimer' : cannot convert parameter 2 from 'class CString' to 'unsigned int'

    Was kann ich nun tun, um strSel in einem int wert umzuwandeln ?

    Danke
    Q u e s



  • Im Zweifelsfall liefert atoi(const char*) deinen int



  • Du kannst es so machen

    template<typename T, typename R>
    T lexical_cast (R &source)
    {
        stringstream converter;
        T dest;
        converter << source;
        converter >> dest;
    
        return dest;
    }
    
    //Beispiel
    string str("1234");
    int i = lexical_cast<int> (str);
    


  • CString strSel;
        strSel.Format("%d", str);
    

    Ich weiß zwar nicht was str ist aber du soilltest die Memberfunktionen erst ansehen bevor du sie verwendest.

    Der Code oben schreibt in den CString strSel den Double str rein. Somit steht in strSel etwas drin was auch wieder ein CString ist.

    atoi(strSel);
    verwenden wir hier um CString nach INT zu bringen. INT nach CString dann mit

    CString strSel;
    int t = 10
        strSel.Format("%i", t);
    


  • Hmm, leider hat nix funktioniert. Wenn ich das Problem mit Format und %i löse, dann erscheint ein Fehler, das SetTimer ein int wert als 2. Parameter braucht und kein CString.

    Und wenn ich das alles mit atoi() löse, dann erscheint beim Ausführen ein Assert Fehler...
    Hab das alles mal mit dem Debugger geprüft und er schlägt fehl bei der Zeile mit atoi()

    Hier der Code

    CComboBox* pCombo = (CComboBox*) GetDlgItem(IDC_COMBO1);
    	CString str;	
    
    	pCombo->GetLBText( pCombo->GetCurSel(), str );
    
    	int nTimer = atoi(str);
    
    	AfxMessageBox(nTimer);
    

    @ SirLant
    Wenn ich dein Code verwende, dann erscheinen viel Fehler :

    error C2065: 'stringstream' : undeclared identifier
    see reference to function template instantiation 'int __cdecl lexical_cast(class CString &)' being compiled
    error C2146: syntax error : missing ';' before identifier 'converter'
    see reference to function template instantiation 'int __cdecl lexical_cast(class CString &)' being compiled
    error C2065: 'converter' : undeclared identifier
    see reference to function template instantiation 'int __cdecl lexical_cast(class CString &)' being compiled
    (240) : warning C4552: '>>' : operator has no effect; expected operator with side-effect
    see reference to function template instantiation 'int __cdecl lexical_cast(class CString &)' being compiled

    Danke
    Q u e s



  • Einfach #include <sstream> und using std::stringstream;



  • Kompilieren lässt sich alles super, doch es erscheint immernoch ein ASSERT-Fehler und der Debugger schlägt immernoch bei der Zeile

    int nTimer = lexical_cast<int> (str);
    

    Fehl...

    Hier nochmal ein Code...

    CComboBox* pCombo = (CComboBox*) GetDlgItem(IDC_COMBO1);
    	CString str;	
    
    	pCombo->GetLBText( pCombo->GetCurSel(), str );
    
    	int nTimer = lexical_cast<int> (str);
    
    	AfxMessageBox(nTimer);
    

    Woran kann das liegen....

    Danke
    Q u e s



  • Hat denn keiner eine Idee ?? *heul*

    Danke
    Q u e s



  • Du kannst keine ints mit AfxMessageBox ausgeben, nur Strings.



  • Daran liegt es aber nicht, es erscheint immernoch dieser ASSERT-Fehler beim Ausführen...

    Danke
    Q u e s



  • Teste mal das hier in einem eigenen Projekt.

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    template<typename T, typename R>
    T lexical_cast (R &source)
    {
    	stringstream converter;
    	T dest;
    	converter << source;
    	converter >> dest;
    
    	return dest;
    } 
    
    int main ()
    {
    	string str ("1234");
    	int i = lexical_cast<int> (str);
    
    	cout << i;
    }
    

    Sorry für die Formatierung, aber hab jetzt keine Zeit die noch von Hand zu korrigieren.

    /Edit
    Wow heute klappt es sogar mal mit copy 'n paste 😮


Anmelden zum Antworten