Forum: PC-Programmierung C-prog: 2d array mit variabler zeilenanzahl


von Reinhard L. (leiti7)


Lesenswert?

Hallo Leute!

Hätte da eine Frage an euch.

Also, wie man ein normales array mit variabler Größe definiert weiß ich:

z.B: float array = new float [variable];

Jetzt würde ich allerdings ein 2d-array mit variabler Zeilenanzahl 
benötigen.
Kann mir da jemand weiterhelfen?

mfg.

von Vlad T. (vlad_tepesch)


Lesenswert?

Reinhard Leitgeb schrieb:
> float array = new float [variable];

das ist kein C, das ist c++.

Da würde ich an deiner Stellen STL-Container benutzen.
std::vector< std::vector< float > > array;

von Timmo H. (masterfx)


Lesenswert?

Und wenns am Ende doch C sein soll kannst du auch mit malloc, realloc, 
calloc arbeiten.

von Klaus W. (mfgkw)


Lesenswert?

Oder du nimmst mein VarArr.h (in 
http://mfgkw.dyndns.org/vararr_release.zip zu finden).

Darin ist eine template-Klasse VarArr<>, mit der man ein Feld
eines beliebigen Typs anlegen kann und dann mit der Schreibweise
meinfeld[index] darauf zugreifen kann

Damit hast du so etwas ähnliches wie einen std::vector, allerdings mit 
folgenden grundlegenden Unterschieden:
- man muß sich nicht darum kümmern, daß ein Element auch existiert.
  Das wird automatisch beschafft, sobald es zum ersten Mal
  verwendet wird.
- Die Feldindices müssen nicht bei 0 beginnen.
  Es ist genauso möglich, meinfeld[100] bis meinfeld[120]
  zu nehmen oder sogar negative Indices, z.B. meinfeld[-10].

Weil du hier ein zweidimensionales Feld brauchst, kann man
VarArr< VarArr< float > > nehmen (oder gleich double, wie man
will).

Die inneren Teilfelder können gleich lang sein, müssen aber
nicht unbedingt.
1
#include "VarArr.h"
2
3
int main( int nargs, char **args )
4
{
5
  AnyWare::VarArr< AnyWare::VarArr< double > >  meinArray;
6
7
  // ein paar Werte belegen:
8
  meinArray[-1][0] = -1.0;
9
  meinArray[-1][1] = -1.1;
10
  meinArray[-1][2] = -1.2;
11
  meinArray[0][0] = 0.0;
12
  meinArray[0][1] = 0.1;
13
  meinArray[0][2] = 0.2;
14
  meinArray[0][3] = 0.3;
15
  meinArray[1][0] = 1.0;
16
  meinArray[1][1] = 1.1;
17
  meinArray[1][2] = 1.2;
18
  meinArray[1][3] = 1.3;
19
  meinArray[1][4] = 1.4;
20
  meinArray[1][5] = 1.5;
21
22
  // alle ausgeben:
23
  for( int i=meinArray.ug(); i<=meinArray.og(); ++i )
24
  {
25
    for( int j=meinArray[i].ug(); j<=meinArray[i].og(); ++j )
26
    {
27
      std::cout << "meinArray[" << i << "][" << j << "] = " << meinArray[i][j]
28
                << std::endl;
29
    }
30
  }
31
32
  return 0;
33
}

Das sieht dann so aus:
1
klaus@vdr2:~/tmp > g++ -Wall t.cpp -o t && ./t
2
meinArray[-1][0] = -1
3
meinArray[-1][1] = -1.1
4
meinArray[-1][2] = -1.2
5
meinArray[0][0] = 0
6
meinArray[0][1] = 0.1
7
meinArray[0][2] = 0.2
8
meinArray[0][3] = 0.3
9
meinArray[1][0] = 1
10
meinArray[1][1] = 1.1
11
meinArray[1][2] = 1.2
12
meinArray[1][3] = 1.3
13
meinArray[1][4] = 1.4
14
meinArray[1][5] = 1.5

Wenn ich mal ganz viel Zeit habe, mache ich noch Iteratoren dazu...

von Martin (Gast)


Lesenswert?

Vlad Tepesch schrieb:
>> float array = new float [variable];
>
> das ist kein C, das ist c++.

Vor allem ist es ein Fehler, den der Compiler anmeckern wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.