es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tratando con enteros sin signo

Sé que los enteros sin signo son infames y generalmente evitados por los desarrolladores de C++. Tengo una clase con dos variables miembro de tipo int que no deben contener valores negativos:

.
.
.
private:
    int m_Y_AxisLen;
    int m_X_AxisLen;
.
.
.

He diseñado la lógica de las funciones miembro de manera que evita cualquier entrada de números negativos. Así que me he asegurado de que esas dos variables miembro no tengan valores negativos.

Pero esto también genera algunas advertencias cuando uso PVS-Studio. Por ejemplo, aquí:

for (int row = 0; row < getY_AxisLen(); ++row)
{
    for (int column = 0; column < getX_AxisLen() - 1; ++column)
    {
        if (m_characterMatrix[row][column] == getFillCharacter())
        {
            m_characterMatrix[row][column] = fillCharacter;
        }
    }
}

PVS-Studio me culpa por los índices row y column no siendo del tipo memsize. Probablemente eso signifique que debería haber utilizado std::size_t row y std::size_t column ¿no?

Pero si lo hubiera hecho de esa manera, seguiría quejándose y diría que comparar un tipo integral sin signo con getY_AxisLen() (que devuelve un int) es peligroso.

Así que esta es la razón por la que quiero reescribir partes de mi clase para cambiar a esto:

private:
    uint32_t m_Y_AxisLen;
    uint32_t m_X_AxisLen;

Humildemente, busco ideas y consejos de profesionales que hayan enfrentado este tipo de problemas antes. ¿Cuál sería su enfoque cuando se trata de estos problemas?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c++, arrays, unsigned-integer, static-code-analysis y PVS-Studio, recomendaría utilizar std::size_t para row y column como sugiere PVS-Studio. También puedes considerar utilizar uint32_t para m_Y_AxisLen y m_X_AxisLen para evitar las advertencias sobre la comparación de tipos enteros sin signo con getY_AxisLen().

    Para evitar valores de entrada negativos, puedes utilizar unsigned int o std::size_t como tipos de parámetro para las funciones miembro que aceptan valores de entrada para m_Y_AxisLen y m_X_AxisLen. También puedes considerar rediseñar tu clase para utilizar std::vector en lugar de arrays y aprovechar su verificación de límites incorporada.

    En general, mi enfoque sería priorizar la corrección y legibilidad sobre el rendimiento cuando se trata de lidiar con enteros sin signo e índices de array. Es importante evitar posibles errores y comportamientos indefinidos que pueden surgir al utilizar enteros sin signo incorrectamente, y también es importante hacer que tu código sea fácil de entender y mantener tanto para ti como para otros desarrolladores.

Comments are closed.