[VC++] porownanie string'ow daje FALSE, choć nie powinno

0

Witam.

	char *pBuf = new char[1025];
	int iBufRozm = 1024;
	int iOdebrano;


	int iLiczbaCz;
	int iAktualnaCz;
	int iAktualnyOdbior;
	int iLiczbaOdbior;
	CString strAktualnaCz;
	CString strAktualnyOdbior;

	CString strOdebrany;



	// Odebranie komunikatu
	iOdebrano = m_sGniazdoPoloczenia.Receive(pBuf, iBufRozm);
	// Czy cokolwiek zostało odebrane
	if (iOdebrano == SOCKET_ERROR)
	{
	}
	else
	{
			// Wstawienie znaku końca komunikatu
		pBuf[iOdebrano] = NULL;
		// Skopiowanie komunikatu do obiektu klasy CString
		strOdebrany = pBuf;

	
	
		m_ctlOdebrane.AddString(strOdebrany);
		// Uaktualnienie okna dialogowego
		m_ctlListaKodow.ResetContent();
		UpdateData(FALSE);




	iLiczbaCz = m_ctlListaKodow.GetCount();
	iLiczbaOdbior = m_ctlOdebrane.GetCount();
	iAktualnyOdbior = 0;
m_ctlOdebrane.GetText((iAktualnyOdbior), strAktualnyOdbior);
m_edit2 = strAktualnyOdbior;
UpdateData(FALSE);

for (iAktualnaCz = iLiczbaCz; iAktualnaCz > 0; iAktualnaCz--)
{

m_ctlListaKodow.GetText((iAktualnaCz -1 ), strAktualnaCz);
m_edit = strAktualnaCz;
m_edit2 = strAktualnyOdbior;
UpdateData(FALSE);

if (m_edit == m_edit2)
MessageBox("dsad");

}




Ostatnia instrukcja warunkowa

if (m_edit == m_edit2)
MessageBox("dsad");

Nie działa mi. Nie mam pojęcia dlaczego skoro w oknie dialogowym na obu polach edit mam to samo.
Ale gdy dam if (m_edit == m_edit) to polecenie mi działa (wiadomo ;) )

Program: Oczywiście Visual C++ 6.0

P.S. Wiem, że zrobiłem wcześniej temat o listboxie ale ten przedstawia inny problem.

0

Do cholery, to jest MFC... MFC nie ma zdefinowanych operatorów do takich rzeczy, po poprzednich wątkach już to powinieneś wiedzieć... Pewnie będzie coś takiego:

CString text1, text2;
m_edit.GetWindowText(text1);
m_edit2.GetWindowText(text2);
if (text1 == text2)
    MessageBox("dsad");

Oczywiście do helpa\na MSDN zaglądałeś...

0

Ale jak w InitDialog dam:

m_edit = "lol";
m_edit2 = "lol";
if (m_edit == m_edit2)
MessageBox("dsadas");

To wszystko działa ;)

A co do Twojego kodu to jak go użyje to:
'GetWindowTextA' : is not a member of 'CString'

a poza tym jak zamiast zmiennych m_edit2 i m_edit użyje zmiennych text1 i text2 to program i tak niedziała poprawnie ;)

0

Operator== w przypadku kontrolek jest do sprawdzania czy mają to samo HWND, czy to ta sama kontrolka. Jak znam życie to w InitDialog po prostu jeszcze samych kontrolek nie ma i oba HWND są ustawione na 0.

Bozia helpa nie dała? Umiesz powiedzieć gdzie ten errror masz, i czy tylko bezmyślnie przepisałeś?

0

Ten error mam tam gdzie zastosowałem GetWindowText z Twojego przykładu.
A error wkleiłem, żebyś wiedział, że Twój kod jest niepoprawny a nie dlatego że nie wiem co znaczy.

I co powiesz na temat zamiany m_edit2 i m_edit na CString text1 i text2?
Bo wtedy też nie pokazuje się MessageBox

0

Człowieku, m_edit to co to jest w końcu? Bo z errora wynika, że CString, CEdit się na CString nie konwertuje...

0

no m_edit to jest przecież zmienna CString..
W Classwizard przy dodawaniu zmiennej do pola IDC_EDIT można wybrać int, CString i inne.

I nie mówie o zamianie m_edit na text1 w stylu: text1 = m_edit;
tylko zamienić w kodzie źródłowym, żeby zamiast używania m_edit, używana była zmienna CString text1.

Może dodam, jakie zadanie ma spełniać program.
Program jest jakby serwerem.
W programie jest ListBox m_ctlOdebrane

Inny program wysyła ciąg znaków do serwera.
Jeśli serwer znajdzie określony ciąg znaków w pliku tekstowym to wyświetla np. MessageBox;

0

Tak, tylko pogratulować sensownego nazewnictwa...

Odpowiedź jest prosta, te CStringi nie są równe, wypisz sobie na konsolę\wyświetl co dokładnie porównujesz.

0

Nie są równe? To by teoretycznie wyjaśniało czemu program nie spełnia swojego zadania.
No to co mam zrobić żeby były równe?

0

Przypisz im te same wartości?

0

Przecież przypisuję

.....
iAktualnyOdbior = 0;
m_ctlOdebrane.GetText((iAktualnyOdbior), strAktualnyOdbior);
text1 = strAktualnyOdbior;
UpdateData(FALSE);

for (iAktualnaCz = iLiczbaCz; iAktualnaCz > 0; iAktualnaCz--)
{

m_ctlListaKodow.GetText((iAktualnaCz -1 ), strAktualnaCz);
text2 = strAktualnaCz;
UpdateData(FALSE);

if (text1 == text2)
MessageBox("dsad");

}

W listboxie m_ctlListaKodów mam takie wyrazy jak: Ala, Kot, Pies.
Gdy w kliencie wpiszę "Kot", w ten sposób do listboxa m_ctlOdebrane zostanie dodany ciąg znaków "Kot".
Następnie porównywane jest to co widać w kodzie. A mimo wszystko MessageBox się nie pojawia.
Jak Ty byś zmienił ten kod żeby to działało? Bo z tego co napisałem to powinno działać ale nie działa.

0

Debuggera nie masz? Wyświetl sobie co konkretnie porównujesz...

0

W Debuggerze wychodzi mi tylko:

Warning: no listbox item selected.

Ale nadal nie wiem jak to się może mieć do problemu bo nie potrzeba mi żadnego zaznaczania elementów listy.

0

asdf - policz do 10ciu, albo do 1000ca :)

marcin - postaw breakpointa na linijce z tym feralnym IF'em i jak program do niej dotrze, obejrzyj DOKLADNIE jakie wartosci maja te dwa string'i. skoro == zwraca FALSE, musza sie te stringi roznic. sprawdz czym sie roznia. moze to byc [CIACH!] w stylu spacja/enter na poczatku/koncu stringa itp

ps. i popraw temat na sensowniejszy i bardziej mowiacy o tym, w czym jest problem. "nie dziala" jest pustoslowiem

0

No i ruszyliśmy chyba trochę do przodu.
Po użyciu breakpointa w miejscu IFa mam
(screen)
http://odsiebie.com/pokaz/2639303---9cb5.html

Wydaje się że pierwszy m_edit różni się się od m_edit2. Czy to tylko mnie się tak wydaje?

0

Tja, enter na końcu stringa...

0

To nie jest enter, po podwójnym kliknięciu ciąg znaków jest bez entera (jest znów {"123qwe"}
Zresztą jakim cudem może być tam enter? Może i banalnie można usunąć ten enter ale ja nie wiem jak.

Edit:
Potworzyłem zmienne int dlugosc1, dlugosc2
I do dlugosc1 przypisalem dlugosc m_edit (m_edit.GetLength() )
z drugą zrpbiłem tak samo i wyszło że zmienna zczytywana z Listboxa jest o jeden znak dłuższa.

0
MarcinUser napisał(a)

To nie jest enter

wiesz, kłóć się z własnym screenshotem.. na nim jest wyraznie lamanie linii, czyli \n albo \r\n

Zresztą jakim cudem może być tam enter?

bo to listbox, ktore operuje na liniach tekstu?

0

Ok może to i jest enter :) . To skoro jesteśmy przy temacie to jak skrócić Stringa o jeden znak?

Edit:
Ok nie wiem jak odjąć od Stringa ale wiem jak dodać. Zatem dodałem do tego edita (który miał mniej znaków) znak "\n" i wszystko działa.

Bez tego BreakPointa by się nic nie udało!
Dzięki jeszcze raz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1