Arrays Index auslesen

Hallo, ich habe folgende Arrays:


int EINS[] = {26, 27, 28, 29};
int ZWEI[] = {0, 1, 2, 3, 4};
int DREI[] = {86, 87, 88, 89};
int VIER[] = {30, 31, 32, 33, 34};

ich versuche die ganze Zeit die Größe des jeweiligen Arrays auszugeben.
Also zb bei EINS würde ich gerne als Ergebnis 4 erhalten. Nur klappt das nicht so.

Weiterarbeiten würde ich nämlich mit einer For-Schleife die den Ermittelten längen Wert dann
als Grenze benutzt und dann mir alle Werte des EINS Arrays ausgibt.
Also 26
27
28
29

Ich würde gerne eine Möglichkeit finden das dynamisch zu machen, also nicht die tatsächliche Länge manuell Eintippen sondern das mit einer Funktion zu automatisieren.

Versucht habe ich es mit sizeof jedoch zählt der nicht den Index sondern jede einzelne Zahl.
Ich programmiere fast nur in Python und bin hier etwas unerfahren :slight_smile:
Danke für eure Hilfe
Franz

thank @anon46966594

#define arrSize(x) sizeof(x) / sizeof(x[0])
1 Like

Hi,
If you google;

array length arduino

You will find this reference.

And an example of how to use it with an array of numbers.

Thanks.. Tom... :grinning: :+1: :australia:

Ah, perfekt, genau was ich suchte ! BESTEN DANK

Ihr Beitrag wurde an seinen aktuellen Speicherort verschoben, da er besser geeignet ist.

dann solltest du auch nach "range based for loop c++" googeln

weil

for (auto &i : EINS)
{
  Serial.println(i);
}

arbeitet dein Array auch durch.

1 Like

Intressanter Code, wusste ich nicht, vielen Dank für den Tipp!

Es gibt dann noch mehr Möglichkeiten, Überraschungen oder was auch immer.

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

int VIER[] = {30, 31, 32, 33, 34};

template<typename ArrayType, size_t count>
constexpr size_t arrayCount(const ArrayType (&)[count])
{
  return count;
}

void setup()
{
  Serial.begin(9600);
  size_t anzahl = arrayCount(VIER);
  cout << F("VIER hat ") << anzahl << F(" Elemente") << endl;
}

void loop()
{
}
1 Like

Warum reicht das nicht:

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"
unsigned int VIER[] = {30, 31, 32, 33, 34};
void setup()
{
  Serial.begin(115200);
  size_t anzahl = sizeof(VIER)/sizeof(VIER[0]);
  cout << F("VIER hat ") << anzahl << F(" Elemente") << endl;
}
void loop()
{
}

Ich kann keinen Unterschied erkennen.
Selbst ein Einzeiler

Serial.begin(115200);  cout << F("VIER hat ") << sizeof(VIER)/sizeof(VIER[0]) << F(" Elemente") << endl;

bringt das gleichsame Kompilat.

Natürlich!

Nachtrag:
Hast du echtes Interesse?
Oder willst du nur gegen rudern?

Für die Leser mit echtem Interesse:

Ich schon.
Vorgeschlagen wurde ein Makro.
Meins ist eine Funktion.

Dem Kurzsichtigen wird es reichen.
Dem Liebhaber der Type Traits springt es ins Auge.
Ist es doch erweiterbar/variierbar.

-------

Fehler in Verbindung mit Makros sind häufiger mal recht Kryptisch.

sizeof(VIER)/sizeof(VIER[0])
Redundantes Schreiben der VIER, damit Fehlerträchtig beim Copy and Paste

Die sizeof Variante benötigt eine Instanz des Arrays.
Über die Type Traits gegangen, genügt der Type um die Anzahl zu ermitteln.

-------

Tipp:
Die Beschäftigung mit den Type Traits eröffnet einem u.A. das Funktionale Programmierparadigma.
Wer den Sinn nicht erkennen kann, wird den Sinn auch (noch) nicht verstehen können.
Das ist also ein rekursives Problem.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.