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

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.

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.