Dynamisches 3D Array
-
XaTrIxX schrieb:
Hui Matyr, da läuft ja einiges falsch!
Eine sache ist, das man meines Erachtens nach ein array gar nicht
arraynennen darf.
Bei mir (MSVC++ 2008 Express) wird es auch als Schlüsselwort dargestellt, aber ich kann es trotzdem so nennen. Wofür steht denn
array?XaTrIxX schrieb:
zweitens, sorry wenn ich mich irre, aber seh hier absolut kein problem:
char arr[a][b][c];Bin gespannt, wie's hier weitergeht
Kein Problem, jeder irrt sich mal

Wenn a, b und c zur Compilezeit noch nicht bekannt sind (d.h. nicht-konstant), funktioniert das nicht. Deshalb muss man das Array dynamisch erstellen.
-
Hallo
Nimm doch einfach vector und spar dir den Sternchenkram.
chrische
-
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"); }
-
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.
-
Falls du einen Fehler machst, erwarte nicht, dass das Programm richtet funktioniert, bevor du ihn an allen Stellen beseitigt hast, wo er auftritt.