Segmentation fault beim Versuch ein array aufn hip anzulegen



  • XSpille schrieb:

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    Ich glaub an mir ist irgendwas vorbeigegangen...
    Jetzt sag nicht du auch noch, dass Zeiger in C++ obsolete sind...

    🙄
    Hat er auch nicht gesagt.
    Meine Güte - diese exzessive Verwendung der Strohmann-Argumentation kann einem in diesem Forum schon auf die Nerven gehen.
    Ein "...sollte...versuchen..." kennzeichnet ganz klar eine Empfehlung - keine Regel, kein Gesetz und schon gar nicht den absoluten Ausschluss aller Alternativen.

    Sorry - nervt mich gerade ganz besonders.

    Gruß,

    Simon2.

    P.S.: Für einen Anfänger, der mit einem Segmentationfault mit Zeigerarrays kämpft (und ein Design vorlegt, das das wirklich anzubieten scheint), halte ich das für einen wirklich guten Vorschlag.



  • Simon2 schrieb:

    XSpille schrieb:

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    Ich glaub an mir ist irgendwas vorbeigegangen...
    Jetzt sag nicht du auch noch, dass Zeiger in C++ obsolete sind...

    🙄
    Hat er auch nicht gesagt.
    Meine Güte - diese exzessive Verwendung der Strohmann-Argumentation kann einem in diesem Forum schon auf die Nerven gehen.
    Ein "...sollte...versuchen..." kennzeichnet ganz klar eine Empfehlung - keine Regel, kein Gesetz und schon gar nicht den absoluten Ausschluss aller Alternativen.

    Sorry - nervt mich gerade ganz besonders.

    Richtig. 👍



  • danke für den vektoren-hinweis, z.Z. kann/soll/will ich mir das aber nicht antun. cih kanns ja nachher immer noch versuchen mit vektoren zu lösen. nichtsdestitrotz hier nochmal die bitter meinerseits: ist es möglich dass mir jemand verrät wie ich den code umschreibn könnt um 225 instanzen der der klasse "Cell" zu erzeugen und dann über den "array-operator" [] auf die einzelnen instanzen zuzugreifen?



  • marvinX schrieb:

    danke für den vektoren-hinweis, z.Z. kann/soll/will ich mir das aber nicht antun. cih kanns ja nachher immer noch versuchen mit vektoren zu lösen. nichtsdestitrotz hier nochmal die bitter meinerseits: ist es möglich dass mir jemand verrät wie ich den code umschreibn könnt um 225 instanzen der der klasse "Cell" zu erzeugen und dann über den "array-operator" [] auf die einzelnen instanzen zuzugreifen?

    class Game
    {
    private:
    Cell *Zelle;
    public:
    void play();
    };
    
    Hier die void play().
    void Game::play()
    {
    Zelle=new Cell [225];
    Zelle[0]->setCellH(10);
    cout<<Zelle[0]->getCellH()<<endl;
    delete [] Zelle;
    }
    

    So.



  • HighLigerBiMBam schrieb:

    Simon2 schrieb:

    Ein "...sollte...versuchen..." kennzeichnet ganz klar eine Empfehlung - keine Regel, kein Gesetz und schon gar nicht den absoluten Ausschluss aller Alternativen.

    Sorry - nervt mich gerade ganz besonders.

    Richtig. 👍

    Ein "Man sollte ... versuchen ..." ist ganz klar eine allgemeine Empfehlung,
    der ich mich nicht anschließen kann 👎

    Simon2 schrieb:

    XSpille schrieb:

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    Ich glaub an mir ist irgendwas vorbeigegangen...
    Jetzt sag nicht du auch noch, dass Zeiger in C++ obsolete sind...

    🙄
    Hat er auch nicht gesagt.

    Ich hab auch gar nicht behauptet, dass er es gesagt hat... 👎

    Simon2 schrieb:

    P.S.: Für einen Anfänger, der mit einem Segmentationfault mit Zeigerarrays kämpft (und ein Design vorlegt, das das wirklich anzubieten scheint), halte ich das für einen wirklich guten Vorschlag.

    'Jeder', der C++ neu lernt macht Erfahrungen mit Segmentationfaults,
    deswegen rät 'man' doch nicht von der Benutzung von Zeigern ab. 👎
    (Zurückstellen kann ich noch verstehen.)

    Einen anderen Design-Vorschlag kann man jederzeit einbringen, aber
    das klingt wohl nur sehr begrenzt nach anderem Design-Vorschlag:

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger und Arrays verzichten versuchen und mit std::vector<> arbeiten, dann passiert einem das nicht.

    Gruß,
    XSpille



  • marvinX schrieb:

    danke für den vektoren-hinweis, z.Z. kann/soll/will ich mir das aber nicht antun. cih kanns ja nachher immer noch versuchen mit vektoren zu lösen. nichtsdestitrotz hier nochmal die bitter meinerseits: ist es möglich dass mir jemand verrät wie ich den code umschreibn könnt um 225 instanzen der der klasse "Cell" zu erzeugen und dann über den "array-operator" [] auf die einzelnen instanzen zuzugreifen?

    Wenn du ein Mal die Vorteile des std::vectors über die C Herangehensweise siehst wirst du dich fragen, warum du das je hättest anders machen wollen. Die STL erfordert etwas Einarbeitung, insbesondere das Iteratorkonzept erschliesst sich nicht sofort, aber mMn ist die Verwendung der STL Pflicht für einen C++ Programmierer. Das ist mit Sicherheit nicht schwieriger als Zeiger und dynamische Speicherverwaltung (und deren Implikationen!).
    Aber gut, du wolltest ja die Lösung in C:

    class Game
    {
       Cell** Zellen;
    
       static const unsigned int Anzahl = 255;
    
    public:
       Game() : Zellen( 0 )
       {
       }
    
       ~Game()
       {
          clear();
       }
    
      void play()
      {
          init();
          ...
          clear();
      }
    
    private:
       // Kopien verbieten
       Game( const Game& );
       Game& operator=( const Game& );
    
       void init()
       {
          clear();
    
          Zellen = new Cell*[Anzahl];
          for( unsigned int i = 0; i < Anzahl; ++i )
          {
             Zellen[i] = new Cell();
          }
       }
    
       void clear()
       {
         if( Zellen )
         {
            for( unsigned int i = 0; i < Anzahl; ++i )
            {
               delete Zellen[i];
            }
            delete[] Zellen;
            Zellen = 0;
         }
       }
    };
    

    Warum ist Zellen ein Attribut der Klasse Game, obwohl es nur lokal in play() verwendet wird?



  • XSpille schrieb:

    ...Ein "Man sollte ... versuchen ..." ist ganz klar eine allgemeine Empfehlung, der ich mich nicht anschließen kann 👎

    Das mag sein - aber eine Begründung wäre vllt. für alle hilfreicher gewesen als der Rückgriff auf die generelle Kompentenz- und Integritätsfrage.

    Wir können hier gerne noch ein wenig "Nein - Doch - Nein - Doch -..." spielen, aber das kostet nur Zeit und Plattenplatz.
    Stattdessen sachlich:
    Meine Empfehlung lautet: Wer eine Anzahl gleichwertiger Objekte zu verwalten hat, ist mit den StdLib-Containern in vielen Fällen gut bedient und kommt schnell und mit weniger Fehlern ans Ziel.

    Begründung: Größen- und Allokationsaufgaben werden (oftmals hinter den Kulissen) automatisch oder fachlich orientiert (resize() spricht Bände) abgenommen und man kann sich auf die "eigentliche Arbeit" konzentrieren.

    Wer selbst lernen will, wie dynamische Speicherverwaltung und/oder Zeigerarithmetik in C++ funktioniert, verwendet dazu natürlich new/new[] und die zugehörigen Zeiger/C-Arrays (inwieweit tr1::array et. al. dabei helfen, mag ich nicht beurteilen)

    Für statische Arrays habe ich bislang nur Verwendung gefunden, wenn es um größere Konstantenansammlungen gleichen Datentyps geht (ein "nur größenkonstanter StdLib-Container, der zur Compilezeit angelegt wird" ist mit nicht bekannt).

    Ob das auch "BimBams" Ansatz ist, weiß ich natürlich nicht - aber ich bin auch nicht sein Anwalt.

    XSpille schrieb:

    ...
    'Jeder', der C++ neu lernt macht Erfahrungen mit Segmentationfaults,
    deswegen rät 'man' doch nicht von der Benutzung von Zeigern ab. ...

    Formal: Hat nun deiner Meinung nach Irgendjemand hier von "der Benutzung von Zeigern" abgeraten , oder nicht? Ich kann das hier jedenfalls nicht sehen.
    Ich sehe schon die Empfehlung, StdLib-Container zu verwenden - mehr nicht.

    Inhaltlich:
    Frage an die Anfänger: Wollt ihr lieber Segmentationsfaults oder std::vector? :p
    Nach der "Da musste ich auch durch"-Argumentation kann man jede Form von Hilfen/Ratschlägen ablehnen - überzeugt mich nicht so.
    Ich sehe keinen sittlichen oder didaktischen Nährwert im Erzeugen und Suchen von Segmentationfaults.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    XSpille schrieb:

    ...Ein "Man sollte ... versuchen ..." ist ganz klar eine allgemeine Empfehlung, der ich mich nicht anschließen kann 👎

    Das mag sein - aber eine Begründung wäre vllt. für alle hilfreicher gewesen als der Rückgriff auf die generelle Kompentenz- und Integritätsfrage.

    Eine kurze Begründung war im ersten Beitrag verlinkt 😉

    Simon2 schrieb:

    Meine Empfehlung lautet: Wer eine Anzahl gleichwertiger Objekte zu verwalten hat, ist mit den StdLib-Containern in vielen Fällen gut bedient und kommt schnell und mit weniger Fehlern ans Ziel.

    Dieser Meinung schließe ich mich gerne an, solange Kopien nicht zu teuer
    sind und natürlich muss der Copy-Constructor verfügbar sein.

    Simon2 schrieb:

    Für statische Arrays habe ich bislang nur Verwendung gefunden, wenn es um größere Konstantenansammlungen gleichen Datentyps geht (ein "nur größenkonstanter StdLib-Container, der zur Compilezeit angelegt wird" ist mit nicht bekannt).

    Ich habe mich nicht gegen die Verwendung von Vektoren ausgesprochen.
    Da stimme ich absolut zu 👍

    Simon2 schrieb:

    XSpille schrieb:

    ...
    'Jeder', der C++ neu lernt macht Erfahrungen mit Segmentationfaults,
    deswegen rät 'man' doch nicht von der Benutzung von Zeigern ab. ...

    Formal: Hat nun deiner Meinung nach Irgendjemand hier von "der Benutzung von Zeigern" abgeraten , oder nicht? Ich kann das hier jedenfalls nicht sehen.

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    (Ich denke die "..." verfälschen hier nichts)

    Simon2 schrieb:

    Inhaltlich:
    Frage an die Anfänger: Wollt ihr lieber Segmentationsfaults oder std::vector? :p

    Der Segmentationfault basiert ja auf einer fehlenden Kenntnis im Umgang mit Zeigern.

    Bei Verwendung von std::vector wäre er dann über den maximalen Index
    hinausgelaufen 😉

    Simon2 schrieb:

    Nach der "Da musste ich auch durch"-Argumentation kann man jede Form von Hilfen/Ratschlägen ablehnen - überzeugt mich nicht so.

    Es sollte eher eine
    "Eigene Erfahrungen mit Zeigern sind gut zur Verständnisschaffung"-Argumentation sein 😉

    Gruß,
    XSpille



  • Ich schätze XSpille vom Alter her nur auf 16-18. Zwei Posts, kein konstruktiver Beitrag zum Thread und sofortiges grundloses angiften anderer.

    Man kann durchaus erkennen, dass der Fragestellen aufgrund seines Fehlers und des Codes die STL nicht kennt. Daher mein Verweis man könnte dies auch mit std::vector lösen, "Schaus dir mal an!". zumal gerade die STL den Unterschied zwischen C und C++ macht.

    Ganz im Ernst warum denkst du gibt es soviele Sicherheitslücken? Von der Nutzung der STL oder von falschem Gebrauch von Arrays?

    Ich bin sogar der Auffassung man kann sollte/muss in C++ auf Zeiger verzichten! Ich will es nur keinem Aufzwängen wie du deine Meinung, dass man ausschließlich mit zeigern programmieren soll. Warum haben wir shared_ptr? Exceptionsicherheit?



  • Konvention: Nutze die Standardcontainer erst dann, wenn du im Umgang mit new & delete sicher bist.
    Alternativ: Verwende die Standardcontainer, aber beschäftige dich auch mit manueller Speicherverwaltung.
    Hintergrund: Nicht jeder entwickelt reine C++ Programme ein Leben lang mit der Konsole. Irgendwann ist der Punkt gekommen, sich mit den (C-) Funktionen des Betriebssystems auseinanderzusetzen. RAII ist hier sehr nett, aber um seine eigenen RAII-Klassen zu schreiben, muss man? Genau, nochmal das Posting lesen :).



  • Ich denke, hier muß man nicht unbedingt einem Anfänger aus didaktischen Gründen das eine oder andere erzählen, was man für sich selber nicht so machen würde.
    Täte der Profi hier gut daran, vector zu nehmen?



  • XSpile schrieb:

    Bei Verwendung von std::vector wäre er dann über den maximalen Index hinausgelaufen

    Ich denke du hast die STL nicht verstanden... Bei Schleifen bis vector.end() passiert garnichts!



  • XSpille schrieb:

    ...Da stimme ich absolut zu 👍 ...

    Wie so oft: Wenn wir fachlich konkret werden, sind die Unterschiede deutlich geringer und greifbarer.

    XSpille schrieb:

    ...
    ...

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    (Ich denke die "..." verfälschen hier nichts)

    denke ich auch - allerdings das Herausreißen des Satzes aus dem Zusammenhang schon.
    Für mich ist mehr als deutlich klar, dass hier der Begriff "Zeiger" als Kurzform für "direkte Objektverwaltung und mit Zeigern, Arrays und ggf. new([])/delete([])" verwendet wird (inwieweit sollte vector auch eine Zeigeralternativ für "wechselbare Verweise" sein?).

    [quote="XSpille"]...Es sollte eher eine "Eigene Erfahrungen mit Zeigern sind gut zur Verständnisschaffung"-Argumentation sein. ...[quote]
    auch hier stimme ich zu ... aber das fällt für mich definitv unter die o.g. Spezialmotivation "Wer selbst lernen will, wie ..." - und damit unter die 5% Ausnahmen.
    Außerdem halte ich dieses Lernziel für (historisch) überbewertet. Mit Iteratoren und Containern kann man bereits eine Menge lernen, was man dann problemlos auf Zeiger/Arrays (als Spezialform von Iteratoren/Zeigern) übertragen kann.

    Gruß,

    Simon2.



  • HighLigerBiMBam schrieb:

    Ich schätze XSpille vom Alter her nur auf 16-18.

    Ich bin mehr als zwei Jahre älter als du...

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    Mich hat man vor einigen Monaten angeflamed, dass ich hier doch bitte
    kein Halbwissen verbreiten solle(, obwohl ich Recht hatte - nur weil ich
    explizit gesagt habe, dass ich nicht sicher bin.)

    HighLigerBiMBam schrieb:

    Man kann durchaus erkennen, dass der Fragestellen aufgrund seines Fehlers und des Codes die STL nicht kennt. Daher mein Verweis man könnte dies auch mit std::vector lösen, "Schaus dir mal an!". zumal gerade die STL den Unterschied zwischen C und C++ macht.

    Wo habe ich denn etwas gegen deine Vektor-Empfehlung gesagt? 🙄

    HighLigerBiMBam schrieb:

    Ganz im Ernst warum denkst du gibt es soviele Sicherheitslücken? Von der Nutzung der STL oder von falschem Gebrauch von Arrays?

    Hast du absolut recht.

    Genau meine Meinung: "STL verwenden"
    Ich hab mich gegen das 'Zeiger-nicht-verwenden' ausgesprochen...

    HighLigerBiMBam schrieb:

    Ich bin sogar der Auffassung man kann sollte/muss in C++ auf Zeiger verzichten!

    kein Kommentar 🤡

    HighLigerBiMBam schrieb:

    Ich will es nur keinem Aufzwängen wie du deine Meinung, dass man ausschließlich mit zeigern programmieren soll.

    Ich habe nie gesagt, dass man ausschließlich mit zeigern programmieren soll...
    Wo soll ich das zum Ausdruck geebracht haben?

    HighLigerBiMBam schrieb:

    Warum haben wir shared_ptr? Exceptionsicherheit?

    Weil sie im richtigen Kontext verwendet, sehr hilfreich sind, allerdings
    kein Allerheilmittel!



  • volkard schrieb:

    Täte der Profi hier gut daran, vector zu nehmen?

    Der Profi kann durchaus den Anwendungsfall richtig beurteilen, wobei hier nichts gegen die Verwendung von Zeigern spricht. Zeiger besitzen im gegensatz zur STL einen Plus an Performance, der bei Zeitkritischen Anwendungen nicht zu verachten ist.

    XSpille schrieb:

    HighLigerBiMBam schrieb:

    Ich bin sogar der Auffassung man kann sollte/muss in C++ auf Zeiger verzichten!

    kein Kommentar 🤡

    Nur für dich so formuliert, damit deine Meinung auch ja richtig ist!



  • HighLigerBiMBam schrieb:

    Der Profi kann durchaus den Anwendungsfall richtig beurteilen, wobei hier nichts gegen die Verwendung von Zeigern spricht.

    HighLigerBiMBam schrieb:

    Man sollte in C++ ganz auf Zeiger [...] verzichten versuchen ...

    😕



  • HighLigerBiMBam schrieb:

    Zeiger besitzen im gegensatz zur STL einen Plus an Performance, der bei Zeitkritischen Anwendungen nicht zu verachten ist.

    Welch ein selten dämlicher Bockmist.
    Das ist einfach nur falsch.
    100% Unwissen.


  • Administrator

    HighLigerBiMBam schrieb:

    Zeiger besitzen im gegensatz zur STL einen Plus an Performance, der bei Zeitkritischen Anwendungen nicht zu verachten ist.

    Und das soll mal bitte jemand beweisen. Vor allem wenn man bedenkt, das ein std::vector<X>::iterator meistens nur ein typedef X* iterator ist 😉

    Grüssli



  • Dravere schrieb:

    HighLigerBiMBam schrieb:

    Zeiger besitzen im gegensatz zur STL einen Plus an Performance, der bei Zeitkritischen Anwendungen nicht zu verachten ist.

    Und das soll mal bitte jemand beweisen. Vor allem wenn man bedenkt, das ein std::vector<X>::iterator meistens nur ein typedef X* iterator ist 😉

    Grüssli

    😃 👍



  • Danke da haben wirs doch, zwei Moderatoren die auch auf meiner PRO STL Seite stehen. 👍

    Nur gut dass man diese erst mit falschäußerungen ermutigen muss zu posten.

    Für mich ist dieser Thread beendet.


Anmelden zum Antworten