Anzeige:
Ergebnis 1 bis 6 von 6

Thema: 2d array als Funktionsparameter

  1. #1
    Registrierter Benutzer
    Registriert seit
    23.03.2008
    Beiträge
    50

    2d array als Funktionsparameter

    Hallo,

    ich möchte einen 2d array

    double array[150][2];

    an eine Funktion übergeben, genauer die Adresse, denn ich möchte mit der Funktion den array verändern. Wie muss der Funktionsaufruf und die Funktionsdeklaration aussehen, damit das klappt? Ich habe verschiedene Dinge wie

    void function(double * array[150][2]);
    void function(double * (*&array)[2]);
    void function(double ** array);

    usw. ausprobiert, Funktionsaufruf mit wahlweise

    function(array);
    function(&array);

    In keinem Fall passen die Datentypen zusammen. Wie bekommt man das konsisten hin?

    Ghost

  2. #2
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Also eigentlich sollte
    Code:
    double array[][];
    void function(double** array);
    mit
    Code:
    function(array);
    funktionieren. Zumindest läuft fogelnder Code bei mir problemlos
    Code:
    void free_matrix(double** array, int size)
    {
        int i;
    
        for(i = 0; i < size;i++)
        {
            //Gibt den Speicher der "Spalten-Zeiger" wieder frei
            free(array[i]);
        }
    
        //Gibt den Speicher des "Zeilen-Zeiger" wieder frei
        free(array);
    }
    Code:
    free_matrix(matrix,size);
    C und C++

  3. #3
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    @Ghostrider: so sollte es funktionieren:
    Code:
    void function(double array[150][2]);
    void function(double (*array)[2]);
    Hilfreich ist dieser Link: http://c-faq.com/aryptr/ary2dfunc3.html.

    @Berufspenner: dein Code dürfe nur funktionieren, wenn matrix vom Typ Pointer auf Pointer (also double**) ist.
    Ein gebrechlich Wesen ist der X-Server.

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    @Berufspenner: Dein Code gibt in C eine Warnung und in C++ eine Fehlermeldung.

    Also gehe ich mal davon aus, dass der Threadersteller C++ nutzt.

    @Ghostrider: Eigentlich wäre void function(double array[][]); richtig, aber bei mehrdimensionalen Arrays muss der Compiler ja wissen, in welchen Schritten er auf die Arrayelemente zugreifen muss:
    Code:
    double array[A][B];
    array[c][d] = 0;
    In der zweiten Zeile muss auf array + c * B + d zugegriffen werden, also muss B bekannt sein. Deshalb musst du der Funktion auch alle Größenangaben außer der ersten nennen:
    Code:
    void function(double array[][2]);
    Damit kann die Funktion dann aber auch nur Arrays der Größe irgendwas*2 bearbeiten ...

    Also: Warum benutzt du nicht std::vector, wenn du schon in C++ programmierst?
    Code:
    #include <vector>
    std::vector< std::vector<double> > array(150, std::vector<double>(2));
    void function(std::vector< std::vector<double> > &array);
    Damit kannst du auch innerhalb der Funktion die Dimension abfragen.

  5. #5
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Zitat Zitat von ContainerDriver Beitrag anzeigen
    @Berufspenner: dein Code dürfe nur funktionieren, wenn matrix vom Typ Pointer auf Pointer (also double**) ist.
    Zitat Zitat von BLUESCREEN3D Beitrag anzeigen
    @Berufspenner: Dein Code gibt in C eine Warnung und in C++ eine Fehlermeldung.
    Ja, bei mir wars ein Doppelpointer auf ein durch calloc aloziertes Speicherfeld. Mir fällts auch auch grad wieder ein, dass man Felder != Pointer sind, also wenn man es ganz genau betrachtet. Von daher war mein Beitrag wohl nicht so hilfreich.
    C und C++

  6. #6
    Registrierter Benutzer
    Registriert seit
    23.03.2008
    Beiträge
    50
    ok Denkfehler meinerseits: Ich wollte unbedingt einen Pointer auf mein array übergeben, damit auch wirklich das Originalarray geändert wird. Da array aber selbst ein Pointer ist, ist das offenbar überflüssig. Der Code

    Code:
    function(double array[][2]){
    ...}
    
    ...main{
    double array[150][2]=...;
    function(array);
    funktioniert. Thx an alle!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •