2012-03-27 4 views
0

i haben eine dreidimensionale Bittabelle Array alswie man eine dynamische dreidimensionale Anordnung bilden, wo nur die erste Dimension die dynamische in c ist

bit_table[dim1][100][200];

Die zweiten und dritten Dimensionen sind immer gleich.

Aber dim1 müssen mit der Zeit wachsen.

wenn diese bit_table voll ist seine Größe müssen in der dim1 Dimension und der alten Inhalt muss wachsen, um

beibehalten werden, um den alten Inhalt der Tabelle zu behalten, sollte ich erstellen Sie einfach eine Temporäres Array, kopieren Sie die alten Array-Daten in dieses Array, und kopieren Sie diese Daten zurück, nachdem das Array erweitert wurde. Oder gibt es einen besseren Weg?

EDIT:

int dim1=10; 
unsigned char (*bit_table)[100][200] = (unsigned char)malloc(dim1 * sizeof(*bit_table)); 
printf("enter new dimension\n"); 
    scanf(dim1); 

....

Antwort

2

Man könnte so etwas tun:

int (*bit_table)[100][200] = malloc(dim1 * sizeof(*bit_table)); 

... 

bit_table = realloc(bit_table, dim1_new * sizeof(*bit_table)); 

... 

free(bit_table); 

Offensichtlich werden Sie entsprechende Fehlerbehandlung müssen für beide Anrufe. Insbesondere, wenn realloc (im obigen Code) fehlschlägt, dann werden Sie mit einem Speicherverlust enden.

+0

ich benutze vc2010 und ich bin stecken zu versuchen, den void-Typ von malloc zu unsigned char typisieren. Bitte sehen Sie meine Bearbeitung – John

+0

@ John: Warum würdest du das tun? 'bit_table' hat den Typ' unsigned char (*) [100] [200] ', nicht' unsigned char'; Außerdem ist das Umwandeln des Rückgabewerts von "malloc()" in C unnötig; Wenn Sie C++ verwenden, warum verwenden Sie keinen 'Vektor'? – Christoph

-2

Entschuldigung, aber ich sah hier keine besondere Schwierigkeit. Neben der realloc wie Charlesworth erwähnt. Sie können auch:

typedef unsigned char bit_table_elem[100][200]; 

// if you're using c, linked list will be a good choice 
// but if you really need indexing, then use the realloc way... 
struct bit_table_list { 
    bit_table_elem elem; 
    struct bit_table_list* next; 
} 

// if you're using c++, std vector will be better 
std::vector<bit_table_elem> bit_table 
+0

Eine verkettete Liste kann für willkürliche Größenänderungen gut sein, aber sie ist schlecht für Array-artigen Zugriff. –

+0

@OliCharlesworth: Ja, deshalb habe ich den Kommentar "wenn Sie Indexierung benötigen, dann verwenden Sie den Realloc-Weg". –