[Anfänger]ich brauch hilfe mit mefachen dynamischen zeigen



  • Hallo ich bin gerade dabei das Buch C++ von a-Z durchzuarbeiten. jetzt war ich gerade an der stelle mit den dynamischen arrays das hab ich soweit eigentlich auch noch verstanden bloß jetzt kamm das mit den Zweidimensionalen dynamischen Arrays und naja ich frag mich eins

    ...
    
    int z = 3;
    int** matrix;
    
    matrix = new int*[3]; // für was steht der Indizierungsoperator hinter dem int
    
    ...
    

    wenn mir das jemand erklären könnte währe das sehr hilfreich mfg Unknow[]


  • Mod

    Unknow[] schrieb:

    Hallo ich bin gerade dabei das Buch C++ von a-Z durchzuarbeiten.

    ⚠ An dieser Stelle aufhören, Buch wegschmeißen, mit Hammer auf Kopf hauen bis alles vergessen, dann noch mal von vorne mit C++ anfangen. Die Bücher von Jürgen Wolf sind berühmt berüchtigt und, entschuldige das muss einfach sein, du bist ein weiteres typisches Opfer. Der Code den du zeigst ist Mist und deine Fragen deuten da drauf hin, dass nicht gut erklärt wurde. Insbesondere ist der Begriff Array noch dazu im Zusammenhang mit dynamisch und zweidimensional in C++ kein zentraler Begriff und seine Benutzung macht alles nur schwerer und gefährlicher, auch wenn Herr Wolf das nicht weiß.

    edit: Falls du denkst, dass du das ignorieren solltest, weil du das 40 Euro Buch nicht wegwerfen möchtest: Du wirst durch Lesen dieses Buches aktiv schlechter in C++! Google mal nach "Jürgen Wolf Warnung" oder "Jürgen Wolf C++ Supermarkt Wurst".



  • Dem Beitrag von SeppJ kann ich nur Beipflichten (bin selber Opfer).

    Der Indizierungsoperator ist eine Verkürzung um eine Zeigeroperation zu verschönern.

    myarray[5][5]
    

    entspricht

    *(myarray[5]+5)
    

    entspricht

    *(*(myarray+5)+5)
    

    .

    Möchtest du ein dynamisches, multidimensionales array erstellen, so geht das wiefolgt:

    int* myarray=new int[5][5];
    

    Zugriff wie gewohnt mit Indizierungsoperator, a la

    myarray[3][1] = 50;
    

    dann auch am ende Speicherplatz freigeben nicht vergessen!



  • Also folgendes ich hab das buch von nem freund ausgeliehen und werde es nicht wegschmeisen 🙂 aber im gedanken kann ich das schon machen ich hab mir auch schon andere sachen durchgelesen und ich hab jetzt auch gehört das das buch mist sein soll aber naja irgendwass muss es ja mit den arrays und zeigern mehrdimensional auf sich haben oder kann man keine merhdimensionalen dynamischen arrays machen

    naja egal zu meiner hauptfrage weil i-nen grund muss es ja geben das des typ im buch hintert das

    new int

    einen (*) operator gemacht hat oder? bitte helft mir 🙂



  • Hacker schrieb:

    D
    Möchtest du ein dynamisches, multidimensionales array erstellen, so geht das wiefolgt:

    int* myarray=new int[5][5];
    

    Zugriff wie gewohnt mit Indizierungsoperator, a la

    myarray[3][1] = 50;
    

    Das würde ich so nicht unterschreiben..



  • Hacker schrieb:

    Möchtest du ein dynamisches, multidimensionales array erstellen, so geht das wiefolgt:

    int* myarray=new int[5][5];
    

    Ne, eben nicht.

    Zuerst sollte man sich die Verwendung von Containern angewöhnen. Den new[] -Operator am besten wieder vergessen.
    Eine selbstgebaute Matrix lässt sich viel einfacher handhaben, wenn sie aus einem vector besteht. Folgendes Beispiel illustriert Erzeugung und Benutzung:

    #include <vector>
    
    int main()
    {
      //Array im C++ Stil mit 5 mal 5 int-Elementen
      std::vector<int> arr(5 * 5);
    
      //die gewünschten Indizes, nur als Beispiel
      size_t x = 2, y = 3;
    
      //Referenzen auf die Elemente erhält man mit dem Indexoperator.
      //Die zwei Indizes müssen natürlich in einen Index umgerechnet werden.
      int &element = arr[y * 5 + x];
    }
    


  • @UnKnow[]: Sag mir mal die Seite ...

    @cooky451:
    Ja, hab vergessen zu erwähnen, dass es massig Probleme mit Pufferüberläufen und co. gibt, da hast du schon recht.



  • okey habs glaub ich jetzt auch besser verstanden und ich denk mir jetzt einfach mal das aus dem buch vergessen 🙂 aber könnt ihr mir noch sagen wie ich des dan freigeben muss

    also muss ich dan
    delete [] arrayname;
    oder
    delete [][] arrayname; oder wie?

    mfg 😃



  • Seite 179



  • Unknow[] schrieb:

    naja egal zu meiner hauptfrage weil i-nen grund muss es ja geben das des typ im buch hintert das

    new int

    einen (*) operator gemacht hat oder? bitte helft mir 🙂

    Es gibt halt verschiedene Sichtweisen, wie man zweidimensionale Arrays aufbaut. "Echte" Arrays (int a[5][5]) haben den Speicher dabei am Stück, sind also äquivalent zu eindimensionalen Arrays. (int a[25])
    Nur läuft die Dereferenzierung hier nicht so einfach, man müsste schreiben a[5 * 3 + 1] statt a[5][1].

    In dem Beispiel wird ein Array von Zeigern angefordert. (new int*[5]). Wenn man jetzt jeden Zeiger in diesem Array wieder auf ein new int[5] zeigen lässt, hat man logisch (nicht technisch, da die Arrays ja auseinanderliegen) ein zweidimensionales Array, auf das man wie gewohnt mit a[5][1] zugreifen kann.


  • Mod

    Unknow[] schrieb:

    okey habs glaub ich jetzt auch besser verstanden und ich denk mir jetzt einfach mal das aus dem buch vergessen 🙂 aber könnt ihr mir noch sagen wie ich des dan freigeben muss

    Lass es doch lieber sein. Wenn du das Buch und alles was du da raus "gelernt" hast verwirfst und jetzt noch einmal richtig mit C++ anfängst, dann brauchst du das mit dem new[] das erste Mal in 6 Monaten als kleine Randnotiz a la: "so hätte man das auch machen können, seid ihr nicht froh, dass man solchen Stuss nicht braucht?"



  • okey jetzt vewirrst du mich kann mir jetz ganz einfach jemand sagen was ich machen soll also nachdem oder während ich das buch wegwerfe



  • eine buchempfehlung oder sowas k.a. ich will auf jedenfall c++ richtig lernen ich will jetzt kein buch wo grad mal so erklärt wird was functionen sind und das wars dann



  • Da empfehlen sich mehrere Bücher. Mostly recommended ist hier der C++ Primer, dann gibt es solche Bücher wie Effective C++ oder Exceptional C++ etc. für die Wissenserweiterung.



  • Hacker schrieb:

    @cooky451:
    Ja, hab vergessen zu erwähnen, dass es massig Probleme mit Pufferüberläufen und co. gibt, da hast du schon recht.

    Nein, was du geschrieben hast funktioniert einfach nicht.

    int* myarray=new int[5][5];
    

    <-- Das ist kein gültiges C++!



  • ich hab gehört c++ in 21 tagen soll gut sein ist es das auch ? 😃



  • Unknow[] schrieb:

    ich hab gehört c++ in 21 tagen soll gut sein ist es das auch ? 😃

    In 21 Tagen? Ich dachte, du willst C++ richtig lernen?



  • okey glaube doch nicht das das buch so gut ist und was haltet ihr von der idee sich einfach ein projekt zu überlegen und halt solange zu rechachieren bist man alles was dafür wissen muss im internet gefunden hat ? 😃


  • Mod

    Unknow[] schrieb:

    okey glaube doch nicht das das buch so gut ist und was haltet ihr von der idee sich einfach ein projekt zu überlegen und halt solange zu rechachieren bist man alles was dafür wissen muss im internet gefunden hat ? 😃

    Ganz schlecht. Im Internet schreiben auch viele Wolf-Opfer.



  • Außerdem weißt du gar nicht, was du noch nicht weißt.



  • hmm okey also doch lieber n buch aber wenn ich das jetzt richtig gesehen hab ist das c++ prime in english und naja das 1200 seiten ich weis in so einer branche muss man english können aber gibt es da nicht vieleicht ne andere gute lösung weil ich bin halt nebenbei noch in ner ausbildung


Anmelden zum Antworten