Domanda

Va bene, così sto continuando a lavorare sul mio piccolo motore di gioco per insegnare a me C # / C ++ di più. Ora sto cercando di scrivere un modo di memorizzare i dati in un formato binario, che ho creato. (Questo è l'apprendimento, io voglio fare questo la mia auto da zero). Quello che mi chiedo qual è il modo migliore di trattare con gli array di lunghezza variabile all'interno di una struttura durante la lettura in C ++?

es. Ecco quello che hanno attualmente per le mie strutture:

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

Ora, come potrei fare per in C ++ di leggere questo come una struttura in C ++? Ero un pò speravo di andare in giro a leggere ciascuno degli elementi uno ad uno e copiandole in una struttura.

L'unica vera esercitazione ho trovato su questo è questo: http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1�

mi prendo un ipotesi e dire la lettura di questo in una struttura di C ++ non è davvero possibile corretta?

È stato utile?

Soluzione

Lo si può leggere dalla mappatura formato binario una copia di queste strutture. Ogni array deve essere trattato come un puntatore e si dovrebbe avere un intero con la dimensione di questo array.

Per esempio, in

C #

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

C ++

    struct A {
        int length
        char* vector
    }

Note: Byte ha le stesse dimensioni di carattere

.

Quando si legge da un binario è possibile leggere il primo 4 byte (int è 32 alias 4 byte) e allocare 4 + (lunghezza readed) dopo che è possibile leggere direttamente al buffer allocato e trattare come una struttura.

		

Altri suggerimenti

Non c'è alcuna cosa come una matrice di lunghezza variabile in una struttura.

Supponiamo che io avevo un point struttura come

struct point
{
    int x;
    int y;
}

Se avessi voluto una serie di 5 di questi, il compilatore essenzialmente riservare spazio per 10 int. Cosa accade se chiedere un array di strutture, di cui ciascuno contiene una matrice di lunghezza variabile? Non c'è modo per allineare quelli in memoria dal momento che non siamo in grado di sapere quanto spazio da riservare per ciascuno di essi.

Quello che possono fare è dichiarare un puntatore per il tipo di cui si desidera una matrice di lunghezza variabile, perché un puntatore è una dimensione costante. Poi, si alloca memoria sufficiente per tutto il molti casi di questo tipo, e puntare a quel modo. Avrete probabilmente bisogno di aggiungere anche un campo length alla struct in modo da sapere esattamente quanto lontano si può andare oltre il puntatore prima di rischiare va in segfault.

Si potrebbe ottenere un po 'peloso andando avanti e indietro tra il codice gestito e non gestito e alla ripartizione e liberando la memoria, ma questo è un altro buon esercizio per imparare il C ++ e C # insieme, se non altro.

Usa Marshall.StructToPtr e lunghezza della copia di struttura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top