array mit dynamischer Anzahl von Dimensionen



  • Geht sowas mit ANSI-C?
    Alternativ würde ich das über nen umweg implementieren, aber wäre auch nett wenn mensch einem Array dxnamisch die Anzahl seiner Dimensionen zuweisen könnte.

    mfg
    -bg-



  • wie meinst du das?
    waehrend der laufzeit?
    wenn ja, musst du mit malloc den speicher allokieren.



  • Wie wärs mit ner verketteten liste?



  • Mir ist schon klar, dass ich speiche allokieren muß, aber es ist ja z.B. möglich Arrays mit dynamisch großen Dimensionen erstellen.

    int array[]
    ...
    array = malloc (15*sizeof(int));
    ...
    

    Aber kann ich dem Array auch dynamisch neue Dimensionen zuordnen?

    Sonst würde ich einfach genug speicher allokieren, und würde die verwaltung in routinen unterbringen, aber es währe bedeutend sauberer wenn mensch direkt die Anzahl der Dimensionen zur Laufzeit zuordnen kann.

    mfg
    -bg-



  • Original erstellt von -bg-:
    ...
    Aber kann ich dem Array auch dynamisch neue Dimensionen zuordnen?
    ...

    Ja - das geht mit realloc().

    /* ... */
    char *array = malloc(...);
    /* ... */
    char *tmp = realloc(array, neue_groesse);
    if (tmp != NULL) array = tmp;
    else fehler();
    /* ... */
    

    -- ungetestet --



  • -- ungetestet --

    Funktioniert auch nicht so. 😃



  • Original erstellt von <Thomas>:
    Funktioniert auch nicht so. 😃

    wo siehst du denn einen Fehler?



  • Hallo Shade,

    neue_groesse ist ein nicht deklarierter Bezeichner. 🙂



  • Also ich meinte eigentlich nicht das hinzufügen von mehr Speicher (obwohl das natürlich damit zusammenhängt), sondern, dass ich den array dann mit mehreren Dimensionen ansprechen kann.
    Das müsste vielleicht so aussehen:

    int *array;
    
    newDimensions (5, 13, 6, 8, 7, 11); //Die *magische* Funktion würde nun eine 5 Dimensionale Matrix einrichten, die 1. wäre 13, die 2. 6, ... ints groß.
    //das statische Äquvialent dazu wäre 
    int array[13][6][8][7][11];
    

    Das Problem ist das der Compiler ja immer die reale Adresse berechnen müsste, wenn der komplette Array dabei zusammenhängend gespeichert wird ist das relativ einfach.
    In meinem Bsp. müsste er also die Anfrage

    array[a][b][c][d][e]
    

    so auflösen:

    *(array+a*(6*8*7*11*sizeof(int))+b*(8*7*11*sizeof(int))+c*(7*11*sizeof(int))+d*(11*sizeof(int)) +e*sizeof(int) );
    

    Ich hoffe das hiermit mein Problem, und vielleicht auch das des Compilers deutlich wird.

    mfg
    -bg-



  • Ach ja, meiner "Wunschfunktion" müsste mensch wohl noch das Datenelement (sprich array) zuordnen.

    mfg
    -bg-



  • das macht man ueber 1 dimension!

    mehr dimensionale arrays sind in C leider die hoelle 😞

    char* arr=malloc(xy);
    arr[x+y
    x] == [x][y]

    (wenn ich mich jetzt nicht vertan habe)

    Das ganze versteckt man dann hinter #defines:
    zB:
    DIM(arr,x,y)=3;



  • @Thomas:
    Sorry wenn ich mich hier mal einmische, aber neue_Grösse war einfach ein Beispielname damit er weiss, wie es aufgebaut ist. Das war kein funktionierender Sourcecode sondern ein Aufbau zum abstrahieren!



  • das ist ja krass, das sowas nicht geht. schon bei einfachen aufgaben wie matrixprodukt ist das doch superkacke wenn mann sich selbst um die indizes kümmern muß.



  • Was heißt einfachen Aufgaben, für den Compiler ist das durchaus komplex, denn wenn er soetwas können sollte, müsste er Variablen einfügen, wo der Proger keine definiert hat, und das wäre äußerst doof für systemnahe programmierung.

    mfg
    -bg-


Anmelden zum Antworten