Bei deinem Code defienierst Du ein Array mit 24 Werten, aber ohne dem Array mitzugeben das auch 24 Speicherplätze haben soll.
Ist unschöner Code. Wurde das nicht beim Compilieren angemeckert?
wenn du also 24 verschiedene Kanäle hast, warum hast Du dann nur einmal State und auch nur einmal preMills ?
Wann enthält State den Status von welchem der 24 Kanäle und wann enthällt preMills die Startzeit von welchem Kanal?
Anzahl2 ist ja der Index mit dem du alles was in
if(buttonState == Anzahl[Anzahl2])
drin ist zu 24 verschiedenen Programmteilen machst.
nur kannst Du mit State nicht 24 Verscheidene Zustände gleichzeitig speichern State[Anzahl2] könnte das.
Genau das Selbe bei preMills: --> preMills[Anzahl2].
Gehe Deinen Code erst mal durch und führe ihn auf Papier aus. Schreib Dir dazu immer auf welche Variable welchen Wert hat.
Dann fallen Dir solche Sachen sofort auf. denn die eine Variabel wird halt ständig neu befüllt und liefert dann für index 1 den Wert zurück der ihr vorher bei index 24 eingeschrieben wurde und schon lange nicht mehr den Wert der beim letzten Durchlauf von Index1 geschrieben wurde.
"unschöner Code"?
auf was beziehst du dich?
auf dies hier:
int Anzahl[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; //Kanäle die geschalten werden dürfen
falls ja: dieser Teil ist völlig korrekt, super schön, entspricht vollständig den C++(04/11) und C99 specs und da hat der Compiler absolut überhaupt nichts dran rumzumeckern
OT, ps, allerdings: "geschaltet werden dürfen, nicht: geschalten...![]()
Ich habe auch geschrieben unschön nicht falsch.
Unschön deshalb, weil man mit 'int Anzahl[24] = {...' sofort die Größe des Array sieht auch wenn da mal andere Werte stehen als eine monoton steigende, ununterbrochene Folge aus natürlichen Zahlen.
Wird hilfreich wenn man mal nach 2-3 Jahren seinen eigenen Code versucht zu verstehen oder was verändern will.
Da ich schon seit über 3 Jahrzehnten programmier, bin ich über so Schwächen selbst schon oft genug gestolpert.
Irgendwann kommt der Punkt wo man seinem jüngeren ich dankbar ist für jeden schnell zu verstehenden Code den man hinterlassen hat.
Da auch kein Hinweis vorhanden ist das es sich um ein dynamisches Array handelt, kann man das halt für die Lesbarkeit machen.
Geändert von i_make_it (29.06.2017 um 17:51 Uhr)
nein, sorry, der Code ist weder unschön, noch hat der Compiler Grund zu meckern:
Es ist per
int Anzahl[] = // ...
der einzige (!) mögliche (!) Weg, diesen 24er array direkt bei der Definition zu initialisieren.
Definiert man ihn per
int Anzahl[24] //...
kann man ihn anschließend nicht mehr per
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
initialisieren.
In diesem Falle legt C also eindeutig die einzig mögliche und richtige Syntax fest, die Frage nach schön oder nicht stellt sich also gar nicht.
Und ob der Code Enkel-sicher ist, ist sowieso hier nicht wichtig - er muss zunächst einmal überhaupt nur einfach mal funktionieren....![]()
Hm, ich weis jetzt nicht von welcher Programmiersprache Du schreibst, aber ich bin grade bei ISO IEC 14882.
Weder mein Borland noch Arduino haben damit ein Problem, das ich ein statisches Array genau so definiere und initialisiere.
Wenn Das bei Dir nicht möglich ist, und es für Dich der einzige Weg ist es wie ein dynamisches Array zu definieren, würde ich an deiner Stelle mal Deine Entwicklungsumgebung überprüfen.
Und falls Du kein Buch über C++ hast, es gibt auch Webseiten die das erklären.
http://www.cplusplus.com/doc/tutorial/arrays/
Ich habe mal bei meinem Borland "strict" mal abgestellt. dann wird auch 'int Anzahl[] = {.....}' nicht an gemeckert.
Bei Arduino hatte ich es tatsächlich so noch nicht probiert, da mein erstes C auf µC's das MIT interactive C war und ich seit dem Array so definiere.
Dynamische Array auf einen µC mache ich halt aus 'Tradition' nicht. Liegt vieleicht daran das ich heute noch Speicherplatz als kostbar betrachte.
Bin halt auch noch gewohnt ganze Programme, Stack und Variablen Bereich mit 4K RAM hinzubekommen.
Und bei 'int Anzahl[24]' sehe ich halt direkt 2Byte (für int) mal 24 gleich 48 Byte Speicherbedarf.
Und muß nicht erst zeitraubend die Kommas abzählen und dann plus 1 um die Anzahl der Felder zu erhalten.
Aber wie gesagt ich empfinde es als unschönen Code, funktionieren tut es.
Diese Aussage, ist aber schlichtweg falsch (Zumindest für eine ISO IEC 14882 konforme C++ Implemtierung. Und was anderes ist ja kein C++ sondern eine andere Sprache).
Es ist einer der möglichen Wege.
Geändert von i_make_it (30.06.2017 um 06:57 Uhr)
Da muss ich HaWe jetzt aber beispringen, zu diesen C++ Zeiten war ich an der Uni.
Ja, die Initialisierung von Array in der Form
gibt es schon seit Anfang an in C++, weil es sie schon seit dieser Zeit in C gab.Code:int feld[] = { 1, 2, 3 };
Und ja, es war damals, also auch in den ersten ISO Normen, die einzige Möglichkeit ein C Array direkt bei der Definition zu initialisieren. Und zwar nur C Array keine Vektoren oder so.
Und ja, es war schon damals guter Stil, die Größe des Feldes nicht extra in die eckigen Klammern zu schreiben.
Daraus, und das vermischt HaWe etwas, wurde die "Uniform Initialisation" in C++11, neuer Stil wäre also eher
Hier wird auch bei n nicht mal der Typ angegeben, das nennt sich AAA-Stil (almost always auto), wird von einigen Experten empfohlen (Scott Meyers, Herb Sutter, ...), ist aber nicht unumstritten.Code:array<int> feld = { 1, 2, 3 } auto n = feld.size();
Man kann heute übrigens, in aktuellem C++, in der Arduino IDE nur bei den Teensy Boards, alles mit geschweiften Klammern initialisieren
Warum das in der ISO Norm u.a. geändert wurde, kann man hier lesenCode:int a = 1; int b{2};
https://en.wikipedia.org/wiki/Most_vexing_parse
Geändert von Mxt (05.07.2017 um 13:10 Uhr) Grund: Verschrieben
Also mir war es erstmal wichtig das es funktioniert! Schönmachen kann man es danach immer noch... Habe es jetzt komplett fertig aber anders gelöst. Falls es dich interessiert:
Ist zwar noch nicht ganz schön aber macht was es soll.Code:#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Conceptinetics.h> DMX_Master dmx_master ( 24 , 2 ); RF24 radio(7, 8); // CNS, CE const byte address[6] = "00001"; long kanal; #define ANZAHL_KANAL 24 uint32_t anschaltzeit[ANZAHL_KANAL]; int Anzahl[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; const uint32_t OnTime = 300; void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); dmx_master.enable (); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MAX); radio.startListening(); } void loop() { checkKanal(); if (radio.available()){ radio.read(&kanal, sizeof(kanal)); if(kanal == Anzahl[kanal-1]) { kanalEinschalten(kanal); } } } void kanalEinschalten(byte nummer) { // 1 bis 24 anschaltzeit[nummer-1] = millis(); digitalWrite(nummer,HIGH); dmx_master.setChannelValue (nummer , 255); } void kanalAusschalten(byte nummer) { // 1 bis 24 anschaltzeit[nummer-1] = 0; digitalWrite(nummer,LOW); dmx_master.setChannelValue (nummer , 0); } void checkKanal() { uint32_t aktMillis = millis(); for(byte i=0; i<ANZAHL_KANAL; i++) { if (anschaltzeit[i] != 0 && aktMillis - anschaltzeit[i] >= OnTime) kanalAusschalten(i+1); } }
Trotzdem nochmal vielen dank!
Lesezeichen