Mehrdimensionales Array zwischen zwei Funktionen



  • Ist es in C++ möglich, ein zweidimensionales Array variabler Größe (!) von einer Funktion zur nächsten zu bringen?

    - new geht nicht, braucht eine Konstante als Größe
    - globale Variable ebenfalls nicht, weil ich deren Größe zwischenzeitlich ändern müsste
    - Umweg über eine Datei wäre die _absolute_ Notlösung, aber ich will erst alle anderen Möglichkeiten ausschöpfen

    Die Größe des Arrays ist in beiden Dimensionen zu jeder Zeit bekannt, aber eben variabel. Ich habe das Array quasi als lokale Variable mit Hilfe einer Funktion erstellt und will das jetzt in einer anderen Funktion verarbeiten.

    Pseudocode:

    Funktion1() {
      n = Zufallszahl;
      erzeuge NeuesArray[n][n];
      FülleArrayMitZahlen();
      Funktion2(NeuesArray, n);
    }
    Funktion2(Array DasArray, n) {
      GebeZahlenAus(DasArray, n);
    }
    


  • Ja sicher gehts das:

    void bar( int** Array2D, int Dim1, int Dim2 );
    


  • Und wie muss ich das genau aufrufen?



  • Ich habe noch etwas Wichtiges vergessen:
    Funktion1 startet nicht Funktion2, sondern sie laufen parallel:

    int main() {
      Funktion1(...);
      Funktion2(...);
    }
    


  • so:

    void func( int** array, int d1, int d2 )
    {
      for( int i = 0; i < d1; ++i )
      {
         for( int j = 0; j < d2; ++j )
            cout << array[i][j] << " ";
         cout << "\n";
      }
    }
    
    int main()
    {
      int** array;
      array = new int*[ 10 ];
      for( int i = 0; i < 10; ++i )
        array[ i ] = new int(i);
    
      func( array, 10, 10 );
    }
    


  • Solche Lösungen hab ich auch anderswo gesehen, aber da das Array zunächst nur als lokale Variable existiert, wird es gelöscht (der Speicher freigegeben), sobald Funktion1 endet. Ich muss irgrendwas finden, das es mir erlaubt, einen Datenblock variabler Größe dauerhaft im Speicher abzulegen.



  • schlag in deinem buch mal new nach



  • Any schrieb:

    so:

    void func( int** array, int d1, int d2 )
    {
      for( int i = 0; i < d1; ++i )
      {
         for( int j = 0; j < d2; ++j )
            cout << array[i][j] << " ";
         cout << "\n";
      }
    }
    
    int main()
    {
      int** array;
      array = new int*[ 10 ];
      for( int i = 0; i < 10; ++i )
        array[ i ] = new int(i);
    
      func( array, 10, 10 );
    }
    

    Ein schönes delete [] sollte auch nicht vergessen werden bzw mehrere 😉



  • scel schrieb:

    Solche Lösungen hab ich auch anderswo gesehen, aber da das Array zunächst nur als lokale Variable existiert,...

    ...die aufm Heap (oder heißt das im Heap ???) abgelegt wird.

    D.h.: Da wird nichts freigegeben, sobald du die Funktion verlässt !!!



  • Freak_Coder schrieb:

    Any schrieb:

    so:

    void func( int** array, int d1, int d2 )
    {
      for( int i = 0; i < d1; ++i )
      {
         for( int j = 0; j < d2; ++j )
            cout << array[i][j] << " ";
         cout << "\n";
      }
    }
    
    int main()
    {
      int** array;
      array = new int*[ 10 ];
      for( int i = 0; i < 10; ++i )
        array[ i ] = new int(i);
    
      func( array, 10, 10 );
    }
    

    Ein schönes delete [] sollte auch nicht vergessen werden bzw mehrere 😉

    Sorry, aber ohne Editor verlässt mich die Motivation so schnell, man hat hier ja nichtmal tabs (alt+y ist kein tab-ersatz!)



  • Vielen Dank für eure Hilfe, habs dann mit ein bißchen Gewalt doch tatsächlich hinbekommen. Hoff ich.

    #include <cstdlib>
    #include <iostream>
    void func1(int**, int);
    void func2(int**, int);
    
    using namespace std;
    
    int main(){
      int n = 4;  
      int** array;
      array = new int*[n];
      func1(array, n);
      func2(array, n);  
      system("PAUSE");
    }
    
    void func1(int** array, int n) {
    
      for (int i = 0; i < 10; ++i) {
        array[i] = new int[n]; 
      }
      array[2][3] = 4;
    
    }
    void func2(int** array, int n) {
         cout << array[2][3] << endl;      
    }
    


  • scel schrieb:

    Vielen Dank für eure Hilfe, habs dann mit ein bißchen Gewalt doch tatsächlich hinbekommen. Hoff ich.

    #include <cstdlib>
    #include <iostream>
    void func1(int**, int);
    void func2(int**, int);
    
    using namespace std;
    
    int main(){
      int n = 4;  
      int** array;
      array = new int*[n];
      func1(array, n);
      func2(array, n);  
      system("PAUSE");
    }
    
    void func1(int** array, int n) {
      
      for (int i = 0; i < 10; ++i) {
        array[i] = new int[n]; 
      }
      array[2][3] = 4;
      
    }
    void func2(int** array, int n) {
         cout << array[2][3] << endl;      
    }
    

    Sind noch ein paar Machken drin 😃

    1. Speicher wieder frei geben!!! Da wo new [] ist muss auch immer delete [] sein. Die 2 sind die besten Freunde und unzerstrennlich 🕶

    2. 4 != 10 --> Finde selbst den Fehler 🙄

    3. func1 und func2 gehen davon aus das im Array an der Stelle [2][3] was steht und was ist wenn da nichts steht !!! 😮


Log in to reply