2-Dimensionales Feld auf anderes Feld zeigen lassen



  • So, jetzt wollte ich es wissen und hab mal gesucht: google "c malloc tutorial"

    Ich finde es erstaunlich, wie viele Online-Tutorials den Cast im Beispielcode verwenden. Erstaunlich auch, wie viele davon im erklärenden Text den Cast entweder überhaupt nicht erwähnen oder zwar erwähnen, aber nicht begründen.

    "Rühmliche" Ausnahme ist http://www.c-howto.de/tutorial/arrays-felder/speicherverwaltung, mit folgender Begründung:

    Es ist jedoch sauberer und erleichtert die Arbeit, wenn man den Code später in C++ Projekten verwenden möchte.

    Verschwiegen wird freilich, warum das Weglassen "unsauber" sein soll. Und ob man denselben Code mit C- und C++-Compilern übersetzen sollte, darüber kann man auch geteilter Meinung sein.

    Übrigens: Keins der gefundenen Tutorials castet den Pointer, der an free() übergeben wird, zurück auf void*. Warum nicht? Wäre das nicht "sauberer"?



  • dennis98 schrieb:

    Nein, nur dass ich, wie schon gesagt, in einem "besseren" Buch nachschlagen soll

    Welche Bücher empfiehlt er denn? Kannste die Liste hier mal posten?



  • dennis98 schrieb:

    Schreiben Sie sein C–Programm–Fragment (also kein vollst¨andiges Programm), welches zun¨achst einen
    positiven ganzzahligen Wert n einliest, danach voll dynamisch eine n × n–Matrix A von int–Zeigern
    allokiert ...

    warum nicht so?

    ...
        // Pointer-Matrix erzeugen
        int **matrix = malloc(n*n*sizeof(int*));  
        // Matrix füllen
        int x,y;
        for (x=0; x<n; x++)
            for (y=0; y<n; y++)
                matrix[x*y] = malloc (L);
        ...
    

    Also ohne hässliche Dreifachzeiger.


  • Mod

    Dynamische mehrdimensionale Felder sind übrigens DER Anwendungszweck für den VLAs (variable length arrays) perfekt sind. Also nicht in dem Sinne, dass man das ganze Dingen als VLA macht (das wäre genau der falsche Anwendungszweck), sondern dass man damit dynamisch den korrekten Zeigertypen für das malloc erzeugen kann. Somit hat man ganz korrekt ein zusammenhängendes Feld (viele Leute hier im Thread haben fälschlich etwas gezeigt, wo alles wild und ineffizient kreuz und quer verteilt ist) und hat trotzdem die bequeme Möglichkeit, die Adressierung der Indizes vom Compiler automatisch berechnen zu lassen, anstatt selber dafür eine Funktion schreiben zu müssen.

    Beispielhaft für ein 2D-Feld von ints:

    int N = 10, M = 20;  // keine Konstanten!
    int (*array)[M] = malloc(N*M*sizeof(int)); 
    array[4][7] = 3;  // Geht!
    

    Ich überlasse es dem geneigten Leser, dies auf die Aufgabenstellung zu übertragen, wo verlangt wird, dass es ein 2D-Feld von int* sein soll, die dann jeweils auf ein dynamisch erzeugtes 1D-Feld zeigen sollen. Wobei ich es komisch finde, dass man da kein 3D-Feld haben möchte. Absicht, um verschiedene Mechanismen zu üben, oder Unwissen, dass dies überhaupt möglich wäre?



  • Welche Bücher empfiehlt er denn?

    Dazu sagt er nichts genaues



  • Say no to triple* schrieb:

    warum nicht so?

    Weil das hier falsch ist:

    matrix[x*y] = malloc (L);
    

    Spiel die Doppelschleife mal durch und achte drauf, welche Werte x*y annimmt.



  • dennis98 schrieb:

    Welche Bücher empfiehlt er denn?

    Dazu sagt er nichts genaues

    Nicht mal ne Literaturliste zur Vorlesung? Das gehört sich aber eigentlich so ...



  • Printe schrieb:

    Say no to triple* schrieb:

    warum nicht so?

    Weil das hier falsch ist:

    matrix[x*y] = malloc (L);
    

    Spiel die Doppelschleife mal durch und achte drauf, welche Werte x*y annimmt.

    Richtig, war unachtsam. Muss [n*x+y] statt [x*y] sein.



  • don't like triple* schrieb:

    Richtig, war unachtsam. Muss [n*x+y] statt [x*y] sein.

    Genau. Aber das "Matrix-Feeling" geht bei deiner Anordnung verloren, du kannst nicht mit matrix[i][j] auf die Elemente zugreifen.


  • Mod

    Wozu man mehrfach malloc aufrufen muss, wenn doch in dem Speicher alles leben kann, wird sich mir wohl nie erschliessen.

    int** matrix = calloc(n*(sizeof(*matrix)+n*sizeof(**matrix))); // wir können auch gleich schön initialisieren
        for (int i=0; i!=n; i++)
            matrix[i] = (int*)(matrix+n)+i*n; // wo ist das decltype(*matrix) für C ?
    

Anmelden zum Antworten