Forum: Mikrocontroller und Digitale Elektronik C++ Objekt mit Array


von Stefan H. (stefan_h143)


Lesenswert?

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
};

von Vincent H. (vinci)


Lesenswert?

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...

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

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....

von Rolf M. (rmagnus)


Lesenswert?

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
}

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

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
}

von Vincent H. (vinci)


Lesenswert?

Arduino Fanboy D. schrieb:
> 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 
2
> __attribute__((unused)) Array (&array)[N])
3
> {
4
>   return N;
5
> }
6
>

https://en.cppreference.com/w/cpp/language/attributes/maybe_unused

oder den Namen der Variablen einfach weglassen

von Einer K. (Gast)


Lesenswert?

Vincent H. schrieb:
> oder den Namen der Variablen einfach weglassen

Das funktioniert nicht, wg. dem [N]

von Rolf M. (rmagnus)


Lesenswert?

Also bei mir geht es.

von Vincent H. (vinci)


Lesenswert?

Arduino Fanboy D. schrieb:
> Vincent H. schrieb:
>> oder den Namen der Variablen einfach weglassen
>
> Das funktioniert nicht, wg. dem [N]

https://godbolt.org/z/Iof0RY

von Einer K. (Gast)


Lesenswert?

Ich nehme alles zurück, und behaupte ab jetzt das Gegenteil

von M.K. B. (mkbit)


Lesenswert?

Man könnte dann aber auch gleich std:: array nehmen.

von Einer K. (Gast)


Lesenswert?

M.K. B. schrieb:
> Man könnte dann aber auch gleich std:: array nehmen.
Ja, das wäre schön, wenn der AVR-GCC die STL dabei hätte.

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.