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 hierTCHAR *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 soszDayTime = 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 demreturn...
und nicht mit der Zuweisung
szDayTime = m_szTime
dann funktioniert alles.
Ich hoffe das war jetzt alles klar geschildert!
Gruß
-
Siehe z.B. hier, zweiter Post ist die Lösung
http://www.c-plusplus.net/forum/viewtopic-var-t-is-158206-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html