Creativess Temat założony przez niniejszego użytkownika |
Ostrzeżenie o różnych typach zmiennych » 2021-06-07 12:43:39 Witam Chciał bym uzyskać pomoc odnośnie tego błędu, próbowałem również zadeklarować tmp jako signed, ale wciąż ten sam błąd. Log kompilacji: warning: comparison of integer expressions of different signedness: ‘int32_t’ {aka ‘int’} and ‘std::__cxx11::basic_string<char>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare] if(tmp != std::string::npos and tmp >= 0x00) ~~~~^~~~~~ Funkcja: void Protocol76::parseOpenPriv( NetworkMessage & msg ) { std::string receiver; receiver = msg.GetString(); uint32_t tmp =( uint32_t ) receiver.find( " [", 0x00 ); if( tmp != std::string::npos and tmp >= 0x00 ) receiver = std::string( receiver, 0, tmp ); OTSYS_THREAD_LOCK_CLASS lockClass( game->gameLock, "Protocol76::parseOpenPriv()" ); Player * player = game->getPlayerByName( receiver ); if( player ) sendOpenPriv( player->getName() ); else sendTextMessage( MSG_SMALLINFO, "A player with this name is not online." ); } |
|
DejaVu |
» 2021-06-07 13:03:14 Porównujesz różne typy tj. string do int. Musisz albo przekonwertować inta na stringa lub stringa na inta (tj. porównywać te same typy). |
|
Creativess Temat założony przez niniejszego użytkownika |
» 2021-06-07 13:57:47 Przeoczyłem, jeszcze jeden warning w tej samej linijce co powyżej.. log: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits] if(tmp != std::string::npos and tmp >= 0x00) ~~~~^~~~~~~
|
|
TemplateEntity |
» 2021-06-07 14:48:15 To co robisz to porównujesz typ uint32_t z size_t, co prowadzi do niejawnej konwersji i w efekcie dostajesz ostrzeżenia kompilatora. W drugim przypadku jak sam komunikat mówi, wyrażenie tmp >= 0x00 jest zawsze prawdziwe, gdyż zmienna typu unsigned nie może być ujemna. Kod możesz trochę uprościć korzystają ze standardu C++11. void Protocol76::parseOpenPriv( NetworkMessage & msg ) { auto receiver = msg.GetString(); auto position = receiver.find( " [" ); OTSYS_THREAD_LOCK_CLASS lockClass( game->gameLock, "Protocol76::parseOpenPriv()" ); Player * player = game->getPlayerByName( receiver.substr( 0, position != std::string::npos ? position: receiver.size() ) ); if( player ) sendOpenPriv( player->getName() ); else sendTextMessage( MSG_SMALLINFO, "A player with this name is not online." ); }
|
|
TemplateEntity |
» 2021-06-07 14:49:22 |
|
Creativess Temat założony przez niniejszego użytkownika |
» 2021-06-07 14:51:22 Nieźle to wygląda z tym standardem C++11, tylko skąd deklaracja position? która nie jest użyta, warning: unused variable ‘position’ |
|
pekfos |
» 2021-06-07 16:54:54 auto position = receiver.find( " [" ); receiver.substr( 0, position != std::string::npos ? position: receiver.size() )
Wystarczy receiver.substr( 0, receiver.find( " [" ) )
bo npos też znaczy 'do końca napisu'. Jednak żadna z tych uproszczonych wersji nie ma tego samego znaczenia, bo oryginalny kod nie kopiował napisu w przypadkach gdy nie ma niczego do ucięcia. Najlepiej to zrobić tak std::string receiver = msg.GetString(); size_t tmp = receiver.find( " [" ); if( tmp != std::string::npos ) receiver.resize( tmp ); tylko skąd deklaracja position? która nie jest użyta W jego kodzie jest użyta, więc może coś źle wkeliłeś? |
|
Creativess Temat założony przez niniejszego użytkownika |
» 2021-06-07 17:39:16 Tak, rzeczywiście przeoczyłem, użycie deklaracji position, zastosowałem twoją poprawke, Pekfos. |
|
« 1 » |