Pointer auf Array (unbekannte Grösse)



  • Hallo.

    Es muss doch eine Lösung geben, dass ich ein Array mit vorher
    nicht bekannter Grösse an eine Funktion übergeben kann, oder?

    So muss man es machen - ist mir klar:

    Funktion(Array[][200]) {
    
    }
    

    Ich habe aber eine Funktion, die zu einer DLL kompeliert wird.
    Und natürlich soll man jeden Array übergeben können. Somit kann
    ich nicht die Grösse vor dem kompelieren eingeben:

    Funktion(Array[][]) {
    
    }
    

    Das geht aber (so) nicht... 🙄

    Also ... wie macht man dies? Es wird doch sicher eine Lösung
    gehen, oder? 🙂



  • void funktion(int* array, int size);

    normalerweise uebergibt man die groesse des arrays immer mit



  • Ja, dass mache ich auch. Die Grösse in x- und y-Richtung wird auch
    übergeben.

    Und weiter? Etwa so? Angenommen das Array hätte zwei Dimensionen
    und wäre "quadratisch".

    void funktion(int **array, int size) {
    
      int Wert;
    
      For (int x = 0; x <= size - 1; x++) {
        for (int y = 0; y <= size - 1; y++) {
          Wert = array[x][y];
        }
      }
    }
    

    Ist das so richtig?



  • warzm probierst du es nicht aus?

    aber ich will mal nicht so sein;)

    void funktion(int *array, int size) {/*WAS sollte der doppelpointer? macht üerhauptkeinen sinn */
    
      int Wert; 
    
      For (int x = 0; x == size; x++) { 
        for (int y = 0; y == size; y++) { 
          Wert = array[x][y]; 
        } 
      } 
    }
    


  • ... geht nicht 🙄
    Meldung: subscripted value is neither array nor pointer
    Die Meldung kommt an der Stelle, wo man versucht auf das Array
    zuzugreifen: Wert = array[x][y];

    Davon ab ist ein Fehler in deinem Code:

    for (int x = 0; x == size; x++) {  
        for (int y = 0; y == size; y++) {  
          Wert = array[x][y];  
        }  
    }
    

    ➡ Du musst bei for anders Abfragen:
    Bei dir ist x == size immer false, bis size gleich x ist.
    Deshalb wird die Schleife sofort beendet.

    for (int x = 0; x <= size; x++) {  
        for (int y = 0; y <= size; y++) {  
          Wert = array[x][y];  
        }  
    }
    

    ➡ Hier ist die Bedingung x <= size immer true, bis
    der Zähler den Wert erreicht. So muss es sein...

    Aber wie gesagt: Dein Vorschlag mit dem Array geht nicht!



  • Ich hab's selber gefunden (mehr oder weniger):

    Funktion (Datentyp *Name) {
    }
    

    Dann kann man mit Name[x] die Einträge abrufen.
    Wenn man nun ein Array mit zwei Dimensionen hat, muss
    man so vor gehen wie die Einträge im Speicher liege:
    Reihe für Reihe!

    Sagen wir mal ein Array mit 200x200 Einträgen.
    Dann greift man mit Name[0] bis Name[199] auf
    die erste Reihe zu, mit Name[200] bis [399] auf
    die zweite Reihe usw.

    Damit ist das Problem gelöst 😃

    PS: Wenn mein(e) Beiträge oben irgendwie "überheblich"
    sind, dann möchte ich mich dafür entschuldigen 😉

    Aber mit x == size geht es eben nicht 😉



  • @ths
    Probiers mal noch so:

    void funktion(int *array, int size) 
    {
      int wert;  
    
      for (int x = 0; x < size; x++)
      {  
        for (int y = 0; y < size; y++)
        {  
          wert = array[x][y];  
        }  
      }  
    }
    
    //Aufruf bei einem Array von 200 x 200
    funktion(array, 200);
    


  • Das geht auch nicht. Mein Compiler sagt dann:
    subscripted value is neither array nor pointer

    Geht also nur mit einer eckigen Klammer ⚠

    Aber ich habe mir eine Funktion geschrieben, die
    das wieder ausgleicht:

    WriteArray(long *Name, long Breite, long x, long y, long Wert) {
      Name[(y * Breite) + x] = Wert;
    }
    

    Man bräuchte also eine Funktion zum lesen und schreiben und
    das jeweils für alle Datentypen. Aber das ist für mich okay 🙂



  • ths. schrieb:

    Davon ab ist ein Fehler in deinem Code:

    for (int x = 0; x == size; x++) {  
        for (int y = 0; y == size; y++) {  
          Wert = array[x][y];  
        }  
    }
    

    hast recht ich schreibe immer "<"
    so kann man die "-1" weglassen

    bei deiner lösung ist es aber so, dass das array nur "vorgestellt" ist. es ist nicht wirklich 2 dimensional. Man kann also ein 2 dimensionales array als 2 dimensionales array "missbrauchen".

    Man bräuchte also eine Funktion zum lesen und schreiben und 
    das jeweils für alle Datentypen. Aber das ist für mich okay
    

    Versuchs mla mit templates



  • gibbets2000 schrieb:

    bei deiner lösung ist es aber so, dass das array nur "vorgestellt" ist.
    es ist nicht wirklich 2 dimensional. Man kann also ein 2 dimensionales
    array als 2 dimensionales array "missbrauchen".

    Ne ne ... okay - ich erkläre mal alles:
    Ich schreibe in C eine Funktion, die als DLL compeliert wird. Diese DLL
    benutze ich dann in anderen Programmen, die auch nicht zwangsläufig
    in C oder C++ geschrieben sind.

    In meinem Beispiel ist es so, dass ich in dem Hauptprogramm (kein C)
    ein zweidimensionales Array erstelle! Es ist also auf jeden Fall
    zweidimensional.

    An die DLL (in C geschrieben) übergeben ich den Pointer auf das
    Array. Und in diesem Fall ist halt die Grösse des Arrays zum Zeitpunkt
    des compelierens in C nicht bekannt - geht ja auch schlecht.

    Ich täusche also kein "2D" Array vor, sondern es ist wirklich eines 😉

    Versuchs mla mit templates

    Ich fange gerade erst mit C an, und mit Templates kann ich im Moment
    nichts anfangen, sorry. Aber ich komme auch so zurecht.



  • imho sind templates c++

    sorry, ich habe mich ein wenig verschrieben. aer so wichtig ist das net ganz!

    es sollte in etwa so heisen:

    bei deiner lösung ist es aber so, dass das array nur 2 dimensional "vorgestellt" ist.
    es ist nicht wirklich 2 dimensional. Man kann also ein 1 dimensionales
    array als 2 dimensionales array "missbrauchen".


Anmelden zum Antworten