2 Fragen zu Arrays + Funktionen



  • du kannst bei arrays nur die erste dimmension offen lassen. die zweite
    musst du angeben damit der kompiler das richtige feld findet

    int arr1[10][10];
    
    arr1[1][0] // 10tes element
    
    inr arr2[10][100000000000];
    
    arr2[1][0] // 100000000000tes element
    


  • ghorst schrieb:

    nein. foo[] ist ein zeiger, da c/c++ keinen unterschied zwischen zeigern und arrays macht.

    Nein! C++ macht sehr wohl einen Unterschied zwischen Arrays und Zeiger, nur bei der Parameterübergabe spielt die Syntax keine Rolle. Hier gab es eine Diskussion zu diesem Thema.

    Ausserdem dürfte Folgendes wegen der Klammern um int* zu einem Fehler führen:

    ghorst schrieb:

    int **arr;
    arr=new (int*)[DIM];
    

    Und jeden Speicher, den man mit new anfordert, muss man mit delete wieder löschen. Gleiches gilt für new[] beziehungsweise delete[] .

    Nicht zuletzt deswegen (und auch, weil man auf die explizite Übergabe der Dimension verzichten kann) lohnt sich auch der Einsatz von STL-Containern, z.B. std::vector .



  • @nexus in der diskussion geht es um statische arrays, die zwar auch zeiger sind, aber eben nicht auf den heap und dafür von dem compiler reserviert werden müssen. aber eigentlich ist das alles egal, da ich nicht von statischen arrays sprach.
    ansonsten macht c++ null unterschied. ob du nun int[] oder *int zu dem ding sagst, ist gleich. dein hinweis, dass die klammerung zu einem fehler führt halte ich für falsch.



  • Okay. Ich wollte eigentlich nur Missverständnisse vermeiden, weil pauschalisierende Aussagen wie "C/C++ macht keinen Unterschied zwischen Zeigern und Arrays" schon sehr verwirren können.

    Und was die Klammerung angeht: Kompiliert

    int **arr;
    arr=new (int*)[DIM];
    

    bei dir? Wenn ja, was für eine IDE/welchen Compiler benutzt du?

    Die Klammer nach dem new ist eigentlich dazu da, zusätzliche Argumente an den new -Operator zu übergeben, z.B. nothrow .



  • c++ null unterschied. ob du nun int[] oder *int zu dem ding sagst

    Inkrementier mal einen Zeiger und inkrementier mal ein Array. 🙄



  • Was ich noch nicht so ganz verstehe ist, warum man bei einem Array als Parameter keine Referenz machen muss um es zu ändern...:

    void Funk(int arr[10])
    {
        arr[0] = 0; //Wird geändert
    }
    

    wenn ich das gleiche mit einer normalen int-Variable machen würde, dann würde sie ja nicht geändert werden:

    void Funk(int var)
    {
        var = 5; //Wird nicht geändert
    }
    

    Ich hoffe das stimmt was ich hier sage 🤡



  • Ein Array wird immer per Referenz übergeben.

    Das heisst, wenn du eine Kopie haben willst, musst du die selber anlegen, oder std::vector o.ä. benutzen.



  • ghorst schrieb:

    ansonsten macht c++ null unterschied. ob du nun int[] oder *int zu dem ding sagst, ist gleich.

    Arrays sind keine Lvalues. Zeiger schon. Siehe drakon 😉



  • Speedy_92 schrieb:

    Was ich noch nicht so ganz verstehe ist, warum man bei einem Array als Parameter keine Referenz machen muss um es zu ändern.

    Verständlich gesagt: Bei der Übergabe eines Arrays ist es so als würdest du einen Zeiger übergeben, deswegen weiß die Funktion, wo sich das Array im Speicher befindet und kann es somit modifizieren.



  • Vielen Dank. Alles klar geworden 🙂



  • Du musst dir bei der Übergabe eines Arrays immer die Dimension als zusätzlichen Parameter übergeben (oder du arbeitest mit konstanten Werten), da sizeof innerhalb der Funktion nicht das gewünschte Ergebnis erzielt, weil die Grösse des Zeigers ermittelt wird.

    ➡ Wieder ein Grund für std::vector 😉



  • Nexus schrieb:

    Du musst dir bei der Übergabe eines Arrays immer die Dimension als zusätzlichen Parameter übergeben (oder du arbeitest mit konstanten Werten), da sizeof innerhalb der Funktion nicht das gewünschte Ergebnis erzielt, weil die Grösse des Zeigers ermittelt wird.

    ➡ Wieder ein Grund für std::vector 😉

    Naja... ich möchte ein Feld erstellen. Damit möchte ich hinterher arbeiten, also z.B. mit WINAPI zeichnen... Deshalb finde ich es in diesem Moment schöner mit einer Konstanten Dimension zu arbeiten.



  • Ja, das ist schon okay.

    Behalte einfach den vector im Hinterkopf, falls du einmal dynamische Arrays benötigst 😉



  • Speedy_92 schrieb:

    Nexus schrieb:

    Du musst dir bei der Übergabe eines Arrays immer die Dimension als zusätzlichen Parameter übergeben (oder du arbeitest mit konstanten Werten), da sizeof innerhalb der Funktion nicht das gewünschte Ergebnis erzielt, weil die Grösse des Zeigers ermittelt wird.

    ➡ Wieder ein Grund für std::vector 😉

    Naja... ich möchte ein Feld erstellen. Damit möchte ich hinterher arbeiten, also z.B. mit WINAPI zeichnen... Deshalb finde ich es in diesem Moment schöner mit einer Konstanten Dimension zu arbeiten.

    Das eine hat mit dem anderen doch nichts zu tun. Du kannst ja auch aus einem std::vector mit der WinAPI zeichnen. Wo ist das Problem?
    Zusätzlich ist std::vector um einiges komfortabler.
    Ansonsten gibt es auch nocht boost::multiarray:
    http://www.boost.org/doc/libs/1_36_0/libs/multi_array/doc/index.html



  • Also mit dem Vector habe ich mich schon sehr gut angefreundet 🙂
    Beim Textdateien-Auslesen ist er mir immer sehr hilfreich 🤡



  • drakon schrieb:

    Speedy_92 schrieb:

    Nexus schrieb:

    Du musst dir bei der Übergabe eines Arrays immer die Dimension als zusätzlichen Parameter übergeben (oder du arbeitest mit konstanten Werten), da sizeof innerhalb der Funktion nicht das gewünschte Ergebnis erzielt, weil die Grösse des Zeigers ermittelt wird.

    ➡ Wieder ein Grund für std::vector 😉

    Naja... ich möchte ein Feld erstellen. Damit möchte ich hinterher arbeiten, also z.B. mit WINAPI zeichnen... Deshalb finde ich es in diesem Moment schöner mit einer Konstanten Dimension zu arbeiten.

    Das eine hat mit dem anderen doch nichts zu tun. Du kannst ja auch aus einem std::vector mit der WinAPI zeichnen. Wo ist das Problem?
    Zusätzlich ist std::vector um einiges komfortabler.
    Ansonsten gibt es auch nocht boost::multiarray:
    http://www.boost.org/doc/libs/1_36_0/libs/multi_array/doc/index.html

    Naja... nur irgendwie finde ich es bei Feldern einfach schöner 🤡



  • Speedy_92 schrieb:

    Naja... nur irgendwie finde ich es bei Feldern einfach schöner 🤡

    Plus fehleranfälliger und weniger komfortabel 😉


Anmelden zum Antworten