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.

Especificación en tiempo de compilación del tamaño del arreglo en C++

Estoy intentando crear una estructura para contener una cabecera de archivo dentro de la sección de declaraciones de una clase en un archivo de cabecera. Esto implica el cálculo de un valor que se conoce en tiempo de compilación y quiero usarlo para dimensionar un array dentro de la cabecera.

Este es un extracto de un archivo de cabecera de lo que he estado intentando recientemente:

const   uint    hFreeSiz    =   (1024 - sizeof(uint32_t) - sizeof (uint16_t)- sizeof (uint16_t) - sizeof(RId))/sizeof (RId);
template <const uint freedSiz>
struct  FBHead
{
    /** Un número mágico para el archivo. Indica tanto la clase como la versión. */
    uint32_t    fSig;
    /** El número de bytes de datos dentro de cada bloque. */
    uint16_t            blkSize;
    /** El número de registros disponibles para su reutilización. */
    uint16_t            freedCnt;
    /** El número de identificación del último registro escrito en el archivo. */
    RId lstRec;
    RId freedRecs[freedSiz];
};
FBHead<hFreeSiz>  fbHead;

pero me dice:

error: uso no válido del miembro de datos no estático ‘FBFile::hFreeSiz’

Podría calcular esto manualmente, pero estoy tratando de entender qué está pasando aquí y por qué no funciona. ¿Alguien puede explicarlo? (Supongo que si moviera la declaración constante fuera de la clase, funcionaría, pero preferiría mantenerla cerca de las cosas que se utilizan para modificarla. De hecho, si esa es la única respuesta, probablemente calcule a mano y agregue comentarios sobre por qué ese número en particular).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la declaración de hFreeSiz dentro del template de la estructura se está tratando como un miembro de dato no estático en lugar de una expresión constante. Esto significa que no se conoce en tiempo de compilación y no se puede utilizar para dimensionar un arreglo.

    Una solución es mover la declaración de hFreeSiz fuera del template de la estructura y definirla como una constante global. Esto permitirá evaluarla en tiempo de compilación y usarla para dimensionar el arreglo dentro del template de la estructura.

    Alternativamente, puedes utilizar un enfoque diferente para calcular el tamaño del arreglo dentro del template de la estructura. Una opción es utilizar std::array con un tamaño fijo en lugar de un arreglo estilo C, y calcular ese tamaño utilizando una función constexpr.

    Por ejemplo, podrías definir la estructura de esta manera:

    “`c++
    struct FBHead {
    static constexpr uint hFreeSiz = (1024 – sizeof(uint32_t) – sizeof(uint16_t) – sizeof(uint16_t) – sizeof(RId)) / sizeof(RId);

    uint32_t fSig;
    uint16_t blkSize;
    uint16_t freedCnt;
    RId lstRec;
    std::array<rid, hfreesiz=""> freedRecs;
    

    };
    “`

    Este enfoque utiliza una variable miembro estática constexpr para calcular el tamaño del arreglo en tiempo de compilación, y std::array para asegurar que el tamaño sea fijo y no pueda ser cambiado en tiempo de ejecución.</rid,>

Comments are closed.