Forum: PC-Programmierung std::array - Wie Zugriff auf Elemente


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 Veit D. (devil-elec)


Lesenswert?

Hallo,

warum funktioniert ein Zugriff auf ein Element eines std::arrays nicht, 
sobald der Datentyp ein struct ist? Warum gibt es plötzlich Probleme mit 
Integer Elementen? Ein cast hilft auch nicht. Zuerst auf dem AVR 
probiert. Dann in CodeBlocks. Will nicht. Was ist daran falsch?
1
#include <iostream>
2
#include <array>
3
using namespace std;
4
5
int main()
6
{
7
 ...
8
}

Was funktioniert:
1
array<array<int16_t, 4>, 3> arr2D {{
2
  {111, 222, 333},
3
  {444, 555, 666},
4
  {777, 888, 999},
5
}};
6
7
cout << arr2D[0][2] << endl;
8
cout << arr2D.at(2).at(2) << endl;

Aber mit Struktur nicht mehr.
1
struct Daten {
2
  int16_t left     {};
3
  int16_t right    {};
4
  int16_t current  {};
5
  char name [9] {'\0'};
6
};
7
8
array<array<Daten, 4>, 3> readArr {{
9
  {1000, 1500, 2000, "text.0"},
10
  {1111, 1501, 2222, "text.1"},
11
  {1222, 1502, 2333, "text.2"},
12
}};
13
14
// no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'std::array<main()::Daten, 4>::value_type' {aka 'main()::Daten'})|
15
cout << readArr[0][0])   << endl; 
16
17
// cannot convert 'std::array<main()::Daten, 4>::value_type' {aka 'main()::Daten'} to 'int16_t' {aka 'short int'} in initialization|
18
int16_t temp = readArr[0][0]; 
19
cout << temp << endl;

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Das hat nichts mit std::array zu tun. Du kannst ein struct wie "Daten" 
nicht einfach so direkt ausgeben. Wenn du es ohne Array machst:
1
int main () {
2
  Daten d { 1000, 1500, 2000, "text.0" };
3
  std::cout << d << std::endl;
4
}

Wird es genau so wenig funktionieren. Du musst deinen eigenen "operator 
<<" schreiben wenn du das ganze struct ausgeben können möchtest.

Veit D. schrieb:
> int16_t temp = readArr[0][0];

Und was soll das bewirken? Das ganze struct nach int16_t konvertieren?

Kann es vielleicht sein dass du einfach nur "array<Daten, 4>" statt "
array<array<Daten, 4>, 3>" (2-dimensionales Array) haben möchtest? Dann 
kannst du aber auch nicht einfach mit [0] auf die struct-Elemente 
zugreifen, sondern musst readArr[0].left o.ä. nutzen.

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Veit D. schrieb:
> Zuerst auf dem AVR
> probiert.

Rein interessehalber: mit welcher C++-Standardlib?

Zum Rest hat Niklas schon alles gesagt: Lies dein C++-Buch, Abschnitt 
grundlegende Grundlagen.

Oliver

von Veit D. (devil-elec)


Lesenswert?

Niklas G. schrieb:
> Kann es vielleicht sein dass du einfach nur "array<Daten, 4>" statt "

Hallo,

genau das war der entscheidende Hinweis. Ein 1D Array ist das. Ich habe 
das fälschlicherweise für ein 2D Array angesehen und partout gedanklich 
blind wollte ich das zum laufen bekommen. Dabei völlig übersehen das ich 
zum testen ein echtes int16_t 2D Array erstellt habe. Sieht optisch 
erstmal genauso aus.
Danke für den Wink zum Ausgang.
Jetzt läuft es.

von Wilhelm M. (wimalopaan)


Lesenswert?

Oliver S. schrieb:
> Rein interessehalber: mit welcher C++-Standardlib?

Wahrscheinlich: https://github.com/modm-io/avr-libstdcpp

Falls er nun nicht doch noch zu Übungszwecken mal std::array<> selbst 
geschrieben hat.

BTW: Fehlermeldungen lesen kann auch helfen. Da stand alles drin ...

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Veit D. schrieb:
> Zuerst auf dem AVR
> probiert.

Den Umgang mit der stdlibc++ lernt man am besten am PC, nicht µC.

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.