Free99 Geschrieben 21. Oktober 2005 Geschrieben 21. Oktober 2005 Mein Programm ist in MS Visual C++ 6.0 geschrieben. Meine Applikation enthält ein ActiveX-Steuerelement-> Microsoft Webbrowser. Ich habe eine Listbox, gefüllt mit Zeichen (Barcode) und eine OnButton2() Methode in der Folgendes passieren soll: void CSerialAppDlg::OnButton2() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen int CodeListCount = m_code_list.GetSelCount(); //Wieviele Elemente der ListBox wurden angewählt CArray<int,int> aryCodeList; //da sollen mal die Elemente rein aryCodeList.SetSize(CodeListCount); //Speicherreservierung m_code_list.GetSelItems(CodeListCount,aryCodeList.GetData()); //m_code_list ist die Member Var der ListBox CString PHPQuery = ""; //Variable für den PHP Query String CString Trennzeichen = "__"; //das Trennzeichen erleichtert in php die Stringtrennung for (int i=0;i<=CodeListCount;i++) { PHPQuery = PHPQuery + aryCodeList[i] + Trennzeichen; //Addition der Elemente } SetDlgItemText(IDC_MONITOR_REC,PHPQuery); //kleine Debugabfrage ob der Querystring richtig ist explorer1.Navigate("file:///c:/Debug/index.html?codes=PHPQuery", NULL, NULL, NULL, NULL); //Übergabe an das Browsersteuerelement } [/code] Fehlermeldung: error C2666: '+' : 4 Ueberladungen haben aehnliche Konvertierungen Die Fehlerbeschreibung bei MSDN sagt mir leider recht wenig, ich tippe auf nen falschen Typ beim Array, habs auchmal mit CString versucht, funktioniert auch nicht, vielleicht könnt ihr mir sagen was an dem Code falsch ist? Vielen Dank schonmal im Voraus Zitieren
Mephisto81 Geschrieben 22. Oktober 2005 Geschrieben 22. Oktober 2005 hallo, [...] [B]PHPQuery = PHPQuery + aryCodeList[i][/B] + Trennzeichen; //Addition [...] hier versuchst du einem CString-Objekt mittels des "+" Operators einen int anzuhängen. Das funktioniert nicht. Du musst die Zahl in ein neues CString - Objekt zum Beispiel mittels Format setzen und dann die Stringverkettung mit diesem neu entstandenen Objekt durchführen. Der MSDN-Eintrag zu CString::Format sollte dir weiterhelfen. gruß mep Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 Hi, den MSDN-Eintrag hab ich gefunden, nur versteh ich da nur Bahnhof... ich weiss nicht wo ich was hinschreiben soll und diese Geschichte mit %d irgendwas ist da leider auch nicht erklärt... Könntest du mir n Beispiel schreiben? Es sei denn die Deklaration des Arrays ist falsch, denn ich weiss nicht warum ich da unbedingt int nehmen muss... Der Inhalt der ListBox ist gefüllt mit Barcodes, da wäre CString also sinnvoller, nur als ich es mit CString versucht hatte, kam ebenfalls ein fehler. Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 nur als ich es mit CString versucht hatte, kam ebenfalls ein fehler.Geht's ein wenig ausführlicher als "ein Fehler"? Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 Bei der Deklaration des Arrays CArray<int,CString> (Stimmt genau, ich hab keinen blassen Schimmer was ich da gemacht hab ) og. Fehler error C2666: '+' : 4 Ueberladungen haben aehnliche Konvertierungen //edit wie schon gesagt, bin ja nur armer FISI der FIAE machen darf Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 Und wie wäre es mit CArray<CString,CString>? Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 error C2664: 'GetSelItems' : Konvertierung des Parameters 2 von 'class CString *' in 'int *' nicht moeglich Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 GetSelItems liefert dir ein Array von ints, in denen die Indices der ausgewählten Elemente stehen. Das kannst du nicht einfach auf CString umstellen. Statt dessen musst du mit einer Schleife durch dieses Array laufen und jeweils den Text rausholen, mit CListBox::GetText. Diese Texte kannst du dann in dein Array stecken. P.S.: Verschoben nach C++: Compiler, IDEs, APIs Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 So, da ich ja wissen will, was der User angewählt hat, muss GetSelItems bleiben. Also hab ich in der Schleife versucht mit GetText zu arbeiten, nur leider sagt mir das 2. benötigte Argument der Funktion (lt. MSDN) nichts. void CSerialAppDlg::OnButton2() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen int CodeListCount = m_code_list.GetSelCount(); CArray<int,int> aryCodeList; aryCodeList.SetSize(CodeListCount); m_code_list.GetSelItems(CodeListCount,aryCodeList.GetData()); CString PHPQuery = ""; CString Trennzeichen = "__"; for (int i=0;i<=CodeListCount;i++) { CString Code; Code = m_code_list.GetText(aryCodeList[i]); //<---- PHPQuery = PHPQuery + Code + Trennzeichen; } } bei obigem Code gibt es logischerweise folgenden Fehler: error C2661: 'GetText' : Keine ueberladene Funktion akzeptiert 1 Parameter Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 m_code_list.GetText(aryCodeList[i], Code) Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 Ok, Programm startet, ich lese Barcodes ein, wähle welche aus und klicke den Button2 an. Debug Assertion Failed! das sind ja wieder diese nichts sagenden Fehler Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 das sind ja wieder diese nichts sagenden FehlerDas ist ein sehr aussagekräftiger Fehler. Du weißt ihn nur nicht richtig zu lesen. Wenn du auf Wiederholen klickst, bringt dich der Debugger an die Stelle, an der die Assertion fehlgeschlagen ist, und im Callstack kannst du ablesen, wie es dazu kam. Ich weiß nicht, welche Version von VC++ du benutzt, aber wahrscheinlich ist das diese Stelle: AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex) { ASSERT([B]nIndex >= 0 && nIndex < m_nSize[/B]);[/code] Das heißt, du greifst mit einem ungültigen Index auf dein CArray zu. Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 ok der Debugger zeigt nur haufenweise DLLs mit "Es wurden keine entsprechenden Symbolinformationen gefunden." an. dann kommt noch folgendes: Thread 0xAB0 wurde mit Code 0 (0x0) beendet. Thread 0x10C wurde mit Code -2147483645 (0x80000003) beendet. Thread 0xB84 wurde mit Code -2147483645 (0x80000003) beendet. Thread 0xFC0 wurde mit Code -2147483645 (0x80000003) beendet. Thread 0x300 wurde mit Code -2147483645 (0x80000003) beendet. Thread 0xC50 wurde mit Code -2147483645 (0x80000003) beendet. Thread 0xF50 wurde mit Code -2147483645 (0x80000003) beendet. Thread 0xC80 wurde mit Code -2147483645 (0x80000003) beendet. Thread 0x25C wurde mit Code -2147483645 (0x80000003) beendet. Das Programm "SerialApp.exe" wurde mit Code -2147483645 (0x80000003) beendet. und folgender Dialog wird angezeigt: //edit VC++ 6.0 Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 ok der Debugger zeigt nur haufenweise DLLs mit "Es wurden keine entsprechenden Symbolinformationen gefunden." an.Das ist kein Fehler und hat auch nichts mit dem Problem zu tun. Starte das Programm mit dem Debugger (F5), und wenn die Assertion fehlschlägt, klick auf Wiederholen. Schreib dann hier rein, was in der Aufrufliste (Callstack) steht. Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 ah ok ... jetz hab ichs template<class TYPE, class ARG_TYPE> AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex) -> { ASSERT(nIndex >= 0 && nIndex < m_nSize); return m_pData[nIndex]; } template<class TYPE, class ARG_TYPE> ich hoffe das meintest du, sieht zumindest deinem "Code" ähnlich. der gelbe Pfeil ist an der Stelle meines "->" Nebenbei wollt ich mich bei mal herzlichst bedanken, finds klasse wie du mir "zur Seite" stehst Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 Irgendwie hab ich mir wohl grad mein Programm zerschossen. Kann meinen Arbeitsbereich nichtmehr öffnen, bzw ich kann es nur es passiert nichts (keine Klassen, keine Ressourcen, keine Dateiansicht) Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 kann leider meinen Post nich ändern: Hab das Prog wieder hinbekommen mit Hilfe von div. Sicherungskopien Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 Schreib dann hier rein, was in der Aufrufliste (Callstack) steht.Diese Information wäre schon wichtig... Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 war das nich der letzte Post auf der 1. Seite ? Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 Nein, das ist der Code, mit der Markierung, an welcher Stelle die Assertion fehlgeschlagen ist. Soweit waren wir schon. Um festzustellen, wo der Aufruf mit dem ungültigen Index herkommt, brauchen wir die Aufrufliste (Callstack), das ist ein eigenes Fenster im Debugger, das du möglicherweise zuerst einblenden musst. Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 ok jetz isses angekommen, hab auch die Aufrufliste gefunden CArray<int,int>::ElementAt(int 2) line 262 + 65 bytes CArray<int,int>::operator[](int 2) line 280 + 41 bytes CSerialAppDlg::OnButton2() line 325 + 16 bytes _AfxDispatchCmdMsg(CCmdTarget * 0x0012fdbc {CSerialAppDlg hWnd=0x00470134}, unsigned int 1015, int 0, void (void)* 0x00401082 CSerialAppDlg::OnButton2(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88 CCmdTarget::OnCmdMsg(unsigned int 1015, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes CDialog::OnCmdMsg(unsigned int 1015, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes CWnd::OnCommand(unsigned int 1015, long 1508686) line 2088 CWnd::OnWndMsg(unsigned int 273, unsigned int 1015, long 1508686, long * 0x0012f7bc) line 1597 + 28 bytes CWnd::WindowProc(unsigned int 273, unsigned int 1015, long 1508686) line 1585 + 30 bytes AfxCallWndProc(CWnd * 0x0012fdbc {CSerialAppDlg hWnd=0x00470134}, HWND__ * 0x00470134, unsigned int 273, unsigned int 1015, long 1508686) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00470134, unsigned int 273, unsigned int 1015, long 1508686) line 368 AfxWndProcBase(HWND__ * 0x00470134, unsigned int 273, unsigned int 1015, long 1508686) line 220 + 21 bytes USER32! 77d18734() USER32! 77d18816() USER32! 77d1b89b() USER32! 77d1b903() USER32! 77d4fc7d() USER32! 77d464e8() USER32! 77d277de() USER32! 77d3b05a() USER32! 77d18734() USER32! 77d18816() USER32! 77d189cd() USER32! 77d18a10() USER32! 77d2e097() USER32! 77d3c6ab() COccManager::IsDialogMessageA(CWnd * 0x0012fdbc {CSerialAppDlg hWnd=0x00470134}, tagMSG * 0x0041a8c8 {msg=0x00000202 wp=0x00000000 lp=0x00040033}) line 614 + 17 bytes CWnd::IsDialogMessageA(tagMSG * 0x0041a8c8 {msg=0x00000202 wp=0x00000000 lp=0x00040033}) line 179 + 33 bytes CWnd::PreTranslateInput(tagMSG * 0x0041a8c8 {msg=0x00000202 wp=0x00000000 lp=0x00040033}) line 3424 CDialog::PreTranslateMessage(tagMSG * 0x0041a8c8 {msg=0x00000202 wp=0x00000000 lp=0x00040033}) line 92 CWnd::WalkPreTranslateTree(HWND__ * 0x00470134, tagMSG * 0x0041a8c8 {msg=0x00000202 wp=0x00000000 lp=0x00040033}) line 2667 + 18 bytes CWinThread::PreTranslateMessage(tagMSG * 0x0041a8c8 {msg=0x00000202 wp=0x00000000 lp=0x00040033}) line 665 + 18 bytes CWinThread::PumpMessage() line 841 + 30 bytes CWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes CDialog::DoModal() line 536 + 12 bytes CSerialAppApp::InitInstance() line 60 + 11 bytes AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f27, int 1) line 39 + 11 bytes WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f27, int 1) line 30 WinMainCRTStartup() line 330 + 54 bytes KERNEL32! 7c816d4f() Das steht drin Pfeil auf der 1. Zeile (CArray<int,int>::ElementAt(int 2) line 262 + 65 bytes) Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 Doppeklick mal auf die dritte Zeile, die mit CSerialAppDlg::OnButton2() line 325 + 16 bytes An der markierten Stelle findet der Zugriff mit ungültigem Index statt. Den Code musst du zeigen. Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 m_code_list.GetText(aryCodeList,Code); cool... woher wusstest du dass es genau da stattfindet ? möchte euch hier ja bei zukünftigen Fehlern nicht immer nerven müssen Zitieren
Klotzkopp Geschrieben 24. Oktober 2005 Geschrieben 24. Oktober 2005 cool... woher wusstest du dass es genau da stattfindet ?Ich wusste das gar nicht. Der Debugger weiß es. Ich weiß nur, wie man den richtig bedient Jedenfalls ist aryCodeList hier als Index falsch. Wenn du in dein CArray nur die selektierten Texte einträgst, kannst du nicht den Listbox-Index benutzen. Der ganze Code der Funktion wäre wohl interessant. Zitieren
Free99 Geschrieben 24. Oktober 2005 Autor Geschrieben 24. Oktober 2005 Steht zwar einmal im Anfangspost und einmal zwischendrin, aber gerne hier nochmal void CSerialAppDlg::OnButton2() { int CodeListCount = m_code_list.GetSelCount(); CArray<int,int> aryCodeList; aryCodeList.SetSize(CodeListCount); m_code_list.GetSelItems(CodeListCount,aryCodeList.GetData()); CString PHPQuery = ""; CString Trennzeichen = "__"; for (int i=0;i<=CodeListCount;i++) { CString Code; m_code_list.GetText(aryCodeList[i],Code); PHPQuery = PHPQuery + Code + Trennzeichen; } } langsam kapier ich was da schief läuft. Das Prog schreibt also die Indizes der ListBox als Index für CArray. Sprich es sieht etwa so aus wenn die Felder 1 4 5 und 7 angewählt sind: Bsp: CArray i - Inhalt 0 - 123456789 3 - 234567890 4 - 356897456 6 - 312365478 Dann is natürlich klar, dass er motzt wenns n Arrayfeld nicht gibt... Wobei... wenn ich nur eins anwähle gehts auch nicht... hmpf (bei nur einem gescannten) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.