2016-07-05 25 views
0
typedef struct DT { 
    int ID;     /* Class ID of this training pattern */ 
    int VecDim;    /* Vector dimension in Mat */ 
    int VecNum;    /* Number of vectors in Mat */ 
    float **Mat;    /* Vector sequence */ 
    struct DT *Next; 
} DType; 

Ein 2D-Array ist in einem typedef struct definiert. Ich möchte in der Hauptfunktion darauf zugreifen, mit den Dimensionen [10000] [64]. Ich brauche 8 solcher Matrizen, wobei jede Matrix 64 Bytes Daten von einem Datenfeld liest. Die Operation ist derart, dass die ersten 64 Bytes des Datenarrays in der ersten Zeile der ersten Matrix, die nächsten 64 in der ersten Zeile der zweiten Matrix usw. gefüllt sind. Wenn alle 8 Matrizen ihre erste Reihe aufgefüllt haben, beginnt sie, die zweite Reihe jeder Matrix zu füllen. Hier ist ein 2D-Array, auf das ich in der Hauptfunktion zugreifen muss. Muss ich für jede erstellte Matrix einen separaten Speicher zuweisen?Zugriff auf ein 2D-Array, das in einer typedef-Struktur in der Hauptfunktion definiert ist. Code ist in C

+1

einschließlich dessen, was Sie in Ihrem 'main()' Funktion in Ihrer Frage – Cherubim

+0

helfen würde, als solche versucht haben, habe ich noch nicht bis jetzt versucht, aber Ich brauchte etwas Hilfe in Bezug auf die Syntax, um jeder Matrix, die ich erstellen werde, dynamischen Speicher zuzuordnen und dann die Daten in jeder Matrix entsprechend zu füllen. – mandar2589

+2

Ich sehe keine 2D-Arrays in Ihrer Strukturdefinition (die mehr wie "Float Mat [N] [M]" aussehen könnte). Alles, was ich sehe, ist ein Zeiger auf den Zeiger auf float ('float **'), der nach einer Definition "wie ein 2D-Array" verwendet werden kann oder auch nicht, aber ein einfaches 'float *' könnte auch verwendet werden "like" ein 2D-Array. Der Code (nicht nur eine Strukturdefinition) ist, wo diese Art von Sache bestimmt wird ... – twalberg

Antwort

0

Muss ich für jede erstellte Matrix einen separaten Speicher zuweisen?

Ja, wenn Sie es ein „baumelnden Zeiger“ nicht Mat einen Wert zuweisen, betrachtet und es nicht definiertes Verhalten verursachen Zugriff versucht zu. Sie müssen auch jeder Matrix einen eigenen Speicherblock zuweisen, sonst verweisen alle auf die gleiche Matrix. Siehe das Beispiel unten (unter der Annahme, dass dt eine verkettete Liste ist):

DType *dt = ...; 
while(dt) 
{ 
    dt->Mat = malloc(10000 * 64 * sizeof(float)); 
    dt = dt->Next; 
}