C++ Objekt mit Array

OP #5622185
Hallo zusammen,
Ich hoffe mal, dass meine Frage nicht schon tausend mal beantwortet 
wurde, aber ich hab nicht wirklich was dazu gefunden. Vielleicht macht 
man das auch ganz anders.

Ich hab mir eine LED-Matrix gebaut, auf welcher ich nun gerne 
verschiedene Symbole anzeigen möchte. Also zum Beispiel einfach die 
Zahlen von 0-9.

Dazu habe ich die Zahlen als zweidimensionales Array angelegt und 
gespeichert. Die Übergabe an die Funktionen zum Anzeigen per Pointer 
funktioniert auch eigentlich soweit.

Nun wollte ich eine Klasse anlegen um eben die Funktionen zum Anzeigen 
der LEDs zu kapseln und dann zb. schreiben zu können drei.wirte()

Wie schaffe ich das jetzt, dass ich eine neue Instanz erstelle und das 
Array mit den Daten füttere??

Danke schon mal für die Hilfe :)

Anbei mal das was ich probiert hab:
1
const PROGMEM  byte drei [7][5] = // also so schaut momentan die Drei aus
2
{
3
  {0, 255, 255, 255, 255},
4
  {0, 0, 0, 0, 255},
5
  {0, 0, 0, 0, 255},
6
  {0, 255, 255, 255, 0},
7
  {0, 0, 0, 0, 255},
8
  {0, 0, 0, 0, 255},
9
  {0, 255, 255, 255, 255},
10
};
11

12
//Damit hole ich mir die Symbole aus dem Speicher und trage sie in den Puffer ein
13
void symbole_schreiben7x5 (const byte rotArray[7][5], const byte blauArray[7][5])
14
{
15

16
  initialisieren(0);
17

18
  for (int i = 0; i < 5; i++)
19
  {
20
    for (int f = 0; f < 7; f++)
21
    {
22
      LEDs_rot [f][i] = pgm_read_byte(&(rotArray [f][i]));
23
      LEDs_blau [f][i] = pgm_read_byte(&(blauArray [f][i]));
24
    }
25
  }
26

27
  schreibe_LEDs();
28
}
29

30
// Damit wirds dann ausgegeben 
31
void schreibe_LEDs()
32
{
33
  startframe();
34
  //Abarbeiten der LED-Arrays
35
  for (int i = 0; i < 42; i++)
36
  {
37
    for (int f = 6; f > -1; f--)
38
    {
39
      //APA102C schreiben (helligkeit, blau, gruen, rot);
40
      ledframe(helligkeit, LEDs_blau [f][i] , LEDs_gruen [f][i], LEDs_rot [f][i]);
41
    }
42

43
    i++;
44

45
    for (int f = 0; f < 7; f++)
46
    {
47
      //APA102C schreiben (helligkeit, blau, gruen, rot);
48
      ledframe(helligkeit, LEDs_blau [f][i], LEDs_gruen [f][i], LEDs_rot [f][i]);
49
    }
50
  }
51
  endframe();
52
}


Nun wollte ich das aber gern als Objekt haben, also so:
1
class symbol
2
{
3
  public:
4
    const PROGMEM byte zeichen [7][5] = {};
5

6
    void schreiben ()
7
    {
8
      for (int i = 0; i < 5; i++)
9
      {
10
        for (int f = 0; f < 7; f++)
11
        {
12
          LEDs_rot [f][i] = pgm_read_byte(&(zeichen [f][i]));
13
        }
14
      }
15

16
    }
17
};
18

19

20
zeichen drei;
21
drei.zeichen[7][5]=
22
{
23
  {0, 255, 255, 255, 255},
24
  {0, 0, 0, 0, 255},
25
  {0, 0, 0, 0, 255},
26
  {0, 255, 255, 255, 0},
27
  {0, 0, 0, 0, 255},
28
  {0, 0, 0, 0, 255},
29
  {0, 255, 255, 255, 255},
30
};
Aggregate initialization 
(https://en.cppreference.com/w/cpp/language/aggregate_initialization) 
funktioniert genau wie in C auch.
1
class symbol {
2
 public:
3
  const uint8_t zeichen[7][5];
4

5
  void schreiben() {}
6
};
7

8
symbol s{{{0, 255, 255, 255, 255},
9
          {0, 0, 0, 0, 255},
10
          {0, 0, 0, 0, 255},
11
          {0, 255, 255, 255, 0},
12
          {0, 0, 0, 0, 255},
13
          {0, 0, 0, 0, 255},
14
          {0, 255, 255, 255, 255}}};

Dass die Variable zeichen public ist ist aber natürlich unschön... 
Deshalb wirst du früher oder später wohl auch einen sogenannten 
Constructor 
(https://en.cppreference.com/w/cpp/language/initializer_list) benötigen. 
Und abgesehn davon vermutlich generell ein C++ Tutorial...
Gast
1
using Character = byte[7][5]; // 2 Dim Array Type definieren
2

3
template<typename Array> constexpr size_t arrayCount(const Array &array)
4
{
5
  return sizeof(array)/sizeof(array[0]);
6
}
7

8
class Symbol
9
{
10
  private:
11
    static const PROGMEM Character zeichen;
12
    
13
  public:
14
   void schreiben() const;
15

16
};
17

18

19
const Character PROGMEM Symbol::zeichen  = {
20
                                              {0, 255, 255, 255, 255},
21
                                              {0, 0, 0, 0, 255},
22
                                              {0, 0, 0, 0, 255},
23
                                              {0, 255, 255, 255, 0},
24
                                              {0, 0, 0, 0, 255},
25
                                              {0, 0, 0, 0, 255},
26
                                              {0, 255, 255, 255, 255},
27
                                            };
28

29
void Symbol::schreiben() const
30
{
31
  for (unsigned int i = 0; i < arrayCount(zeichen[0]); i++)
32
   for (unsigned int f = 0; f < arrayCount(zeichen); f++)
33
         Serial.println(pgm_read_byte(&(zeichen [f][i])));
34
}
35

36

37
Symbol symbol;
38

39

40
void setup() 
41
{
42
  Serial.begin(9600);      
43
  Serial.println("Start");
44
  symbol.schreiben();
45

46
}
47

48
void loop() 
49
{
50

51

52
}

Vielleicht hilft dir das ja einen Meter weiter....
Arduino Fanboy D. schrieb:
> template<typename Array> constexpr size_t arrayCount(const Array &array)
> {
>   return sizeof(array)/sizeof(array[0]);
> }

Das würde ich dann aber eher so schreiben:
1
template<typename Array, size_t N> constexpr size_t arrayCount(const Array (&array)[N])
2
{
3
  return sizeof(array)/sizeof(array[0]);
4
}

Vorteil ist, dass man das nicht versehentlich auf einen Zeiger oder 
einen Container anwenden und dabei Blödsinn rausbekommen kann.

PS: Ich merke grad, dass man es dann auch etwas vereinfachen kann:
1
template<typename Array, size_t N> constexpr size_t arrayCount(const Array (&array)[N])
2
{
3
  return N;
4
}
Gast
Danke!
Bis auf die Warnung ganz nett.
Den Vorteil nehme ich gerne.

Hier ohne Warnung
1
template<typename Array, size_t N> constexpr size_t arrayCount(const __attribute__((unused)) Array (&array)[N])
2
{
3
  return N;
4
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.