Typumwandlung bei Array !



  • Hallo zusammen ;),

    wisst ihr wie man Arrays castet also z.b. Int in String oder noch besser Int in CString ?

    Vielen Dank für eure Mühe
    ShadowEater



  • itoa



  • ShadowEater schrieb:

    Hallo zusammen ;),
    wisst ihr wie man Arrays castet also z.b. Int in String oder noch besser Int in CString ?
    ShadowEater

    int a[100];
        char* bptr = (char*)a;
    

    Zeiger casten und als char-Array ansprechen zb.

    bptr[399] = '\0';
    


  • Ich bin mir nicht sicher, was mit Arrays gemeint ist, aber Casten zwischen Int und String geht unter C++ mit folgenden Funktionen:

    template <typename To, typename From>
    bool try_lexical_cast(From const& from, To* to)
    {
        std::stringstream interpreter;
        return interpreter << from and interpreter >> *to and interpreter.eof();
    }
    
    struct invalid_cast : std::logic_error {
        invalid_cast() : std::logic_error("Invalid cast.") { }
    };
    
    template <typename To, typename From>
    To lexical_cast(From const& from)
    {
        To ret;
        if (not try_lexical_cast(from, &ret))
            throw invalid_cast();
        return ret;
    }
    

    Beispiel:

    cout << lexical_cast<int>("1234") << endl; // "1234"
    int x;
    cout << boolalpha << try_lexical_cast("12a3", &x) << endl; // "false"
    

    Auf Arrays kann man das ganze auch anwenden, indem man 'std::transform' nimmt.



  • Oh Mann,

    d*a*n+k+e willy !!!
    Hast Du in diesem Zusammenh. vllt ne Lösung dafür:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-186374.html

    ?????

    Danke für Deine Mühe
    Gruss
    ShadowEater



  • ShadowEater schrieb:

    Hast Du in diesem Zusammenh. vllt ne Lösung dafür:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-186374.html

    Zwei Dinge:

    - Variablen müssen deklariert werden, *bevor* man sie benutzt.
    - Du kannst nicht einfach Zahlen in einen String reinschreiben. Verwende die von mir gepostete Lösung.

    CString itsResult[100]; // !!! 100! NICHT 101! Wir sind hier nicht in VB.
        for (int i = 0; i<=10; i++)
        {
            for (int j = 0; j <=10; j++)
            {
                itsResult[i * j] = lexical_cast<CString>(i * j);
            }
        }
    


  • Ach so, noch etwas, das klappt so nicht. Du gibst in Der Funktion 'Calculate' einen Zeiger auf ein Objekt innerhalb der Funktion zurück. Nach Beenden der Funktion wird dieses Objekt aber zerstört, daher zeigt der Zeiger ins Nirvana.

    Verwende die C++-'std::vector'-Klasse statt C-Arrays, dann hast Du das Problem nicht.



  • Danke für die Antwort ;),

    ich habe den Code eingefügt und erhalte noch 2 Fehlermeldungen :

    1.'lexical_cast' : nichtdeklarierter Bezeichner
    2.Ungültige Verwendung dieses Typs als Ausdruck

    Ach so, noch etwas, das klappt so nicht. Du gibst in Der Funktion 'Calculate' einen Zeiger auf ein Objekt innerhalb der Funktion zurück. Nach Beenden der Funktion wird dieses Objekt aber zerstört, daher zeigt der Zeiger ins Nirvana.

    Hmmm das kann ich mir vorstellen dass das nicht klappt, gibt es eine möglichkeit Arrays weiterzuverwenden (statische Zeiger oder so etwas ?)

    😉
    ShadowEater



  • ShadowEater schrieb:

    1.'lexical_cast' : nichtdeklarierter Bezeichner
    2.Ungültige Verwendung dieses Typs als Ausdruck

    Ja, Du musst auch schon den Code für 'lexical_cast', den ich vorher gepostet habe, einfügen. Und zwar so, dass er in der Funktion gefunden wird. Also *davor*. Am besten in einem eigenen Header, den Du dann einfügst.

    Hmmm das kann ich mir vorstellen dass das nicht klappt, gibt es eine möglichkeit Arrays weiterzuverwenden (statische Zeiger oder so etwas ?)

    Ja, es ginge in der Tat, wenn Du das Array in der Funktion als 'static' deklarierst. In diesem Fall könnte das sogar sinnvoll sein. Generell rate ich aber trotzdem von der Verwendung von Zeigern ab, wo es sich vermeiden lässt.



  • Hmmmm,
    dann wäre doch das geschickteste sich die Ergebnisse auszurechnen und sie nicht in ein int Array zu schreiben sondern gleich nach der Berechnung einfach zu casten und gleich in ein CString Array einzulesen oder ?

    😉
    ShadowEater



  • Mensch jung, mach das doch ordentlich ! Tststs !
    Du könntest
    void func( type** pptr )
    {

    *ptr = 0xXYZ;
    return;
    }

    int main(){

    type *p_ptr;
    func( &p_ptr );
    ...
    es so machen. MFG



  • Wenn ich das so mache krieg ich nur noch einen Fehler :

    class CCalculate
    {
    
    	private:
    
    	public:
    
    		CCalculate	(){};
    		~CCalculate	(){};
    
    		int				itsResult	[100];
    		static	CString ergebnis	[100];
    		CString			strTausche;
    		int				iTausche;
    
    		CString berechne();
    };
    
    CString CCalculate::berechne()
    {
    	for (int i = 0; i<=10; i++)
    	{
    		for (int j = 0; j <=10; j++)
    		{
    			itsResult[i * j] = (i * j);
    		}
    	}
    
    	for (int k = 0; k <= 100; k++)
    	{
    		itsResult[k]	= iTausche;
    		strTausche		= (CString)iTausche;
    		ergebnis[k]		= strTausche; 
    	}
    
    	return  *ergebnis;
    }
    

    error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung möglich

    mfg
    ShadowEater



  • Hm, mit MFC arbeite ich eigendlich nicht, aber vielleicht hilft dir das:

    class CCalculate 
    { 
    
        private: 
    
        public: 
    
            CCalculate    (){}; 
            ~CCalculate    (){}; 
    
            int                itsResult[100]; 
            CString            ergebnis[100]; 
    
            void berechne(); 
    }; 
    
    void CCalculate::berechne() 
    { 
        char tmp[100];
        for (int i = 0; i < 10; i++) 
        { 
            for (int j = 0; j < 10; j++) 
            { 
                itsResult[i * j] = i * j; 
                //_itow_s(i*j, tmp, 100, 10);// die wchar_t -Variante
                _itoa_s(i*j, tmp, 100, 10); 
                ergebnis[i*j] +=  tmp;
            } 
        } 
    }
    

    😉


Anmelden zum Antworten