Liste: violent access



  • Hallo.
    Kann mir einer sagen was hier fehlt?
    Warum das Programm bei Aufruf der Get-Funktion
    eine violent access gibt:

    **#include "stdafx.h"
    #include <math.h>
    #include <stdio.h>
    #include <cstdlib>
    #include <vector>
    using namespace std;

    class CKoerperVector
    {

    private:

    vector<double> PointxObj;
    vector<double> PointyObj;

    public:

    void SetPoint(double* pdX, double* pdY, int index)
    {
    PointxObj.push_back(*pdX);
    PointyObj.push_back(*pdY);
    }

    void GetPoint(double* pdX, double* pdY, int index)
    {
    *pdX = PointxObj[index];
    *pdY = PointyObj[index];
    }

    };
    **
    (Weiß leider nicht mehr wie man den code weiß einlegt )
    http://www.c-plusplus.net/forum/images/smiles/confused.gif
    😕
    Die Methoden sind im Header inline
    Ich würd mich sehr freuen wenn sich mir Anfänger einer
    annehmen würde. http://www.c-plusplus.net/forum/images/smiles/smile.gif
    🙂
    crios



  • Du hast recht das ist violent access ( wilder Zugriff ).
    Ohne Scherz. Aus deinem code ist ist nicht ersichtlich warum es zur Zugriffsverletzung kommt.
    Ungut ist dass du bei SetPoint die Werte immer hinten anhängst => index wird ignoriert.
    Natürlich bekommst du dann eine access violation wenn du z.b einmal SetPoint aufrufst und dann GetPoint mit index = 1.
    K



  • Vielleicht hilft es ja wenn du in GetPoint() mal auf einen gültigen Index
    überprüfst. 😉 Das macht der Operator[] von vector nämlich nicht von selbst.
    Wenn du das willst/erwartest musst du at() verwenden.



  • Ich hab den Index untersucht.
    Er kommt mit 0 rein.



  • Die Liste wird aber laut Debugger
    gefüllt. Ich hab zuerst vermutet
    dass die Liste garnicht gefüllt.
    wird
    crios



  • kann mich meinen vorgaengern nur anschliessen:

    ZuK schrieb:

    Aus deinem code ist ist nicht ersichtlich warum es zur Zugriffsverletzung kommt

    also wenn wir dir helfen sollen brauchen wir die relevanten code teile.
    das der debugger sagt die liste sei gefuellt hilft nicht viel.



  • criosj schrieb:

    Die Liste wird aber laut Debugger
    gefüllt. Ich hab zuerst vermutet
    dass die Liste garnicht gefüllt.
    wird
    crios

    Wernn das so ist dann kanns nur mehr dran liegen wie du GetPoint() aufrufst.
    Könnte es so sein ?

    double * px, *py; // pointer zeigen ins nirvana.
      GetPoint(px, py, 0);
    

    Kurt



  • wenn's so ist wie ZuK vermutet:

    double *px=new double,*py=new double;
    x.GetPoint(px,py,0);
    


  • Arbeite besser mit Referenzen als mit (möglicherweise dangling) Pointern, also z.B.

    void AddPoint(const double &dX, const double &dY)
    {
      PointxObj.push_back(dX);
      PointyObj.push_back(dY);
    }
    
    void SetPoint(const double &dX, const double &dY, int index)
    {
      PointxObj.at(index) = dX;
      PointyObj.at(index) = dY;
    } 
    
    void GetPoint(double &dX, double &dY, int index) 
    { 
      dX = PointxObj[index]; 
      dY = PointyObj[index]; 
    }
    

    "at" wirft eine Exception bei Bereichsüberschreitung

    Aufruf dann mit

    double px, py;
    x.AddPoint(24, 42);
    x.SetPoint(13, 17, 0);
    x.GetPoint(px,py,0); <- gibt (13, 17) zurück
    


  • Das veruch ich mal



  • Ich hab es ausprobiert.
    (Den Code von Th.
    Jetzt kommt der Fehler schon beim Setzen der Punkte
    mit SetPoint.
    Vielleicht funktioniert der Index nicht
    Der ist beim Aufruf 0.
    MfG


Anmelden zum Antworten