vector enthält structs die wiederrum vectoren enthalten -> Speicherverletzung



  • Servus miteinander,

    Hier die Codeschnipsel zur Überschrift:

    //Klasse zum Verwalten der physikalisch relevanten Objekte und Simulationsparameter von (eventuell mehreren) Zellen
    #pragma once
    #ifndef __List_h__
    #define __List_h__
    
    #include <vector>
    #include "Cells.h"
    #include <Eigen/Sparse>
    #include <Eigen\Dense>
    #include <unsupported\Eigen\SparseExtra>
    
    using namespace std;
    using namespace Eigen;
    
    namespace BattPackage{
    
    struct CellData;
    
    class List
    {
    public:
    	void vSaveNewCell(BattPackage::Cells *Cells, unsigned short xyDimension[2], unsigned short ZSegmentation[4]);
    	List(void);
    	~List(void);
    	std::vector<BattPackage::CellData *> vecCellData;
    	void vCreateInzidenzenMatrix(int CellID);
    	void vSaveData();
    	void vLoadData();
    };
    
    //Die Daten einer Zelle werden hier abgespeichert
    	struct CellData {
    		BattPackage::Cells *ptCells;
    		unsigned short *sDimension; 
    		unsigned short *sZSegmentation; 
    		std::vector<BattPackage::GLeg*> vecAllSources;
    		std::vector<BattPackage::GNode*> vecAllGNodes;
    		std::vector<BattPackage::GLeg*> vecAllGLegs;
    		DynamicSparseMatrix<int,ColMajor> matInz; 
    		std::vector<unsigned short[2]> vecPosContactPoints;
    		std::vector<unsigned short[2]> vecNegContactPoints;
    
    		CellData(unsigned short *Dimension, unsigned short *ZSegmentation, BattPackage::Cells *Cells)
    			: sDimension(Dimension), sZSegmentation(ZSegmentation), ptCells(Cells)
    		{
    
    		}
    
    		CellData()
    			: sDimension(0), sZSegmentation(0), ptCells(0)
    		{
    
    		}
    
    		~CellData(){
    
    		}
    	};
    
    }
    
    #endif
    

    In der main wird nun eine Zelle (Cells) erzeugt und ein Pointer zu dem obigen Listenobjekt übergeben. Nach dem Initialisieren der Zelle wird dann

    void vSaveNewCell(BattPackage::Cells *Cells, unsigned short xyDimension[2], unsigned short ZSegmentation[4]);
    

    aufgerufen und soll folgendes machen:

    void BattPackage::List::vSaveNewCell(BattPackage::Cells *Cells, unsigned short *xyDimension, unsigned short *ZSegmentation){
    	this->vecCellData.push_back(ptCellData(xyDimension,ZSegmentation,Cells));
    }
    

    Dabei kommt es zu Absturz, weil ptr in VecCellData nicht mehr definiert ist.
    Ich bitte um Erleuchtung, was ich da mal wieder dummes anstelle...

    PS. Kann nur ab und an mal reinschauen, weil ich das WE viel auf Achse bin.


  • Mod

    Wie hast du es denn geschafft, ein Array in einen Vector zu stopfen? Was immer da genau schiefgeht (und ich sehe da viel, was schiefgehen könnte), sollte das eigentlich nicht mehr kompilieren, sobald du irgendetwas machst, was dem vector Elemente hinzufügt.



  • Achso die beiden Arrays ganz unten in der struct könnten das Problem sein? Da sollten auch eigentlich pointer auf das erste Element des Arrays rein. (So wie int[] ja ne Pointer auf das erste Element des Arrays liefert.). Also dann doch std::vector<int *ptInt> damit der Compiler das macht, was ich will?

    Was ich allgemein machen will ist alle relevanten Daten von einer, oder mehreren Zellen (können sich teilweise während des Programmdurchlaufs ändern, deshalb vectoren) in List (vecCellData) speichern um sie später halbwegs flott auslesen zu können.

    Kann sein, dass meine Vorgehensweise ziemlich schlecht ist, weil ich noch Anfänger bin. Also wenn jemandem was geeigneteres einfällt bin ich für Hinweise immer dankbar.


  • Mod

    Was mir noch auffällt sind halt die vielen Pointer. Vermutlich greifst du auf Objekte zu, die es gar nicht gibt. Das Programm erweckt auch nicht den Eindruck als ob du sie bräuchtest oder überhaupt weißt, auf was man achten müsste, wenn man sie bräuchte.



  • Ich hab den Fehler nicht gefunden und das Ganze jetzt anders realisiert, so dass ich wieder halbwegs verstehe, was ich da mache. Kann dann zu hier.
    THX, medic


Log in to reply