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