intervalCount = sizeof(TEST); // das geht -> intervalCount = 8
Wie kann ich daraus eine Funktion machen? Die Arraygröße soll nicht defined werden.
So geht es jedenfalls nicht. Wo ist mein Denkfehler?
void setIntervalCount(const uint8_t timeIntervalArray) {
intervalCount = sizeof(timeIntervalArray); // falsch -> intervalCount = 2, wohl nur die size vom Pointer, aber wie bekomm ich hier die Elementanzahl?
}
LeRoi:
void setIntervalCount(const uint8_t timeIntervalArray) {
intervalCount = sizeof(timeIntervalArray); // falsch -> intervalCount = 2, wohl nur die size vom Pointer, aber wie bekomm ich hier die Elementanzahl?
}
Wenn Du ein Arrray mit null Elementen deklarierst, und es nicht initialisierst, dann hat es null Elemente. Du hast quasi nur den Arrray-Pointer timeIntervalArray mit 2 Bytes (Pointergröße auf 8-Bit Atmegas) deklariert.
Danke für die Antworten. Ja, irgendwie etwas umständlich unschön alles. Hab mich eben zu lange mit Java beschäftigt. Mit Assembler wär es noch hässlicher mit den ganzen 'magic numbers', oder Vordefinitionen, die dann nötig werden. Jetzt fällt mir auch auf, warum man in vielen C Funktionen mit buffern oft die buffersize übergibt.
Mir ist noch ne Alternnative zu dem template eingefallen. Template kannte ich noch garnicht. Ich nehm jetztn Makro. Da kann ich mir das doppelte Angeben des gleichen arrays auch sparen.
#define FUNCTION(x) function(x, sizeof(x))
Eine zusätzliche Variable für die array size wollte ich verhindern. Wieder was Neues gelernt.
Eine Frage noch:
Warum nimmt man oft bei size of sizeof(test) / sizeof(test[0])? Bei einem byte array sollte doch sizeof(test) allein auch reichen? Jedenfalls liefert es den gleichen Wert. Bei größeren Elementen versteh ich es ja.
@Serenifly: Da hast du einen seltsamen Denkfehler, finde ich:
Warum übergibst du eine Arrayreferenz als Parameter, wenn du die Array-Größe nicht auch mit übergibst?
Als Parameter geht nur ein byte-Array mit 3 Elementen.
Ich meine, entweder arbeitet func immer mit dem globalen Array byte TEST[3], dann braucht auch keine referenz dazu als Parameter übergeben werden, oder func geht mit jedem byte Array, dann muss ihm aber auch die Größe mit übergeben werden.
sizeof innerhalb der Funktion, um dies variabel zu halten, funktioniert so jedenfalls nicht wirklich, denke ich.
sizeof ist keine Funktion, die zur Laufzeit einen Wert ermittelt.
Der "Fehler" ist ein anderer: es geht schon mit verschiedenen Arrays. Aber nur wenn die alle die gleiche Größe haben. Dann könnte man natürlich auch gleich auf ARRAY_SIZE direkt zugreifen, statt nochmal sizeof() zu machen.
sizeof() geht in diesem Fall weil die Größe im Parameter steckt.
Wenn man mehrere Arrays unterschiedlicher Größe als Argument will, kann man wie gesagt ein Template draus machen. Das ist das gleiche Prinzip. Aber dann sollte die Funktion nicht allzu groß sein, sonst steigt der Flash verbrauch evtl. unangenehm stark.
Richtig, aber einfacher wäre doch, wenn die Funktion verschiedene Array-Größen können soll, die Array-Größe auch als Parameter mitzugeben. Oder?
"sizeof ist keine Funktion, die zur Laufzeit ausgewertet wird!" ist meiner Meinug nach die Antwort auf die Frage "Wo ist mein Denkfehler?"