Dynamisches 3D Array



  • Es gibt beim löschen des Arrays ein Problem.

    Wärend der Laufzeik kommt folgene fehlermeldung:

    Debug Error!

    Program:...
    HEAP CORRUPTION DETECTED: after Normal block (#154) at 0x00336528.
    CRT detected that application wrote to memory after end of heap buffer.

    Beim druck auf wiederholen löst der folgenden haltepunkt aus:

    for(int i=0;i<=Daten.a;i++) 
    		{ 
    			for(int j=0; j<=Daten.b;j++) 
    			{
    				delete[] Karte[i][j]; 
    			}
    			delete[] Karte[i];   ///<-- HIER HALTEPUNKT
    
    		} 
    		delete[] Karte;
    


  • Deine Schleifen laufen zu weit.

    Als Schuss ins blaue würde ich schätzen, dass es

    for(int i=0;i<Daten.a;i++)
    {
        for(int j=0; j<Daten.b;j++)
        {
    

    heissen muss.

    worum benutzt eigentlich niemand std::vector? 😞



  • otze schrieb:

    worum benutzt eigentlich niemand std::vector? 😞

    Als Übung sicher nicht schlecht das mal gemacht/verstanden zu haben. Aber ich hoffe er benutzt das nicht "produktiv".. ^^



  • Hallo

    otze schrieb:

    worum benutzt eigentlich niemand std::vector? 😞

    Ich verstehe es auch nicht...

    chrische



  • Weil selber machen immernoch am spannendsten ist?



  • ich habe noch nie von vector gehört geschweige denn kenne ich mit damit aus^^

    Daher das.

    und an dem gleich liegt es nicht habe das schon geändert. Das fängt schon bei i=0 an den haltepunkt auszulösen.



  • Matyr schrieb:

    ich habe noch nie von vector gehört geschweige denn kenne ich mit damit aus^^

    Daher das.

    und an dem gleich liegt es nicht habe das schon geändert. Das fängt schon bei i=0 an den haltepunkt auszulösen.

    Dann zeig mal den ganzen Code.



  • Ich bin anfänger und weiß das das nicht schön ist oder guter stiel.
    Sicher auch einige fehler drin.

    // Auslesen Klasse.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <string>
    #include <iostream>
    #include <windows.h>
    #include <sstream>
    #include <fstream>
    
    #include <cstring>
    #include <typeinfo>
    
    #include <stdlib.h>
    #include <math.h>
    #include <stdexcept>
    #include <io.h> 
    #include <fcntl.h>
    
    using namespace std;
    
    class Map
    {
    private:
    
    	struct gro
    	{
    		int a;
    		int b;
    		int c;
    	}Daten;
    
    	char* my_null;
    	char*** Karte;
    	fstream Datei;
    
    public:
    
    	Map();
    	~Map();
    
    	void groese();
    	char *** init();
    	void set(int);
    
    	template<class A,class B>
    	void convert(A&,B&);
    };
    
    Map::Map()
    {
    	Datei.open("Info.txt");
    	Karte=init();
    }
    
    Map::~Map()
    {
    	Datei.close();
    
    		for(int i=0;i<=Daten.a;i++) 
    		{ 
    			for(int j=0; j<=Daten.b;j++) 
    			{
    				delete[] Karte[i][j]; 
    			}
    			delete[] Karte[i]; 
    
    		} 
    		delete[] Karte; 
    
    }
    
    char *** Map::init()
    {
    	    groese();
    
    		Karte = new char**[Daten.a];  // sternchen dahinter 
    
    		for(int i=0;i<=Daten.a;i++)
    		{
    			Karte[i] = new char*[Daten.b]; 
    		}// sternchen dahinter, und nicht dereferenzieren 
    
    		for(int i=0;i<=Daten.a;i++) 
    		{
    			for(int j=0;j<=Daten.b;j++)
    			{
    				Karte[i][j] = new char[Daten.c]; 
    			}
    		}
    		return Karte;
    }
    
    void Map::groese()
    {
    		string tmp;
    
    		getline(this->Datei,tmp);
    		cout<<tmp<<"\n";
    		convert(tmp,this->Daten.a);
    
    		if(Daten.a<=0){Daten.a=2;}
    
    		getline(this->Datei,tmp);
    		cout<<tmp<<"\n";
    		convert(tmp,this->Daten.b);
    
    		if(Daten.b<=0){Daten.b=2;}
    
    		getline(this->Datei,tmp);
    		cout<<tmp<<"\n";
    		convert(tmp,this->Daten.c);
    
    		if(Daten.c<=0){Daten.c=2;}
    
    		cout<<"a: "<<this->Daten.a<<"  b: "<<this->Daten.b<<"  c: "<<this->Daten.c;
    }
    
    void Map::set(int data)
    {
    
    }
    
    template<class A, class B>
    void Map::convert(A& input, B &output)
    {
    						/// Stringstream  http://cplus.kompf.de/artikel/stream4.html
    		stringstream ss;
    		ss << input;
    		ss >> output;
    		if(!ss.eof())
    		{
    			cout<<" KONVERTIREUNG FEHLGESCHLAGEN";
    		}
    
    }
    
    int main(int argc, _TCHAR* argv[])
    {
    	Map objekt;
    
    	system("Pause");
    }
    

  • Mod

    Ein Array aus n Elementen hat nur n Elemente. Und wir fangen mit dem Element Nr. 0 an.



  • habe das gleich beim löschen weg gemacht klappt trozdem nicht.

    der löst den error halt schon bei i=0 aus.


  • Mod

    Falls du einen Fehler machst, erwarte nicht, dass das Programm richtet funktioniert, bevor du ihn an allen Stellen beseitigt hast, wo er auftritt.


Anmelden zum Antworten