Zum Inhalt springen

Probleme mit Array und String Addition


Free99

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...