Elemente in int array

Hallo,

irgendwie habe ich ein Brett vor dem Kopf.
Ich möchte mit FastLED verschiedene LEDs einschalten, welche ich in arrays definiert habe:

int a[] = {2, 3};
int b[] = {6, 7, 8};

Nun möchte ich diese in einem for-loop einschalten:

SchalteEin(a, 147, 50);
void SchalteEin(int wort[], byte hue, int intensity)
{ 
  for (int i = 0; i < sizeof(wort); i++)
  {
    CHSV led;
    led.hue = hue;
    led.saturation = 255;
    led.value = intensity;
    
    hsv2rgb_spectrum(led, leds[wort[i]]);
    Serial.println(wort[i]);
  }
  FastLED.show();
  
}

Jetzt müsste doch sizeof(a) 2 liefern und sizeof(b) 3, was aber nicht klappt.

Wenn ich die void mit “a” aufrufe, leuchten 2 LEDs.
Wenn ich sie mit “b” aufrufe ebenfalls nur 2… Warum!?

Danke vorab.

Hallo,

Du verwendest sizeof() nicht richtig, da Du die Länge von int nicht berücksichtigst. Versuche mal sizeof(x)/sizeof(x[0]) als Länge für die Schleife. Habe ich von jurs gelernt.

Zur Veranschaulichung:

const int a[] = {2, 3};
const int b[] = {6, 7, 8};

void setup(void)
{
  Serial.begin(9600);
  Serial.print("sizeof(a) ");
  Serial.println(sizeof(a));
  Serial.print("sizeof(b) ");
  Serial.println(sizeof(b));
  Serial.print("sizeof(a) / sizeof(a[0]) ");
  Serial.println(sizeof(a) / sizeof(a[0]));
  Serial.print("sizeof(b) / sizeof(b[0]) ");
  Serial.println(sizeof(b) / sizeof(b[0]));
}

void loop() {}

Vielen Dank für Deine Antwort.

Hier mal mein kompletter Code:

#include <FastLED.h>
#define NUM_LEDS 300
#define DATA_PIN 3

CRGB leds[NUM_LEDS];

const int es[] = {2, 3};
const int ist[] = {6, 7, 8};

void setup() {
   Serial.begin(9600);
   FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
   FastLED.setMaxPowerInVoltsAndMilliamps(5,1000);
}

void loop() {

   ZeigeWort(ist, 147, 50);
  
}

void ZeigeWort(int wort[], byte hue, int intensity)
{ 
  Serial.println(sizeof(wort) / sizeof(wort[0]));
  
}

Hier gibt er immer “1” aus. Warum wird denn jetzt “ist” nicht richtig übergeben?

An manchen Tagen könnte ich schreien -.-

Das geht so nicht. Array Variablen zerfallen bei der Übergabe als Parameter in Zeiger (am besten gleich angewöhnen direkt einen Zeiger als Parameter zu nehmen, dann wird es deutlich!). Und Zeiger sind hier 16 Bit. Also 2 Byte.
Es hat seinen Grund weshalb man bei Standard C Funktionen immer die Größe des Arrays extra übergeben muss.

Eine andere Option wäre eine Referenz auf das Array zu übergeben und aus der Funktion ein Template zu machen. Dann geht sizeof() darin mit Arrays beliebiger Länge. Das wird für dich aber zu kompliziert sein.

Die richtige Lösung (zusätzlich Länge als Parameter) ist die einfachste und beste.

#define LENGTH(x) (byte)(sizeof(x)/sizeof(x[0]))

const int ist[] = {6, 7, 8}; // reichen nicht auch bytes?

void zeigeWort( const int *wort, byte len, byte hue, int intensity);

void loop() {   
    zeigeWort(ist, LENGTH(ist), 147, 50);
}

Willst du per template den zusätzlichen Parameter erzeugen, oder für jedes “Wort” eine eigene Funktion generieren? Beides ziemlich schräg, finde ich.