Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.

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 :(

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

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

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

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

post-29764-14430447254733_thumb.jpg

das sind ja wieder diese nichts sagenden Fehler
Das 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.

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

post-29764-14430447254979_thumb.jpg

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.

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 :)

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) :(

kann leider meinen Post nich ändern:

Hab das Prog wieder hinbekommen mit Hilfe von div. Sicherungskopien

war das nich der letzte Post auf der 1. Seite ?

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.

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)

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 :)

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.

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)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.