Hi, und zwar wollte ich fragen, ob es irgendeine möglichkeit gibt, ein mehrdimensionales Array unter C mit einer "einstellbaren" Größe zu deklarieren? Z.b.: Gibt der benutzer 20x25 ein und damit wird für ein 20x25 großeses Array Speicher reserviert. Danke
oder malloc() :-) Aber man muß halt bei mehrdimensionalen Feldern die Indexberechnung selber machen, weil man C-seitig ein eindimensionales Feld hat. Alternativ könnte man natürlich C++ nehmen...
detailierung: Variante 1: mit malloc ein Pointer-Array mit der Größe der ersten Dimension erzeugen und dann in einer Schleife die Pointer mit malloc auf die größe der 2. Dimension Allozieren Variante 2: mit malloc ein eindimensionales Array der Größe MxN erzeugen und die Transformation der Indizes selbst übernehmen. i_ij = i*n + j Variante 3: mit malloc ein Pointer-Array mit der Größe der ersten Dimension erzeugen und mit malloc ein eindimensionales Array der Größe MxN erzeugen. anschließen das Pointerarray mit geeigneten Zeigern in das eindimensionale Array befüllen, indem die selbe Berechnungsvorschrift, wie auch in Variante 2 zum einsatz kommt
Variante 4 (nur mit gcc oder C99): http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
1 | #include <stdio.h> |
2 | #include <inttypes.h> |
3 | |
4 | void get_dimensions(uint8_t* w, uint8_t* h) |
5 | {
|
6 | /* w und h koennte man hier auch einlesen */
|
7 | *w = 10; |
8 | *h = 5; |
9 | }
|
10 | |
11 | int main(void) |
12 | {
|
13 | uint8_t width; |
14 | uint8_t height; |
15 | get_dimensions(&width, &height); |
16 | |
17 | uint8_t arr[width][height]; |
18 | |
19 | for (uint8_t x = 0; x < width; ++x) |
20 | for (uint8_t y = 0; y < height; ++y) |
21 | arr[x][y] = y * 10 + x; |
22 | |
23 | for (uint8_t y = 0; y < height; ++y) |
24 | {
|
25 | for (uint8_t x = 0; x < width; ++x) |
26 | printf("%2u ", arr[x][y]); |
27 | printf("\n"); |
28 | }
|
29 | |
30 | printf("size = %d\n", sizeof(arr)); |
31 | printf("height = %d\n", sizeof(arr[0])); |
32 | printf("width = %d\n", sizeof(arr) / sizeof(arr[0])); |
33 | |
34 | |
35 | |
36 | return 0; |
37 | }
|
edit: mit
1 | gcc -std=c99 foo.c |
compilieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.