array soll 2d punkte aufnehmen



  • gelöst(ob es wirklich gelöst ist, weiß ich nicht, aber zumindest kommt keine fehlermeldung) wäre das problem, wenn der konstruktor halt so aussähe:

    Hehe. Das ist ein sehr gemeiner Fehler. 😉
    Das Problem ist, dass die Initialisierungsreihenfolge nicht nach der Reihe geht, wie du es in der Initialisierungsliste hast, sondern, nach der Deklaration in der Klasse. Und somit initialisierst du den Speicher mir irgend einer Zahl, wie -89234.

    Wenn du das in den Konstruktor selbst verlagerst, wurde beides bereits initialisiert, da du aber die Werte dann per Zuweisung änderst funktioniert es (da size bereist den richtigen Wert hat).

    Also einfach das hier:

    private:
        point *m_data;
        unsigned int m_size;
    

    ändern:

    private:
        unsigned int m_size;
        point *m_data;
    

    Dann klappt das auch mit der Initialisierungsliste.

    Wie gesagt. Sehr fies. 😉

    Zeig mal den Kopierkonstruktor von point_list, respektive alle Teile, wie sie jetzt aktuell sind und mit dem Problem zu tun haben.



  • wow, wirklich nen fieses ding.
    darauf wäre ich nie gekommen. wie lange stehst du denn schon in c++, dass dir ein solcher fehler auffällt? ^^

    vielen dank. 🙂

    aso: (hätte ich fast vergessen)

    header:

    class point_list
    {
    public:
      point_list(unsigned int);
      point_list(point_list const & rhs);
      ~point_list();
    
      int getSize() const;
      point& operator[](unsigned int index)
        {return m_data[index];}
      point const& operator[](unsigned int index) const 
        {return m_data[index];}
    
      void swap(point_list&);
      point_list& operator=(point_list const&);
    
    private:
      unsigned int m_size;
      point *m_data;
    };
    

    cpp:

    #include "point_list.h"
    #include "point.h"
    #include <iostream>
    #include <algorithm> //fuer swap
    
    point_list::point_list(unsigned int size)
    :
      m_size(size),
      m_data(new point[m_size])
    {
    
    }
    
    point_list::point_list(point_list const & rhs)
    :
      m_size(rhs.m_size),
      m_data(new point[m_size])
    {
      for(unsigned int index=0; index < m_size; ++index)
      {
        m_data[index] = rhs.m_data[index];
      }
    }
    
    point_list::~point_list()
    {
      delete [] m_data;
    }
    
    int point_list::getSize() const
    {
      return m_size; 
    }
    
    void 
    point_list::swap(point_list& rhs)
    {
      swap(m_data, rhs.m_data);  // <-
      swap(m_size, rhs.m_size);  // <-
    }
    
    point_list& 
    point_list::operator=(point_list const& rhs)
    {
      point_list tmp(rhs);
      swap(tmp);
      return *this;
    }
    

    die swap, wie sie hier ist, funktioniert bei mir nicht wirklich.
    (zumindest so, wie ich sie aus quellen her gefunden habe)
    gibt fehlermeldung, dass keine passende funktion für diesen aufruf vorhanden ist.
    da hat er ja auch recht ;), aber ich dachte das hängt mit "#include<algorithm>" zusammen und das problem würde dadurch nicht entstehen? O.o

    die swap wäre das eine problem ^^

    ich weiß aber nicht, ob das zweite was damit zu tun hat.
    wenn ich in der main:

    point p1(2,3);
    point_list liste(5);
    liste[0] = p1;
    

    soetwas möchte (und um das entgültige resultat haben zu können muss ich irgendwie via index drauf zugreifen und zuweisen), kommt nen "segmentation fault"

    grüße kylanysik



  • Kylanysik schrieb:

    wow, wirklich nen fieses ding.
    darauf wäre ich nie gekommen. wie lange stehst du denn schon in c++, dass dir ein solcher fehler auffällt? ^^

    vielen dank. 🙂

    Hmm. Gute Frage.. 😉 - Vlt. so 2 - 2.5 Jahre mittlerweilen.

    Mir selbst ist so ein Fehler glaube ich noch nie passiert, was aber daran liegt, dass ich eine solche "ungeordnetheit" sowieso nicht ausstehen kann und das eigl. seit dem Anfang immer in der richtigen Reihenfolge gemacht habe. Habe aber ein paar mal über den Fehler gelesen und bei dir war es ja offensichtlich, da eins zum anderen führt. 😉

    Einen namespace musst du schon auch noch angeben:

    std::swap(m_data, rhs.m_data);  // <-
      std::swap(m_size, rhs.m_size);  // <-
    


  • nun existiert lediglich eine lücke 🙂

    point p1(2,3);
    point_list liste(5);
    liste[0] = p1;  // <-
    

    wie schon geschildert funzt der aufruf nicht... wenn ich das richtig verstehe will ich speicher benutzen, der nich dafür gedacht war. oder?



  • Was geht denn nicht? Compilefehler, oder erst zur Laufzeit?



  • nunja, wenn ich es so richtig sehe, dann erst zur laufzeit.. denn die zuvor in der main aufgerufenen aufgaben werden erfüllt und erst, wenn er zu der zeile: "liste[0] = p1" kommt, zeigt er den fehler an.



  • Was für ein Laufzeitfehler entsteht denn? Heap Corruption? Exception? 😉



  • make: *** [main_test] "segmentation fault"
    make: *** Datei >>main_test<< wird gelöscht



  • Die swap-Funktion bei Point scheint mir fehlerhaft.

    void
    point::swap(point& rhs)
    {
      std::swap_ranges(data_, data_+4, rhs.data_);
    }
    

    Data hat doch bloß 2 Elemente. Hier würden auch 2 normale std::swap Aufrufe reichen.



  • OK. Dann schau mal mit dem Debugger, von wo das genau kommt. Wahrscheinlich liegt es am Kopieren und nicht am Zugriff in die Liste..



  • stimmt.. habs geändert..

    also ich habe die swap der point-klasse geändert und nun funktioniert auch die zeile liste[0] = p1;
    zumindest erstmal ohne fehlermeldung, werde mich aber melden, falls es im laufe der zeit nach hinten losgehen sollte 😉

    voerst funzt alles vielen dank 🙂

    grüße kylanysik und sorry nochmal wegen der unanehmlichkeiten, die ich bereitet habe 🙂



  • Das war wieder einmal ein schönes Beispiel für "undefiniertes Verhalten". 🙂


Anmelden zum Antworten