Pergunta

Ok, então eu estou continuando a trabalhar no meu pequeno motor de jogo para me ensinar C # / C ++ mais. Agora eu estou tentando escrever uma forma de armazenar dados em um formato binário, que eu criei. (Este é aprender, eu quero fazer isso a minha auto do zero). O que eu estou querendo saber qual é a melhor maneira de lidar com matrizes de comprimento variável dentro de uma estrutura quando lê-lo em C ++?

por exemplo. Aqui está o que eu tenho atualmente para meus estruturas:

 [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;
    }

Agora, como eu iria sobre em C ++ para realmente ler este em como uma estrutura em C ++? Eu estava esperando meio para contornar lendo cada um dos elementos um por um e copiá-los em uma estrutura.

A única verdadeira curso que eu encontrei sobre isso é o seguinte: http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1�

Eu vou tomar um palpite e dizer lendo isso em um C ++ estrutura não é realmente possível correto?

Foi útil?

Solução

Você pode lê-lo do mapeamento formato binário uma cópia dessas estruturas. Cada matriz deve ser tratado como um ponteiro e você deve ter um número inteiro com tamanho desta matriz.

Por exemplo,

C #

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

C ++

    struct A {
        int length
        char* vector
    }

Notas:. Byte tem o mesmo tamanho do carvão animal

Ao ler a partir de um binário pode ler o primeiro quatro bytes (int é 32 também conhecido por 4 bytes) e alocar 4 + (comprimento readed) depois de que pode ser lida directamente para a memória intermédia atribuída e tratar como uma estrutura A.

		

Outras dicas

Não há tal coisa como uma matriz de comprimento variável em uma estrutura.

Suponha que eu tinha um point estrutura como

struct point
{
    int x;
    int y;
}

Se eu quisesse uma série de 5 destes, o compilador espaço essencialmente reserva para 10 ints. O que acontece se eu pedir uma matriz de estruturas, dos quais cada um contém uma matriz de comprimento variável? Não há nenhuma maneira de alinhar os na memória, pois não podemos saber quanto espaço de reserva para cada um.

O que você pode fazer é declarar um ponteiro com o tipo de que você quer uma matriz de comprimento variável, porque um ponteiro é um tamanho constante. Então, você alocar memória suficiente para no entanto muitos casos desse tipo, e apontar para ele dessa forma. Você provavelmente precisará também adicionar um campo length para a estrutura que você saiba exatamente o quão longe você pode ir passado o ponteiro antes de arriscar segfaulting.

Pode ficar um pouco peludo indo e voltando entre o código gerenciado e não gerenciado e alocar e liberar memória, mas isso é outro bom exercício para aprender C ++ e C # juntos, se alguma coisa.

Use Marshall.StructToPtr e duração da cópia da estrutura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top