Zeiger auf CString oder CStringArray



  • Hallöchen!

    Ich möchte einen Zeiger auf ein CString bzw. ein CStringArray aus der Ansichtsklasse - OnDraw - holen. Leider weiß ich nicht wie!

    Wenn ich CString* oder *Data verwende, heißt es immer, daß ein eine Konvertierung nicht nöglich sei. So Kompiler sind doch recht uneinsichtige Prog's. 😃

    Wer kann mir helfen?

    THX Markus



  • Zeig doch mal Quelltext.

    Außerdem kannst du dir ja auch eine Referenz geben lassen - die ist wenigstens immer gültig.



  • Hi!

    Hier erst einmal der Code, er steht in der Methode OnTestStart() in der Dokumentenklasse:

    if (!Serial.OpenPort("COM1"))
    		{
    			AfxMessageBox("Failed to open port!");
    		}
    
    		//Configure COM1 für Notebook, COM2 für PC-HOME, PC-FH evtl. COM1
    		Serial.ConfigurePort(4800,          //Baud Rate
    							 8,             //Data Bits
    							 FALSE,         //Has Parity
    							 NOPARITY,      //Parity Bits
    							 TWOSTOPBITS    //Stop Bits
    							);
    
    		//Read data from GPS 
    		char Data[100]="\0";
    
    		BYTE DataByte='\0';
    		int nIndex=0;
    
    		//Obtaining information from GPS character by character
    		//Note: NMEA0183 sentences will finished by "\r\n" characters!
    		BOOL Return=Serial.ReadByte(DataByte);
    		while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
    		{
    			Data[nIndex]=DataByte;
    			nIndex++;
    			Return=Serial.ReadByte(DataByte);
    		}
    
    		Data[nIndex++]='\r';
    		Data[nIndex++]='\n';
    		Data[nIndex++]='\0';
    
    		//Remove garbage characters if any exists!
    		nIndex=0;
    		while (Data[nIndex]!='$' && nIndex<100)
    			nIndex++;
    
    		//CString sMsg;  fällt hier weg, da nun als Member-Variable deklariert
    
    		//Umwandeln des char-Array in ein Character-String, damit der
    		//Inhalt sowohl von der MessageBox, als auch von TextOut 
    		//gelesen werden kann
    	for (int i=0; i<100; i++)
    		sMsg.Format("%s", (const char*)Data);
    		AfxMessageBox(sMsg);
    
    	Serial.ClosePort();
    
    Für die Variable sMsg gilt:
    [cpp]private:
    	CString sMsg;
    

    Ein GetData() soll einen Zeiger auf den String zurück geben:

    const CString* CRS232SerialComDoc::GetData() const
    {
    	//Liefert bei Aufruf einen Zeiger auf die Variable
    	//private, CString, sMsg zurück
    	return &sMsg;
    }
    

    Und in der Ansichtsklasse in der Methode OnDraw soll die Ausgabe erfolgen:

    const CString *pData = pDoc->GetData();
    pDC->TextOut(0,0, (const CString*)pData);
    

    Und das erhalte ich dann als Fehlermeldung:
    *G:\My Projects\RS232SerialCom\RS232SerialComView.cpp(76) : error C2440: 'initializing' : 'const char *' kann nicht in 'const class CString *' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    G:\My Projects\RS232SerialCom\RS232SerialComView.cpp(77) : error C2664: 'int __thiscall CDC::TextOutA(int,int,const class CString &)' : Konvertierung des Parameters 3 von 'const class CString *' in 'const class CString &' nicht moeglich
    Ursache: Konvertierung von 'const class CString *' in 'const class CString' nicht moeglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
    Generieren von Code...
    Fehler beim Ausführen von cl.exe.

    RS232SerialCom.exe - 4 Fehler, 0 Warnung(en)*

    Die Seite der MSDN über CStrings verstehe ich nicht so ganz!

    Wer kann mir die Fehler nennen und den richtigen Code liefern? 👍 👍

    THX Markus



  • Hi!

    Kann jemand was mit den Code anfangen!

    Markus



  • Hi,

    entweder so ...

    void CRS232SerialComDoc::GetData(CString &strData)
    {
        strData = sMsg;
    }
    

    oder so ...

    LPCTSTR CRS232SerialComDoc::GetData()
    {
        return (LPCTSTR)sMsg;
    }
    

    wären jetzt zwei Möglichkeiten ... 😉

    Grüße,

    LukeX



  • Hi Luke!

    Erstmal thanx!

    Werde das gleich mal testen

    Markus



  • Hi LukeX, möge die Macht mit Dir sein 😉

    Leider habe ich noch Probleme mit der Umsetzung.

    1.Vorschlag:
    Mit mein OnDraw-Code:

    const CString *pData = pDoc->GetData();
    	pDC->TextOut(0,0, (const CString*)pData);
    

    Fehlermeldungen:
    *G:\My Projects\LukeX\LukeXView.cpp(63) : error C2660: 'GetData' : Funktion akzeptiert keine 0 Parameter
    G:\My Projects\LukeX\LukeXView.cpp(64) : error C2664: 'int __thiscall CDC::TextOutA(int,int,const class CString &)' : Konvertierung des Parameters 3 von 'const class CString *' in 'const class CString &' nicht moeglich
    Ursache: Konvertierung von 'const class CString *' in 'const class CString' nicht moeglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
    Generieren von Code...
    Fehler beim Ausführen von cl.exe.

    LukeX.exe - 2 Fehler, 0 Warnung(en)
    *

    Modifizierter OnDraw-Code:

    const CString *pData = pDoc->GetData(CString &strData);
    	pDC->TextOut(0,0, (const CString*)pData);
    

    Fehlermeldungen:
    *G:\My Projects\LukeX\LukeXView.cpp(63) : error C2065: 'strData' : nichtdeklarierter Bezeichner
    G:\My Projects\LukeX\LukeXView.cpp(63) : error C2275: "CString" : Ungültige Verwendung dieses Typs als Ausdruck
    c:\programme\microsoft visual studio\vc98\mfc\include\afx.h(368) : Siehe Deklaration von 'CString'
    G:\My Projects\LukeX\LukeXView.cpp(64) : error C2664: 'int __thiscall CDC::TextOutA(int,int,const class CString &)' : Konvertierung des Parameters 3 von 'const class CString *' in 'const class CString &' nicht moeglich
    Ursache: Konvertierung von 'const class CString *' in 'const class CString' nicht moeglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
    Fehler beim Ausführen von cl.exe.

    LukeX.exe - 3 Fehler, 0 Warnung(en)
    *

    2.Vorschlag:
    Mit mein OnDraw-Code:

    const CString *pData = pDoc->GetData();
    	pDC->TextOut(0,0, (const CString*)pData);
    

    Fehlermeldungen:
    *G:\My Projects\LukeX\LukeXView.cpp(63) : error C2440: 'initializing' : 'const char *' kann nicht in 'const class CString *' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    G:\My Projects\LukeX\LukeXView.cpp(64) : error C2664: 'int __thiscall CDC::TextOutA(int,int,const class CString &)' : Konvertierung des Parameters 3 von 'const class CString *' in 'const class CString &' nicht moeglich
    Ursache: Konvertierung von 'const class CString *' in 'const class CString' nicht moeglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
    Generieren von Code...
    Fehler beim Ausführen von cl.exe.

    LukeX.exe - 2 Fehler, 0 Warnung(en)
    *

    Modifizeirter OnDraw-Code:

    const CString *pData = pDoc->GetData();
    	pDC->TextOut(0,0, pDoc->sMsg);
    

    Fehlermeldungen:
    *G:\My Projects\LukeX\LukeXView.cpp(63) : error C2440: 'initializing' : 'const char *' kann nicht in 'const class CString *' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    G:\My Projects\LukeX\LukeXView.cpp(64) : error C2248: "sMsg" : Kein Zugriff auf private Element, dessen Deklaration in der Klasse "CLukeXDoc" erfolgte
    g:\my projects\lukex\lukexdoc.h(53) : Siehe Deklaration von 'sMsg'
    Fehler beim Ausführen von cl.exe.

    LukeX.exe - 2 Fehler, 0 Warnung(en)
    *

    Wie du siehst, brauche ich fundamentale Hilfe! Kannst du mir da weiter helfen? 👍 👍

    THX Markus 👍 👍 👍



  • hi ...

    erstmal verwendest du am besten
    die Variante2:

    LPCTSTR CRS232SerialComDoc::GetData()
    {
        return (LPCTSTR)sMsg;
    }
    

    du bekommst nun durch aufruf der methode getdata einen zeiger auf sMsg.
    und nun das ganze anwenden:

    LPCTSTR pData = pDoc->GetData(); 
    pDC->TextOut(0,0,pData);
    

    Viel Glück weiterhin ...

    DIE MACHT SEI MIT DIR 🕶

    Grüße

    LukeX


Anmelden zum Antworten