Rzutowanie typów całkowitych wymaga dyscypliny

Kolejny niewinny fragment kodu (semantyka nie jest szczególnie istotna więc opisywanie jej sobie daruję):

for(unsigned i = 1; i < currPfx.size() - s2.size() + 1; ++ i)
{
    num = 10 * num + currPfx[i];
}

(zmienne currPfx i s2 to pewne string-i).

Wygląda niewinnie, nieprawdaż? Dla specyficznych danych zrzucało core. W wywołaniu currPfx[i]. W związku z tym, że i lądowało daleko poza zakresem poprawnych indeksów dla currPfx (uprzedzając pytanie: s2 zawsze miało długość co najmniej 1).

Pomogła zmiana na

int count = currPfx.size() - s2.size() + 1;
for(int i = 1; i < count; ++ i)
{
    num = 10 * num + currPfx[i];
}

Generowane przez niektóre kompilatory ostrzeżenia 'comparison between signed and unsigned' warto jednak oglądać...

komentarze obsługiwane przez Disqus