2016-10-20 2 views
1

Я создал функцию, которая преобразует целочисленный ввод в другое целое число, которое оно возвращает. В частности, он принимает цвет консоли и возвращает соответствующий цвет, который имеет тот же фон, что и вход, но с белым символом.Почему эта функция не возвращает правильное значение?

Эта функция всегда возвращает 255. Что происходит не так?

int convertColorToPlayerColor(int color) 
{ 
    int playerColor = 0; 

    if (color <= 15) 
     playerColor = 15; 

    else if ((color > 15) && (color <= 31)) 
     playerColor = 31; 

    else if ((color > 31) && (color <= 47)) 
     playerColor = 47; 

    else if ((color > 47) && (color <= 63)) 
     playerColor = 63; 

    else if ((color > 63) && (color <= 79)) 
     playerColor = 79; 

    else if ((color > 79) && (color <= 95)) 
     playerColor = 95; 

    else if ((color > 95) && (color <= 111)) 
     playerColor = 111; 

    else if ((color > 111) && (color <= 127)) 
     playerColor = 127; 

    else if ((color > 127) && (color <= 143)) 
     playerColor = 159; 

    else if ((color > 159) && (color <= 175)) 
     playerColor = 175; 

    else if ((color > 175) && (color <= 191)) 
     playerColor = 191; 

    else if ((color > 191) && (color <= 207)) 
     playerColor = 207; 

    else if ((color > 207) && (color <= 223)) 
     playerColor = 223; 

    else if ((color > 223) && (color <= 239)) 
     playerColor = 239; 

    else if (color > 239); 
     playerColor = 255; 

    return playerColor; 
} 

ответ

4

У вас есть дополнительная точка с запятой:

else if (color > 239); // <--- the semicolon 

Дополнительная точка с запятой получает разобранную как «тогда» часть пустого if заявления. Это фактически превращает функцию в

[ a long-winded if-else statement ] 

playerColor = 255; 

return playerColor; 
+0

Ого, я чувствую себя очень глупым. Спасибо. –

1

Помимо что у вас есть дополнительные точки с запятой, вы можете сделать свою функцию способ проще с помощью return внутри if и удаление избыточных проверок:

if (color <= 15) 
     return 15; 

    if (color <= 31) // no need to check color > 15 
     return 31; 

    if (color <= 47) // no need to check color > 31 
     return 47; 
    ... 
    return 255; // no need for if (color > 239) 

Также вы можете сделать бинарный поиск вместо от линейной проверки:

int convertColorToPlayerColor(int color) 
{ 
    static std::vector<int> v { 15, 31, 47, 63, 79, 95, 111, 127, 143, 175, 191, 207, 223, 239 }; 
    auto it = std::lower_bound(v.begin(), v.end(), color); 
    return it == v.end() ? 255 : *it; 
} 

это не только сделает его более эффективным и коротким, но сделает его менее подверженным ошибкам (так как вам не нужно повторять цифры более одного раза). Просто имейте в виду, что значения в векторе должны быть отсортированы по порядку.

+0

Спасибо, я сделаю это. –

Смежные вопросы