Mehrdimensionales Array an Funktion übergeben



  • @SeppJ
    1. Er will call-by-value
    2. Wie funktioniert das mit den Dimensionen bei deinem Vorschlag?



  • Baumschubser schrieb:

    ich möchte die Werte eines mehrdimensionalen Arrays an eine Funktion übergeben (call by value)

    Call by value ist mit Arrays nicht möglich.

    Nimm aber einen Array-Wrapper wie std::tr1::array (und wenn du keine TR1-Unterstützung hast, boost::array ), dann kannst du Arrays wie ganz normale Klasseninstanzen behandeln.

    #include <array>
    
    // Verschachteltes Array
    typedef std::tr1::array<std::tr1::array<float, 3>, 3> FloatMultiArray;
    
    void Function1(FloatMultiArray a);        // call by value
    void Function2(const FloatMultiArray& a); // call by reference
    
    int main()
    {
        FloatMultiArray Array = {{1,2,3}, {4,5,6}, {7,8,9}}; // Initialisierungsliste
        Function1(Array);
        Function2(Array);
    }
    

    Oder bilde die zwei Dimensionen auf eine ab. Du kannst auch std::vector verwenden, dann hast du einfach dynamische Speicherverwaltung.



  • @SeppJ
    Ein zweidimensionales Array ist kein Doppelzeiger..


  • Mod

    edit: Hier stand Quatsch, den ich jetzt nicht korrigieren möchte. Nexus hat genügend bessere Alternativen zu mehrdimensionalen Arrays genannt.



  • Woher hast du denn diese Weisheiten? So ist das nicht!

    int A[5][5];
    // Die Speicherzellen sind nicht gleich!
    	cout << (&A[3][0] == &A[0][1]) << endl;
    

  • Mod

    staun0r schrieb:

    Woher hast du denn diese Weisheiten? So ist das nicht!

    int A[5][5];
    // Die Speicherzellen sind nicht gleich!
    	cout << (&A[3][0] == &A[0][1]) << endl;
    

    Bei A[2][5] schon.



  • SeppJ schrieb:

    Bei A[2][5] schon.

    A[2][5] ist RAM Dschungel, undefiniert. Aber das weisst du bestimmt selbst.



  • Baumschubser schrieb:

    float array[3][3];
    void funktion1(float array[]);
    void funktion2(float wert);
    
    void funktion1(float array[])
    {
       for(int i=0; i<3; i++)
       {
          for(int j=0; j<3; j++)
          {
              funktion2(array[i][j]);
          }
       }
    }
    

    Der Code ist so natürlich falsch.

    float array[3][3];
    void funktion1(float (*array)[3]);
    void funktion2(float wert);
    void funktion2(float wert)
    {}
    void funktion1(float(*array)[3])
    {
       for(int i=0; i<3; i++)
       {
          for(int j=0; j<3; j++)
          {
              funktion2(array[i][j]);
          }
       }
    }  
    
    int main()
    {
    
    	funktion1(array); //!
    	return 0;
    }
    

    😉


  • Mod

    defin0r schrieb:

    SeppJ schrieb:

    Bei A[2][5] schon.

    A[2][5] ist RAM Dschungel, undefiniert. Aber das weisst du bestimmt selbst.

    Verstehst du mich eigentlich absichtlich falsch?

    float A[2][5];
    assert(&A[3][0] == &A[0][1]);
    


  • SeppJ schrieb:

    Verstehst du mich eigentlich absichtlich falsch?

    Nö, warum sollte ich.

    SeppJ schrieb:

    float A[2][5];
    assert(&A[3][0] == &A[0][1]);
    

    Hätte ja gern 'knapp daneben ist auch vorbei' geschreiben, aber das ist ja weit gefehlt!
    Du meinst wohl sowas:

    char A[2][5]; 
    	cout << (&A[0][5] == &A[1][0]);
    

    😉



  • @Baumschubser: Wenn du die Arraygröße nicht in der Parameterliste festbrennen willst wie hier: void funktion float(*array)[3]), sondern etwas mehr Flexibilität benötigst, dann guckst du hier:

    const int X = 5, Y = 4;
    int U = 5, V = 4;
    void f2 ( float a )
    {}
    
    void f1 ( float* B )
    {
    	for ( int y = 0; y < Y; y++ )
    		for ( int x = 0; x < X; x++ )
    			f2 (B[y*X+x]);
    // X,Y  müssen hier nicht mehr const sein!
    for ( int y = 0; y < V; y++ )
    		for ( int x = 0; x < U; x++ )
    			f2 (B[y*U+x]);
    }
    
    int main()
    {	
    
    	float A[Y][X] = {0};
    	A[2][1] = 88.88;
    	f1 ( ( float* )&A );
    

Anmelden zum Antworten