std::array - Wie Zugriff auf Elemente

OP #7505542
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;
Persönliche Seite #7505557
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.

OP #7505586
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren