Pregunta

De acuerdo, así que continúo trabajando en mi motor de juego poco que enseñar a mí C # / C ++ más. Ahora estoy tratando de escribir una forma de almacenar los datos en un formato binario, que he creado. (Este es el aprendizaje, quiero hacerlo a mi auto desde cero). Lo que me pregunto ¿cuál es la mejor manera de hacer frente a las matrices de longitud variable dentro de una estructura cuando se lee en C ++?

por ejemplo. Esto es lo que actualmente tengo para mis estructuras:

 [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryHeader
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
        public Int32 m_NumberOfRecords;
        public FooBinaryRecordHeader[] m_BinaryRecordHeaders;
        public FooBinaryRecord[] m_BinaryRecords;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecordHeader
    {
        public Int32 m_FileNameLength;
        public char[] m_FileName;
        public Int64 m_Offset;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecord
    {
        public bool m_IsEncrypted;
        public Int64 m_DataSize;
        public byte[] m_Data;
    }

Ahora, ¿cómo hago para en C ++ para leer realmente esto en una estructura como en C ++? Estaba un poco la esperanza de conseguir alrededor de la lectura de cada uno de los elementos uno por uno y copiarlas en una estructura.

La única verdadera tutorial que encontré en esto es la siguiente: http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1�

Voy a tomar una conjetura salvaje y decir la lectura de esto en una estructura de C ++ no es realmente posible correcta?

¿Fue útil?

Solución

Se puede leer de cartografía formato binario una copia de estas estructuras. Cada matriz debe ser tratado como un puntero y usted debe tener un número entero con el tamaño de esta matriz.

Por ejemplo, en

C #

    [StructLayout(LayoutKind.Sequential)]
    public struct A
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
    }

C ++

    struct A {
        int length
        char* vector
    }

Notas: byte tiene el mismo tamaño de carbón

.

Cuando se lee desde un binario se puede leer la primera 4 byte (int es 32 aka 4 byte) y asignar 4 + (longitud leido) después de que se puede leer directamente a la memoria temporal asignada y tratar como una estructura.

		

Otros consejos

No hay tal cosa como una matriz de longitud variable en una estructura.

Supongamos que tenía un point estructura tal como

struct point
{
    int x;
    int y;
}

Si quería una serie de 5 de estos, el compilador reserva espacio para 10 esencialmente enteros. ¿Qué pasa si pido una matriz de estructuras, de las cuales cada una contiene una matriz de longitud variable? No hay manera de alinear los de la memoria ya que no podemos saber cuánto espacio de reserva para cada uno.

Lo que pueden hacer es declarar un puntero para el tipo de la que desea una matriz de longitud variable, ya un puntero es un tamaño constante. A continuación, asignar suficiente memoria para sin embargo muchos casos de ese tipo, y el punto de que sea así. Es probable que necesite añadir también un campo length a la estructura, para saber exactamente qué tan lejos puede ir más allá del puntero antes de arriesgar violación de segmento.

Puede ser que consiga un poco difícil ir y venir entre el código administrado y no administrado y asignar y liberar memoria, pero eso es otro buen ejercicio para aprender C ++ y C # a la vez, en todo caso.

Uso Marshall.StructToPtr y longitud de la copia de la estructura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top