Aus Funktion auf Elemente von Array schreiben/Call by Reference



  • Hallo,
    ich versuche eine Funktion zu schreiben, die Werte in die Elemente eines Arrays schreibt. Dazu übergebe ich das Array per Refernz an die Funktion. Allerdings weiß ich nicht, ob das der totale Pfusch ist. Was meint Ihr?

    Bsp ohne Fkt mit Pointer:

    int main()
    {
    int meinArray[5];
    int *pmeinArray=&meinArray[0];
    int i;

    for(i=0;i<5;i++)
    {
    *(pmeinArray+i)=i;
    }

    }

    Bsp mit Fkt und Pointer:

    void schreibe( int &dasBloedeArray);

    int main()
    {
    int meinArray[5];
    int *pmeinArray=&meinArray[0];
    int j;

    schreibe(*pmeinArray);
    for(j=0;j<5;j++)
    {
    cout<<"\n"<<meinArray[j];
    }

    }

    void schreibe( int &dasBloedeArray)
    {
    int i;
    int *pdasBloedeArray=&dasBloedeArray;
    for(i=0;i<5;i++)
    {
    *(pdasBloedeArray+i)=i;

    }
    }

    Danke im Voraus, Thomas



  • derThomasImNetz schrieb:

    int meinArray[5];
    int *pmeinArray=&meinArray[0]; //meinArray == &meinArray[0]

    *pmeinArray ist unnötig. Der Name eines Arrays ohne Index-Angabe ("[]") ist bereits ein Pointer auf sein erstes Element. Die Extra-Pointer kannst du dir also sparen.

    void fillArray(int *array,int arrSize) {
      for(int i=0;i<arrSize;i++) {
        array[i]=i;  //das Array wird mit den Werten 0-9 gefüllt
      }
    }
    
    int main() {
      int meinArray[10];  //das Array hat 10 Elemente mit undefinierten Werten
      fillArray(meinArray,10); //jetzt ist es gefüllt
      for(int i=0;i<10;i++) {  //Testausgabe
        cout << meinArray[i] << endl;
      }
      return 0;
    }
    

    Ein Array per Referenz (also einen Pointer darauf) zu übergeben, ist auch kein Pfusch, sondern der einzige Weg.

    Übrigens hier noch was Interessantes zum Thema "Rückgabe von Arrays", damit du darüber nicht auch stolperst (das kann als Anfänger 'ne Menge Zeit kosten, ich weiß das). Das ist nämlich auch nicht so einfach möglich. Falls man von einer anderen Programmiersprache kommt, muss man sich bei solchen Geschichten erstmal umgewöhnen. Nach kurzer Zeit flutscht es aber dann! 😉

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-173305-and-highlight-is-array+zur�ckgeben.html

    EDIT Nr. X: Ach ja, und bitte benutze Code-Tags, damit dein Code formatiert und leichter zu lesen ist.


  • Mod

    _matze schrieb:

    Der Name eines Arrays ohne Index-Angabe ("[]") ist bereits ein Pointer auf sein erstes Element.

    Nein. Ausdrücke, die Arraytyp haben, werden recht schnell in Zeiger konvertiert, da nur wenige Operatoren direkt mit Arrays arbeiten können. Es handelt sich dennoch um völlig verschiedene Dinge.

    _matze schrieb:

    Ein Array per Referenz (also einen Pointer darauf) zu übergeben, ist auch kein Pfusch, sondern der einzige Weg.

    Das mag in C so durchgehen - eine Zeigerübergabe ist aber keine Übergabe per Referenz. Arrays als vollständige Objekte können nicht kopiert oder zugewiesen werden, deshalb gibt es keine Value-Übergabe für sie und sie dürfen auch nicht als Funktionsergebnis auftreten. Ein Funktionsparameter, der formal als Array deklariert wird, wird automatisch als Zeigerparameter angesehen (d.h. die Paramterdeklaration selber ist eine Zeigerdeklaration, auch wenn sie anders aussieht) - das passiert nur dort und hat nicht etwa zur Folge, dass Arrays generell Zeiger wären.

    _matze schrieb:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-173305-and-highlight-is-array+zur%FCckgeben.html

    Das ist unbrauchbar - keiner der gezeigten Codes ist korrekt bzw. wird das erwartete Verhalten haben.
    Es sollte sein

    void inv4x4(double matrix4x4[4][4]); // oder
    void inv4x4(double matrix4x4[][4]); // oder
    void inv4x4(double (*matrix4x4)[4]); // diese ersten 3 Deklarationen sind äquivalent
    void inv4x4(double (&matrix4x4)[4][4]); // als Referenzparameter, hier verlieren wir keine Typinformationen
    


  • camper schrieb:

    _matze schrieb:

    Der Name eines Arrays ohne Index-Angabe ("[]") ist bereits ein Pointer auf sein erstes Element.

    Nein. Ausdrücke, die Arraytyp haben, werden recht schnell in Zeiger konvertiert, da nur wenige Operatoren direkt mit Arrays arbeiten können. Es handelt sich dennoch um völlig verschiedene Dinge.

    Das musst du mir bitte erklären.

    Zitat aus "C++ - Objektorientiertes Programmieren von Anfang an" (H. Erlenkötter):

    "Hinter dem Namen eines Feldes verbirgt sich nämlich ein Zeiger auf sein erstes Element."

    Hat der gute Mann jetzt die Unwahrheit gesprochen? Stimmt dies hier etwa nicht?

    char arr[10];
    char *pArr=&arr[0];  //pArr==arr
    

    camper schrieb:

    eine Zeigerübergabe ist aber keine Übergabe per Referenz.

    Wieso nicht? Ich übergebe nicht den Wert, sondern eine Referenz auf den Wert. Wieso ist das keine Übergabe per Referenz?

    camper schrieb:

    Das ist unbrauchbar - keiner der gezeigten Codes ist korrekt bzw. wird das erwartete Verhalten haben.

    Gut, da wirst du Recht haben. Das Beispiel habe ich auch nicht weiter überprüft. Es sollte lediglich als Hinweis dienen, dass die Rückgabe eines Arrays nicht so einfach möglich ist. Meine Intention war schließlich, dass ein Anfänger nicht endlose Stunden mit dem Versuch vergeudet und einen Anhaltspunkt hat, wie weiter vorzugehen ist. Wenn der Link da nicht optimal war, tut's mir leid.

    Ich bin ja selbst noch ein Anfänger (seit einem knappen Jahr) und bin auf deine Ausführungen gespannt. Dennoch fühle ich mich in einigen Punkten (noch) im Recht.


  • Mod

    _matze schrieb:

    Zitat aus "C++ - Objektorientiertes Programmieren von Anfang an" (H. Erlenkötter):

    "Hinter dem Namen eines Feldes verbirgt sich nämlich ein Zeiger auf sein erstes Element."

    Hat der gute Mann jetzt die Unwahrheit gesprochen?

    Kommt darauf an, was mit sich verbergen gemeint ist; er sagt aber nicht ausdrücklich, dass der Name direkt einen Zeiger repräsentiert. Angesichts der Häufigkeit, mit der dieser Fehler gemacht wird, wäre ich aber nicht allzu überrascht, falls der Autor hier tatsächlich etwas Falsches meint.

    Stimmt dies hier etwa nicht?

    char arr[10];
    char *pArr=&arr[0];  //pArr==arr
    

    Das stimmt zweifellos. Bereits die Anwendung des []-Operators bewirkt oben angesprochene Konvertierung.



  • Ich habe meinen Beitrag nochmal editiert und würde dich bitten, dazu noch ein, zwei Worte zu schreiben (ich bin nicht sicher, ob du bei editierten Beiträgen auch benachrichtigt wirst).



  • _matze schrieb:

    EDIT Nr. X: Ach ja, und bitte benutze Code-Tags, damit dein Code formatiert und leichter zu lesen ist.

    Wenigstens in einem Punkt habe ich Recht gehabt! 😃 😃


Anmelden zum Antworten