• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

C++ sprawdzanie wartości zmiennej

Status
Not open for further replies.

GarQet

Own3d!
Joined
Feb 10, 2009
Messages
1,381
Solutions
14
Reaction score
81
Chciałbym jakąś funkcję, która sprawdza zawartość danego wyrażenia, jeżeli zawartość jest spełniona to wykonuje dalej warunek.
Czyli np.
Code:
bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text)
{	
	if(text == "!event \"W TYM MIEJSCU SPRAWDZA CO JEST NAPISANE PO CUDZYSŁOWIE"))
		return true;
	...
}
Jeżeli w miejscu W TYM MIEJSCU SPRAWDZA CO JEST NAPISANE PO CUDZYSŁOWIE wyraz składa się z jakichkolwiek liter z tego zbioru: "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM " to warunek zostaje spełniony.

Szukałem czegoś w necie, i znalazłem tylko jedno: strspn(). Ale niestety nie wiem jak dodać całą funkcję żeby potem ona była rozpoznawana i wykonywała swoją powinność. Jestem dość zielony w te klocki...
 
Last edited:
Code:
StringVec a = explodeString(" ", text, true, 1);
if(a.size() >  1)
{
	if(asLowerCaseString(a[0]) == "!event")
	{
		... wykorzystujesz sobie a[1], które jest parametrem.
	}
}

do tego potrzebujesz nowej funkcji explodeString, wklejonej do tools.cpp:
Code:
StringVec explodeString(const std::string& string, const std::string& separator, bool trim/* = true*/, uint16_t limit/* = 0*/)
{
	StringVec returnVector;
	size_t start = 0, end = 0;

	uint16_t i = 1;
	while((end = string.find(separator, start)) != std::string::npos)
	{
		std::string t = string.substr(start, end - start);
		if(trim)
			trimString(t);

		returnVector.push_back(t);
		start = end + separator.size();

		++i;
		if(limit > 0 && i > limit)
			break;
	}

	returnVector.push_back(string.substr(start));
	return returnVector;
}

i zmienione w nagłówku:
Code:
StringVec explodeString(const std::string& string, const std::string& separator, bool trim = true, uint16_t limit = 0);


Pytanie tylko, czemu nie zrobisz sobie tego w talkactions, gdzie cały podział jest już zrobiony?
 
Pytanie tylko, czemu nie zrobisz sobie tego w talkactions, gdzie cały podział jest już zrobiony?
Bo pewnie na inwobowni gra, a inwob płaci za wszystko, żeby mieć w c++ to i on nie chce być gorszy :D
 
Dzięki Elf za pomoc, zrozumiem jak już się nie udzielisz w tym temacie, ale jednego nie rozumiem. Co ma na celu ta nowa funkcja?
Bo ja chciałem tylko jednego, aby sprawdzić czy w parametrze text zawiera się słowo !event ", jeśli tak to wykonuje warunek.
Czyli gdy np. wpiszę w grze: !event "elo elo tararara, to ono sprawdza czy jest fraza !event ", jak jest to przepuszcza i wykonuje warunek. Ale gdy np. bym wpisał elo elo tararara !event " to wtedy warunek nie jest spełniony, bo po cudzysłowie musi być jakaś fraza ze zbioru: "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM " a najlepiej jakby jeszcze sprawdzało czy !event " jest pierwszą frazą parametru text.
Teraz tak naprawdę mam tą funkcję, kod i ono wgl. pomija warunki i przechodzi dalej, więc nie bardzo rozumiem działanie.
Może to ja jestem aż tak nie ogarnięty i nie kumam jak wykorzystać ten kod, mógłby mnie ktoś oświecić?

@Kula
0 progresu bo przestałem się tym zajmować. Wróciłem niedawno znów do tego bo jestem zbyt leniwy, żeby inaczej sobie dorabiać na wypady piątkowe.
A, no i dzięki za wypowiedź wnoszącą coś do tematu.
 
Last edited:
Teraz tak naprawdę mam tą funkcję, kod i ono wgl. pomija warunki i przechodzi dalej, więc nie bardzo rozumiem działanie.
Może to ja jestem aż tak nie ogarnięty i nie kumam jak wykorzystać ten kod, mógłby mnie ktoś oświecić?

3 lata, 0 progresu
 
Dobra, znów szperałem w necie i doszedłem do wniosku, że to i tak nie pomoże bo nic w nim nie ma co by mnie interesowało a jak jest to nie potrafię tego wykorzystać.
Zacząłem robić coś co by mi w jakikolwiek sposób pomogło w zrozumieniu tej funkcji.
I zrobiłem, że gdy jakikolwiek warunek zostanie spełniony to wypluwa mi tekst do gracza.
Co wyszło? Moim zdaniem ta funkcja nie działa poprawnie.
Code:
	if(a.size() >  1)
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "1");
	}
Gdy napiszę w grze jakąkolwiek (w sumie tylko jedną!) literkę z tego mojego zbioru to jest spełniony ten warunek. Czyli coś jest nie tak... Powinno spełniać warunek gdy ten napisany tekst będzie się składał z więcej niż jednej litery, a tu inaczej to rozpatruje. Warunek niby jest że większe niż 1 a działa na odwrót.
Dalej... Czytając post Elf'a wnioskuję iż ten warunek asLowerCaseString(a[0]) to jest główna fraza jaka jest wyszukiwana. Zamieniłem sobie że:
Code:
	if(asLowerCaseString(a[0]) == "e")
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "2");
	}
Gdy napiszę jedno e, czy dziesięć e czy jako pierwsze będzie e lub jako ostatnie w całym zdaniu. To nigdy nie jest spełniony ten warunek. Pytanie, dlaczego?
Dalej:
... wykorzystujesz sobie a[1], które jest parametrem.
Rozpatruje sobie to w taki sposób:
Code:
	if(a[1] == "e")
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "3");
	}
Próbowałem wszystkich możliwości nigdy ten warunek nie był spełniony.

Zatem wnioskuje, że chyba Elf się gdzieś machnął z kodem, bo jakoś szfankuje albo inaczej działa.
Ogólnie: gdy napiszę jedno e to jest spełniony warunek 1, gdy cokolwiek innego to żaden z warunków nie jest spełniony.
A, no i to StringVec a wygląda tak:
Code:
StringVec a = explodeString("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM ", text, true, 1);
Z resztą nie ważne jak wygląda bo i tak nic nie działa.

Proszę o jakąkolwiek pomoc, albo inne rozwiązanie.
 
ty, nie znam się zbyt na c++ ale jak czytam niektóre warunki np. ten na który zwrócił Ci uwagę MeNi to zastanawiam się jak to ma niby działać
 
Dobra, znów szperałem w necie i doszedłem do wniosku, że to i tak nie pomoże bo nic w nim nie ma co by mnie interesowało a jak jest to nie potrafię tego wykorzystać.
Zacząłem robić coś co by mi w jakikolwiek sposób pomogło w zrozumieniu tej funkcji.
I zrobiłem, że gdy jakikolwiek warunek zostanie spełniony to wypluwa mi tekst do gracza.
Co wyszło? Moim zdaniem ta funkcja nie działa poprawnie.
Code:
	if(a.size() >  1)
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "1");
	}
Gdy napiszę w grze jakąkolwiek (w sumie tylko jedną!) literkę z tego mojego zbioru to jest spełniony ten warunek. Czyli coś jest nie tak... Powinno spełniać warunek gdy ten napisany tekst będzie się składał z więcej niż jednej litery, a tu inaczej to rozpatruje. Warunek niby jest że większe niż 1 a działa na odwrót.
Dalej... Czytając post Elf'a wnioskuję iż ten warunek asLowerCaseString(a[0]) to jest główna fraza jaka jest wyszukiwana. Zamieniłem sobie że:
Code:
	if(asLowerCaseString(a[0]) == "e")
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "2");
	}
Gdy napiszę jedno e, czy dziesięć e czy jako pierwsze będzie e lub jako ostatnie w całym zdaniu. To nigdy nie jest spełniony ten warunek. Pytanie, dlaczego?
Dalej:

Rozpatruje sobie to w taki sposób:
Code:
	if(a[1] == "e")
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "3");
	}
Próbowałem wszystkich możliwości nigdy ten warunek nie był spełniony.

Zatem wnioskuje, że chyba Elf się gdzieś machnął z kodem, bo jakoś szfankuje albo inaczej działa.
Ogólnie: gdy napiszę jedno e to jest spełniony warunek 1, gdy cokolwiek innego to żaden z warunków nie jest spełniony.
A, no i to StringVec a wygląda tak:
Code:
StringVec a = explodeString("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM ", text, true, 1);
Z resztą nie ważne jak wygląda bo i tak nic nie działa.

Proszę o jakąkolwiek pomoc, albo inne rozwiązanie.

Prosiłbym Cię, abyś nie pisał, że się gdziekolwiek machnąłem, bo sobie tego nie życzę, skoro nawet nie wiesz, jak działa zwykłe explode (bazujące na php.net/explode).

"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM " - co to kurwa ma być? Po to dałem samo " ", jako delim~, abyś nie musiał się wysilać i za dużo myśleć, a Ty po polsku oczywiście pełne przekombinowanie.

Code:
	if(a.size() >  1)
	{
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "1");
	}

Trudno żebyś uzyskał inny wynik, skoro sprawdzasz wielkość wektoru (tablicy)... Zresztą, wynik będzie zawsze 1 lub 2, ponieważ do funkcji explodeString przekazujesz parametr limit = 1 - w przypadku nie znalezienia delimetera (czyli brak spacji- abyś zrozumiał), będzie 1; jeśli jednak znajdzie, to dwa.
Funkcja asLowerCaseString ułatwia wyszukiwanie konkretnych informacji poprzez zmniejszanie wielkości liter, aby inteligent właśnie Twojego pokroju nie musiał wstawiać czegoś takiego:

Code:
if(a[1] == "o" || a[1] == "O")

Widzę, że nawet z podstawami u Ciebie słaaaaaaabiutko... Wpis 0 w wektorze a to komenda, czyli będzie zawsze !event. Natomiast wpis 1 będzie zawsze Twoim parametrem. Czyli jak napiszesz !event chuj, to a[0] = "!event", natomiast a[1] = "chuj"

Teraz krótka lekcja o stringach... Jeśli pierdolniesz:
Code:
std::string string = "asdf";
if(string == "a")

to trudno, abyś uzyskał pozytywny wynik. Równie dobrze polecam iść dzielić przez zero, może wymyślisz nową teorię, bo jest to równoznaczne z:

Code:
if("asdf" == "a")

Jeśli natomiast chcesz sprawdzić czy pierwsza literka to a, to robisz to w zajebiście dziecinny sposób, bo porównujesz chary:

Code:
std::string string = "asdf";
if(string[0] == 'a')

wtedy zwróci Ci true. Jeśli chodzi o kolejne literki poza pierwszą, to sugeruję najpierw sprawdzać długość stringa, inaczej przyszłego pechowca korzystającego z Twojego jakże marnego kodu, za który nigdy nie powinieneś się brać bo najwyraźniej nadajesz się tylko do mycia podłóg i tylko na tym raczej dorobisz sobie na "wypady", spotka jakże smutny SEGV (segmentation fault). A na to też jest prosty sposób:

Code:
std::string string = "asdf";
if(string.length() > 1 && string[1] == 's')

I, uwaga, nie możesz sobie dobrowolnie wybierać między " i ', jak w Lua. " to całe stringi, ' to pojedyncze chary.
Próbowałem być miły, ale serio, zajmij się lepiej podłogami lub malowaniem ścian...
To była krótka lekcja, jak korzystać ze stringów i tablic w C++. Zapamiętaj ją lepiej, bo więcej nie będzie.
Ogólnie odradzam Tobie dalszą współpracę z tym językiem. Zasugerowałem Tobie powyższe rozwiązanie, ponieważ myślałem, że podstawy podstaw znasz. Niestety- myślę nawet, że po przeczytaniu tego posta wejdziesz na cplusplus.com i zaczniesz szukać różnić między char a string. I nie, żadnej "nowej" "funkcji" nie trzeba.

Odradzam również wszystkim w przyszłości korzystającym z usług GarQeta korzystania z nich, bo potem rodzą się gadki pt. TFS niestabilny. No i ogólnie dla własnego bezpieczeństwa.
 
String na char i odczytujesz znak po znaku, dalej jedynie opracować algorytm, który Cię interesuje.
 
#Elf
Cieszę się, że mi pomogłeś ale wypraszam sobie takie słowa w stosunku do mojej osoby! To, że nie uczęszczam do technikum informatycznego, a do ogólniaka bo chcę zdać maturę i wyjść na ludzi zarabiając normalne pieniądze a nie jak większość spędzić swoje życie przed komputerem przed kodem źródłowym, nie znaczy, że jestem jakiś nieudolny i nadaję się do bycia kmiotem. To, że nie znam podstaw tego języka o niczym nie świadczy a na pewno nie o tym jaki tak naprawdę jestem, więc teksty typu: "zajmij się lepiej podłogami lub malowaniem ścian" są nie na miejscu. Nie znasz mnie wgl. a jedynie co o mnie wiesz to, to, ze jestem kiepski w programowaniu (nie wiem czy nawet mogę to tak nazwać bo tego nie robię a próbuje coś dorabiać, jak widać z pomocą innych) o czym wspomniałem na samym początku tego tematu. Więc jeśli łaska nie mów mi co mam robić i bądź bardziej kulturalny wobec mojej osoby!

#Topic
Temat do zamknięcia, dzięki za pomoc.
 
#Elf
Cieszę się, że mi pomogłeś ale wypraszam sobie takie słowa w stosunku do mojej osoby! To, że nie uczęszczam do technikum informatycznego, a do ogólniaka bo chcę zdać maturę i wyjść na ludzi zarabiając normalne pieniądze a nie jak większość spędzić swoje życie przed komputerem przed kodem źródłowym, nie znaczy, że jestem jakiś nieudolny i nadaję się do bycia kmiotem. To, że nie znam podstaw tego języka o niczym nie świadczy a na pewno nie o tym jaki tak naprawdę jestem, więc teksty typu: "zajmij się lepiej podłogami lub malowaniem ścian" są nie na miejscu. Nie znasz mnie wgl. a jedynie co o mnie wiesz to, to, ze jestem kiepski w programowaniu (nie wiem czy nawet mogę to tak nazwać bo tego nie robię a próbuje coś dorabiać, jak widać z pomocą innych) o czym wspomniałem na samym początku tego tematu. Więc jeśli łaska nie mów mi co mam robić i bądź bardziej kulturalny wobec mojej osoby!

#Topic
Temat do zamknięcia, dzięki za pomoc.


elf ci powiedział, że nie umiesz programować

to ja ci też coś powiem..

jak już się wysilasz w stawianie interpunkcji i robisz nacisk na to, że jesteś uczniem liceum ogólnokształcącego, to chociaż stawiaj je dobrze i konsekwentnie albo poznaj zasady, bo wnioskując z tego co napisałeś, to albo tracisz kontrolę i się gubisz albo nie znasz zasad stawiania interpunkcji.
 
Status
Not open for further replies.
Back
Top