TCHAR * = TCHAR * ?



  • Hallo.

    Warum geht eigentlich folgendes nicht ?

    TCHAR *szString = new TCHAR(TEXT("Hallo"));
    
    // das hier
    TCHAR *szOne = szStirng ;
    //
    

    szString ist doch der Zeiger auf das erste Element von "Hallo", also die Adresse.
    Dann müsste das doch eigentlich gehn???

    Gruß



  • Ich sollte mir echt mal einen Textbaustein anlegen und auf einen Hotkey legen...

    "Geht nicht" ist keine Fehlerbeschreibung.



  • Hallo

    weil beides Null-Terminierte C-Strings sind und bei dieser Zuweisung nur der Adress-Pointer kopiert wird, nicht aber der eigentliche Inmhalt des Strings.

    Dazu brauchst du schon die entsprechende Funktion, strcpy für TCHAR.

    bis bald
    akari



  • Mich dünkt auch, dass die Konstruktion dieses TCHAR nur ein Zeichen Speicher reserviert, dessen Inhalt die Adresse des konstanten Textes "Hallo" interpretiert als Ordnungszahl des Zeichens ist. Sollte eigentlich eine Compilerwarnung (mindestens) ergeben.



  • Hallo.

    Sorry, mit dem

    TCHAR *szString = new TCHAR(TEXT("hallo"));
    

    wollte ich eigentlich nur sagen, dass szString auf ein String auf dem heap verweist. Ob das geht oder nicht, dass spielt keine Rolle.

    Also nochmal.
    Was mit jedem anderen Zeiger geht, dass geht mit den Zeichenketten nicht.
    Jetzt zeigt doch der Zeiger szString auf eine Adresse, die auf den heap refernziert.
    Wenn ich jetzt diese Adresse in einen anderen Zeiger vom gleichen Typ speichern will, dann nimmt dieser neue Zeiger nicht diese Adresse an.
    Ich hab das bis jetzt auch immer mit wcscpy_s gemacht. Trotzdem wollte ich mal wissen wieso das mit dem Zeiger eigentlich nicht geht.
    Weil im Endeffekt steht dann doch da:
    Zeiger = Zeiger
    !!!
    Wieso geht das nicht?

    Gruß und Dank



  • Natürlich geht das wie bei jedem anderen Zeiger auch.

    Ansonsten:
    Nachvollziehbares compilierbares Beispiel posten.



  • Hallo

    Die Adressen werden wie bei jeden andern Pointern auch kopiert

    char* eins = new char(5);
    char* zwei = eins;
    std::cout << int(eins) << " " << int(zwei) << std::endl;
    

    bis bald
    akari



  • Wieso geht dann das bei mir nicht???

    ////////////////////
    //  No.1        ////
    ////////////////////
    TCHAR *CTime::CalcCurTime( TCHAR *szDayTime, int iSize )
    {
    	if( m_szTime )
    		m_szTime[0] = TEXT('\0') ;
    
    ////////////////////////////////
    ////  No.2          ////////////
    ////////////////////////////////           
    	if( !m_szTime )
    		m_szTime = new TCHAR[ m_iStringSize ] ;
    
    	int		iTemp ;
    	float	fRest ;
    	TCHAR	szHour[4] ;
    	TCHAR	szMin[4] ;
    	TCHAR	szSec[4] ;
    
    	// calc time
    	float fMili = (float)m_dwMilisecFromMid  ;
    	// new basis calculated
    	float fSec	= fMili * 0.001f ;
    	float fMin	= fSec / 60 ;
    	float fHour = fMin / 60 ;
    
    	if( fHour > 24.0f ){
    		m_dwMilisecFromMid = 0 ;
    		return NULL;
    	}
    
    	iTemp = (int)fHour ;
    	fRest = fHour - iTemp ;
    
    	int iHour	= iTemp ;
    	int iMin	= (int)(fRest * 60 );
    	int iSec	= ((int)fSec )% 60;
    
    	if(iHour<10)
    		wsprintf(szHour, TEXT("0%d:"), iHour);
    	else
    		wsprintf(szHour, TEXT("%d:"), iHour ) ;
    
    	if(iMin<10)
    		wsprintf(szMin, TEXT("0%d:"), iMin );
    	else
    		wsprintf(szMin, TEXT("%d:"), iMin);
    
    	if(iSec<10)
    		wsprintf(szSec, TEXT("0%d"), iSec);
    	else
    		wsprintf(szSec, TEXT("%d"), iSec ) ;
    
    	wsprintf(m_szTime, TEXT("%s%s%s"), szHour, szMin, szSec);
    
    ////////////////////////////////
    ////  No.3          ////////////
    ////////////////////////////////
    	return m_szTime ;
    }
    

    Also, ich hab das jetzt mal durchnummeriert.
    Ich hoffe Ihr könnt das sehen.
    -> No.1, No.2, No.3;

    Zu No.1:
    Zunächst wäre da mal das hier

    TCHAR *szDayTime
    

    in der Parameterliste.

    Wenn ich diese Funktion aufrufe, dann übergebe ich einen Zeiger, so wie das da steht.

    Zu No.2
    Hier weise ich der Membervariablen m_szTime Speicher auf dem heap zu.

    if( !m_szTime )
            m_szTime = new TCHAR[ m_iStringSize ] ;
    

    Zu No.3
    Ich muss hier dazu sagen, das ist die neue Variante.
    Die Alte ging so

    szDayTime = m_szTime
    

    und das hat nicht funktioniert!
    Obwohl doch szDayTime ein Zeiger ist, und m_szTime auch, wie Ihr ja sehen könnt.
    Wenn ich das jetzt so mache wie es im Bsp oben steht, also mit dem

    return...
    

    und nicht mit der Zuweisung

    szDayTime = m_szTime
    

    dann funktioniert alles.

    Ich hoffe das war jetzt alles klar geschildert!

    Gruß




Anmelden zum Antworten