Mit malloc() ein mehrdimensionales Array reservieren ??



  • Hallo Leute,
    heute möchte ich mal ein mehrdimensionales Array dynamisch reservieren. Der Part mit malloc(); scheint auch zu funktionieren, aber leider sagt er mir, wenn ich auf das Array dann mit terrain_map[x][y] zugreifen will, 'invalid types `int[int]' for array subscript' (Dev-C++).

    int *terrain_map;
    int x,y;
    
    // Werte x,y einlesen...
    
    terrain_map = (int *) malloc(terrain_x*terrain_y*sizeof(int));
    
    // Danach zB: (gibt besagten Fehler)
    fscanf (Datei, "%d",&terrain_map[i][o]);
    

    Die Variable mit int *terrain_map[][] zu erstellen geht leider noch weniger 🙂

    Bitte um Eure Hilfe

    -mfg fnord





  • Dankeschön, so funktioniert es wunderbar:

    int **terrain_map;
    
    terrain_map = (int **)malloc(terrain_x * sizeof(int));
          for(i = 0; i <= terrain_x; i++)
            terrain_map[i] = (int *)malloc(terrain_y * sizeof(int));
    


  • Ich frage mich warum du extra noch die Casts reingebaut hast. Die sind in C vollkommen unnötig. Oder nimmst du etwa heimlich einen C++ Compiler? 😉



  • ähhm was sind Casts 😕

    und ja, es kommen auch einige c++ Sachen for, zumindest in meiner Engine 🙂

    ➡ fnord



  • **(int **)**malloc(...

    Das sind Casts.



  • Ja, ich benutze einen C++ Compiler, aber sags nicht weiter 🙂



  • Hi ihr beiden das was fnord geschrieben hat ist ganz normales ansi-c und den
    Cast auf ein int** braucht er weil malloc ein void pointer zurückgibt.

    Fnord hat einfach ein Array mit Pointern auf Pointer definiert.

    Lieben gruß



  • Dadda schrieb:

    Hi ihr beiden das was fnord geschrieben hat ist ganz normales ansi-c

    Ja.

    und den Cast auf ein int** braucht er

    Nein.



  • mach ich auch immer, hab ich mir so angewöhnt weil projekte in visual studio standardmäßig mit cpp dateien erstellt werden und er dann rumnervt wenn man nicht castet



  • nichtsdestotrotz ist C kein C++ und das casten von pointern auf void ist grober unfug.

    wenn der compiler nervt, sollte man ueberlegen wieso und nicht einfach irgendwas machen, damit er nicht mehr nervt...



  • ich habe grad noch mit dem gcc compiler colmpiliert und er braucht ein cast. wie schon gesagt malloc gibt ein void pointer zurüch deshalb der cast. Egal ob c oder cpp.
    Lieben gruß



  • Dadda schrieb:

    ich habe grad noch mit dem gcc compiler colmpiliert und er braucht ein cast. wie schon gesagt malloc gibt ein void pointer zurüch deshalb der cast. Egal ob c oder cpp.
    Lieben gruß

    falsch. ansi c standard und gcc geben mir recht, in c muessen void* nicht gecastet werden und gcc meckert auch nicht.
    zeig doch mal deine compilerflags und die endung deiner datei.



  • Dann kannst Du den gcc nicht bedienen:

    $ cat foo.c 
    #include <stdlib.h>
    
    int main(void) {
            int *foo = malloc(sizeof(int));
            free(foo);
            return 0;
    }
    $ gcc -W -Wall foo.c
    $ gcc -W -Wall --std=c99 foo.c
    $
    


  • Erstmal entschuldigung: Ihr habt natürlich recht es kommt kein fehler aber eine warnung die wie folgt lautet assigment makes pointer from integer without cast ok



  • Dadda schrieb:

    Erstmal entschuldigung: Ihr habt natürlich recht es kommt kein fehler aber eine warnung die wie folgt lautet assigment makes pointer from integer without cast ok

    Dann hast Du anscheinend vergessen, stdlib.h zu inkludieren. Das ist ein Problem, das man durch einen Cast nur scheinbar beheben kann.



  • Erstmal entschuldigung: Ihr habt natürlich recht es kommt kein fehler aber eine warnung die wie folgt lautet assigment makes pointer from integer without cast ok



  • ach es gibt schlimmere fehler als ein cast zu viel crackwitz mein freund, da bricht noch keine welt zusammen



  • Hier liegt aber offenbar genau ein Fall vor, wo der Prototyp fehlt (weil stdlib.h nicht eingebunden), der Compiler also VERMUTET, daß int zurückgegeben wird. Die Umwandlung von void* nach int muß aber überhaupt nicht funktionieren und kann auch 'komische' Werte liefern. Wenn man jetzt hier castet, dann verdeckt man diese Warnung und das Programm wird sich auf einigen Systemen völlig falsch verhalten.

    In C++/C99 ist das alles kein Problem, dort compiliert das Programm gar nicht erst, wenn stdlib.h nicht eingebunden wurde.



  • Dadda schrieb:

    Erstmal entschuldigung: Ihr habt natürlich recht es kommt kein fehler aber eine warnung die wie folgt lautet assigment makes pointer from integer without cast ok

    wie meine Vorgänger bereits sagen, du hast vielleicht keine stdlib.h includiert. Aber ein Problem hast du immer noch, denn durch casten hast du nur die Warnung ausgeschaltet, nicht das Problem, ist das wäre, dass der Compiler keine Ahnung hat, wie die Funktion malloc aussieht, als int, als void, als double, als ... das weiß eben nicht der Compiler.


Anmelden zum Antworten