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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan H. (stefan_h143)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht 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....

: Bearbeitet durch User
von Rolf M. (rmagnus)


Bewertung
-1 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht 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
}

: Bearbeitet durch User
von Vincent H. (vinci)


Bewertung
-1 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht lesenswert
Vincent H. schrieb:
> oder den Namen der Variablen einfach weglassen

Das funktioniert nicht, wg. dem [N]

von Rolf M. (rmagnus)


Bewertung
-1 lesenswert
nicht lesenswert
Also bei mir geht es.

von Vincent H. (vinci)


Bewertung
-1 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht lesenswert
Ich nehme alles zurück, und behaupte ab jetzt das Gegenteil

von M.K. B. (mkbit)


Bewertung
1 lesenswert
nicht lesenswert
Man könnte dann aber auch gleich std:: array nehmen.

von Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.