Forum: PC-Programmierung [C++] Zweidimensionales Array füllen


von Nico22 (Gast)


Lesenswert?

Liebes Forum,

ich habe in C++ eine Klasse für ein zweidimensionales Array 
implementiert und kann diese auch benutzen:

twodim var(2, 2);
var[0][0] = 0;

und so weiter.

Nun ist es mir aber etwas zu umständlich, beispielsweise eine 
5x5-Tabelle immer nach diesem Muster zu füllen. In den Sinn kommt mir, 
eine solche Syntax verwendbar zu machen:

int x[5][5] = {
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
}

Kann ich jetzt mit irgendeinem {Assignment-,}Operator sowas emulieren? 
Das Problem ist, dass 5x5 beliebig mxn sein soll.

Gruß,
Nico

von Klaus W. (mfgkw)


Lesenswert?

Nein, weil das keine Zuweisung ist, sondern eine Initialisierung.
Da gibt es momentan keinen eleganten Weg für das, was ich vermute
was du wilst.

Mit dem nächsten C++ wird das wohl besser...

von Nico22 (Gast)


Lesenswert?

Wenn deine Vermutung richtig ist, hast du wohl recht ;-)

Hast du denn irgendwas irgendwie ähnlich Elegantes? Oder geht das in C++ 
echt nur mit Krücken?

von Klaus W. (mfgkw)


Lesenswert?

Ein Objekt eines eigenen Datentyps kannst du nicht mit
= { ... } initialisieren, sorry.

Wenn du dich auf g++ beschränkst, es also nicht portabel sein soll,
könnte es gehen.

von Nico22 (Gast)


Lesenswert?

Danke, Klaus, für den Hinweis.

Hast du da ne Syntax oder Direktive zur Hand oder ein Stichwort? Wenn du 
erst suchen muss, schaue ich sonst selbst nach.

Nico

von Klaus W. (mfgkw)


Lesenswert?

Was ich im Kopf hatte, sind die "compound literals" aus C99,
die der gcc bzw. g++ auch bei C++ akzeptiert, zusammen mit
einem entsprechenden ctor in der Klasse.

Ich hatte mir das so vorgestellt:
1
class Matrix
2
{
3
 public:
4
5
  Matrix( size_t m, size_t n, double arr[m][n] )
6
    : m( m ),
7
      n( n ),
8
      pWerte( new double[m*n] )
9
  {
10
    for( size_t i=0; i<m; ++i )
11
    {
12
      for( size_t j=0; j<n; ++j )
13
      {
14
        pWerte[i*n+j] = arr[i][j];
15
      }
16
    }
17
  }
18
19
  double &operator()( size_t i, size_t j )
20
  {
21
    return pWerte[i*n+j];
22
  }
23
24
 private:
25
26
  size_t     m;
27
  size_t     n;
28
  double    *pWerte;
29
30
}; // class Matrix
31
32
...
33
  Matrix    m( 3, 2,
34
               (double[3][2])
35
               {
36
                  { 1.0, 2.0 },
37
                  { 1.1, 2.1 },
38
                  { 1.1, 2.1 }
39
               }
40
               );

Das geht nur leider nicht so, weil im ctor der
Parameter double arr[m][n] nicht akzeptiert wird, wegen noch
unbekannten m und n.

Wenn man auf die zeilenweise Klammerung der Matrix beim Initialisieren 
verzichten kann, geht es zumindest so:
1
#include <iostream>
2
3
class Matrix
4
{
5
 public:
6
7
  Matrix( size_t m, size_t n )
8
    : m( m ),
9
      n( n ),
10
      pWerte( new double[m*n] )
11
  {
12
  }
13
14
  Matrix( size_t m, size_t n, double *arr )
15
    : m( m ),
16
      n( n ),
17
      pWerte( new double[m*n] )
18
  {
19
    for( size_t i=0; i<m; ++i )
20
    {
21
      for( size_t j=0; j<n; ++j )
22
      {
23
        pWerte[i*n+j] = arr[i*n+j];
24
      }
25
    }
26
  }
27
28
  double &operator()( size_t i, size_t j )
29
  {
30
    return pWerte[i*n+j];
31
  }
32
33
 private:
34
35
  size_t     m;
36
  size_t     n;
37
  double    *pWerte;
38
39
}; // class Matrix
40
41
int main( int nargs, char **args )
42
{
43
  Matrix    m( 3, 2,
44
               (double[])
45
               {
46
                  1.0, 2.0,
47
                  1.1, 2.1,
48
                  1.1, 2.1
49
               }
50
               );
51
52
53
  std::cout << "m( 2, 1 ) = " << m( 2, 1 ) << std::endl;
54
}

Das sieht schon etwas ähnlicher aus wie eine array-Initialisierung
in C.
Etwas eleganteres sehe ich spontan nicht, sorry.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Keine fertige Lösung, aber ein Ansatz:

Schau die mal die Boost-Assignment-Library an. Da werden durch Überladen
des ()- und des ,-Operators verrückteste Dinge gemacht, die noch weit
über das hinausgehen, was du vor hast, und das alles standardkonform:

  http://www.boost.org/doc/libs/1_45_0/libs/assign/doc/index.html

Ich habe sie mir nicht näher angeschaut, aber mit etwas Glück arbeitet
die Library direkt mit deiner Klasse zusammen, mit etwas weniger Glück
kannst du sie mittels weiterer Überladungen passend machen. Falls das
alles nicht funktionieren sollte, kannst du zumindest die Grundideen
übernehmen und etwas Ähnliches selbst schreiben.

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.