Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » matritzen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.12.2003, 13:56 Uhr
~revolutz
Gast


Mojens !!!

ich will eine dreidimensionale matrix dynamisch erzeugen können, da die Dimensionen erst im Laufe des Programms berechnet werden. Mit arrays ist das laut meines Leerbuches nicht möglich(berichtigt mich, wenn ich mich irre), da nur eine Dimension dynamisch erzeugt werden kann.
gibt es nicht irgendeine libary o.ä. die sich dieser problematik annimmt ??
es muss doch möglich sein mal eben schnell ne matrix zu erzeugen und dann damit rumzurechnen ohne vorher ein informatikstudium zu absolvieren.

grüße..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.12.2003, 14:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also entweder nimmst du ein eindimensionales array und rechnest mit indices rum. (so mach ich das meist wenn ich ein mehrdimensionales arrays brauch, beefy steht da gar nicht drauf der würde dir vermutelich sowas vorschlagen)


C++:
#define Typ double //oder was auch immer
int x,y,z,i,j;   //x,y,z sind deine dimensionen den variablen musst du halt die werte übergeben die du in deinem proggie ermittelst;
TYP ***3dmatrix;  
3dmatrix=new Typ**[x];
for(j=0;j<x;++j){
3dmatrix[j]=new Typ*[y];
for(i=0;i<y;++i)
   3dmatrix[i]=new Typ[z];
}

//am ende nicht vergessen umgekehrt zum allokieren den speicher mit delete wieder freizugeben



ach so ne überlegung ist es noch sonst z.b. std::vector aus der STL zu verwenden
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.12.2003 um 14:46 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.12.2003, 15:38 Uhr
Tommix



Aua.


Zitat:
Windalf postete
also entweder nimmst du ein eindimensionales array und rechnest mit indices rum. (so mach ich das meist wenn ich ein mehrdimensionales arrays brauch, beefy steht da gar nicht drauf der würde dir vermutelich sowas vorschlagen)


C++:
#define Typ double //oder was auch immer
int x,y,z,i,j;   //x,y,z sind deine dimensionen den variablen musst du halt die werte übergeben die du in deinem proggie ermittelst;
TYP ***3dmatrix;  // <<< Fehler 1: TYP gross, Fehler 2 Variablenname fängt mit Zahl an
3dmatrix=new Typ**[x]; // << TYP gross
for(j=0;j<x;++j){
3dmatrix[j]=new Typ*[y]; // << TYP gross
for(i=0;i<y;++i)
   3dmatrix[i]=new Typ[z]; //  << zweiter Index fehlt
}

//am ende nicht vergessen umgekehrt zum allokieren den speicher mit delete wieder freizugeben



ach so ne überlegung ist es noch sonst z.b. std::vector aus der STL zu verwenden


Also eher so:

C++:
#define TYP double //oder was auch immer
int x,y,z,i,j;   //x,y,z sind deine dimensionen den variablen musst du halt die werte übergeben die du in deinem proggie ermittelst;
TYP ***dreiDmatrix;  
dreiDmatrix=new TYP**[x];
for(j=0;j<x;++j){
    dreiDmatrix[j]=new TYP*[y];
    for(i=0;i<y;++i)
        dreiDmatrix[j][ i ]=new TYP[z];
}



Wart mal ab, wenn Beefy liest, was Du Ihm in den Mund legst.

Gruss, Tommix

Dieser Post wurde am 02.12.2003 um 15:42 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.12.2003, 15:45 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Tommix
na so gravierend war mein fehler ja nun auch nicht oder? Ich habs mir auch nicht weiter angeguckt sondern einfach drauf los geschrieben. Dafür war die Fehlerrate doch recht gering. Es ging ja auch mehr ums Prinzip als hier einen compilierbaren code zu schreiben. Auf jeden fall hätte der compiler den fehler angemerkt.
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.12.2003 um 15:46 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.12.2003, 16:49 Uhr
0xdeadbeef
Gott
(Operator)


Windalf, ich hab ein ernstes Wort mit dir zu reden!

Erstens: Matrizen sind rechteckig, nicht quaderförmig. Eine dreidimensionale Matrix meint normalerweise eine 3x3-Matrix.

Zweitens: Wenn wir schon C++ coden (wg. new), dann wenigstens in einer Klasse mit Kon- und Destruktor, die das Speichermanagement für uns übernehmen. Also:

C++:
class matrix {
protected:
  int dimx, dimy;
  double **feld;
public:
  matrix(int, int);
  ~matrix();
};

matrix::matrix(int m, int n) : dimx(m), dimy(n) {
  feld = new int*[m];
  for(int i = 0; i < m; ++i) feld[i] = new int[n];
}

matrix::~matrix() {
  for(int i = 0; i < dimx; ++i) delete[] feld[i];
  delete[] feld;
}


Oder, noch besser, gleich mit vector. Dann können wir da auch ne template-Klasse draus machen.

Drittens: Typen mit #define definieren? Schlechter Stil ist gar kein Ausdruck! Wenn schon, dann so:

C++:
typedef double Typ;



Und wenn dus in C machen willst, ist es sinnvoll, ein struct zu benutzen, also:

C++:
typedef struct {
  int dimx, dimy;
  double **feld;
} matrix;


und das Anfordern und freigeben der Matrix in Funktionen zu kapseln, also etwa so:

C++:
matrix malloc_matrix(int m, int n) {
  int i;
  matrix mat;

  mat.dimx = m;
  mat.dimy = n;
  mat.feld = malloc(sizeof(double*) * m);
  for(i = 0; i < m; ++i) mat.feld[i] = malloc(sizeof(double) * n);
  return mat;
}

void free_matrix(matrix mat) {
  int i;
  for(i = 0; i < mat.dimx; ++i) free(mat.feld[i]);
  free(mat.feld);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.12.2003, 17:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Windalf, ich hab ein ernstes Wort mit dir zu reden!


*lol* Ich hab schon die ganze zeit drauf gewartet. Tommix hat dich ja regelrecht auf mich angesetzt


Zitat:

Eine dreidimensionale Matrix meint normalerweise eine 3x3-Matrix


Nein das ist eine 3x3 (sprich 3-Kreuz-3 Matrix) und nicht eine 3dMatrix. Es gibt sehr wohl 3 dimensionale Matrizen....

Also zu deinem ganzen Klassengelaber kann ich nur folgendes sagen:
Das hat der nicht gefragt. Frage war wie man es schaft mittels dynamsicher Speicherallokierung ein mehrdimensionales Feld hinzubekommen.
Du hast natürlich an sonsten recht und ich würde es sonst auch so machen.

3. lass ich nicht gelten ist mir egal ob das schlechter stil ist es war gerade sehr praktisch um die frage zu beantworten an sonsten mach ich sowas natürlich nicht.
so langsam müsstest du mich doch mal kennen und wissen welchen unsinn ich so verzapfe und welchen nicht....

So und dein Namen wollte ich natürlich auch nicht beschmutzen was ich damit meinte war lediglich das ich 1D-Arrays bevorzuge und du ja nicht wie wir bereits aus anderen Threads wissen....

An sonsten wünsch ich euch allen noch ne schöne Woche ich bin wahrscheinlich bis Freitag abend weg (ohne Internet verdammt) ...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.12.2003, 09:54 Uhr
~revolutz
Gast


Yo,

danke für die vielen Antworten. Die Methode "Pointer auf Pointer auf Pointer von..." währe sicher für ein oder zwei Objekte OK, doch ich hab dummerweise ein paar mehr Matritzen zu verarbeiten (sind übrigens nicht quadratisch. 3D sagt ja blos daß es 3 Dimensionen sind und nicht daß diese gleich groß sein müssen).
Die Geschichte mit anlegen einer neuen Klasse hab ich gestern angefangen, doch da kommt man schnell vom hundertsten ins Tausenste wenn mann es richtig machen will (man raucht ja noch ne Map in der gespeichert ist, wie viele Matritzen schon angelegt sind, und wie groß diese jeweils sind damit man sie auch alle wieder ordentlich löschen kann) und da fehlen mir die Erfahrungen. Ich dachte eigentlich eher daran, daß es evtl irgendeine Libary gibt die sich diesem Problem schonmal angenommen hat.
Ansonsten kommt mir vom Aufwand her die Methode "eindimensionale" arrays mir entsprechenden Indizes zu versehen noch am ehesten entgegen.
Oder ich lege vorher völlig überdimensionierte dreidimensioinale Arrays (Ein Array ist natürlich nicht dreidimensional, auch wenn man es so händeln kann, aber das ist ein anderes Thema) an und verschwende ordentlich Speicherplatz. Ist glaub ich das einfachste auch wenns sehr unelegant ist.

schöne Grüße,

revolutz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: