Forum: PC-Programmierung Array mit Benutzerdefinierter Größe


von Mike M. (mikeii)


Lesenswert?

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

von keine ahnung (Gast)


Lesenswert?

malloc()

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

malloc

von Mike M. (mikeii)


Lesenswert?

Danke :)

von Klaus W. (mfgkw)


Lesenswert?

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...

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Klaus Wachtler schrieb:

> oder malloc() :-)

Warum kommt eigentlich niemand mit calloc()?

von Peter II (Gast)


Lesenswert?

realloc

von Tom K. (ez81)


Lesenswert?

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
Noch kein Account? Hier anmelden.