Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ostrzeżenie o różnych typach zmiennych

Ostatnio zmodyfikowano 2021-06-07 17:39
Autor Wiadomość
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:
C/C++
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 ) // linijka wskazana przez kompilator
       
 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." );
   
}
P-178732
» 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).
P-178733
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)
                                  ~~~~^~~~~~~
P-178734
» 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.
C/C++
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." );
   
}
P-178735
» 2021-06-07 14:49:22
P-178736
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’
P-178737
» 2021-06-07 16:54:54
C/C++
auto position = receiver.find( " [" );
receiver.substr( 0, position != std::string::npos ? position: receiver.size() )
Wystarczy
C/C++
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
C/C++
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ś?
P-178741
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.
P-178743
« 1 »
  Strona 1 z 1