Dynamisches 3D Array



  • dachte die muss man dereferenzieren. wie soll es sonst gehen?.

    semikolon fehlt wegen kopierfehler und bei b++ hab ich mich vertippt sry



  • a,b,c  --> drei integrer mit der array groese.
    
    char ***array = new char**[a];  // sternchen dahinter
    
    for(int i=0;i<=a;i++)
         array[i] = new char*[b];   // sternchen dahinter, und nicht dereferenzieren
    
    for(int i=0;i<=a;i++)
          for(int j=0;j<=b;j++)
             array[i][j] = new char[c];
    

    so sollte es klappen...



  • Danke es klappt verstehe nur nicht wieso das nicht dereferenziert werden muss.



  • Eben fällt mir eine weitere frage ein wie lösche ich das ganze ding eigentlich wieder? xD

    delet [] array;

    klappt ja wohl nicht oder?



  • Du musst das auch wieder mit Schlaufen machen und jedes mal dort, wo du ein new hattest auch wieder mit delete löschen. (Aber schön von innen nach aussen).

    Wenn du mal die Forensuche benutzt, findest du eine Lösung von mir, wo ich das schon mal gemacht habe.

    Aber eine gute Idee ist es dennoch nicht so etwas zu machen.. Schön,wenn man es Verstanden hat, dann sollte man aber ganz schnell wieder die Finger davon lassen. ^^

    EDIT:

    Hier ist mal ein Beispiel:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-211534-and-highlight-is-.html



  • sry finde dein post nicht.

    daher geht das so

    for(int i........)
    for(int j...........)

    delete[] array[i][j]



  • Wie du findest meinen Post nicht?
    Ich habe dir doch den Link gepostet vorhin. Und der letzte ist es.

    Das was du machst geht so nicht. Schau einfach bei dem anderen Thread, dort steht die Lösung.



  • 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