Verwenden von Arrays, Binärdaten und bitRead

Dies ist mein erster manuell eingegebener Code. Ich bin mir sicher, dass es einige eklatante „Schülerfehler“ geben könnte, also habe ich mich gefragt, ob die Leute es „einmal vorbei“ geben könnten. Insbesondere habe ich nie C ++ – Arrays verwendet, binäre Daten darin gespeichert und dann versucht, sie etwas zu lesen In Perl viel einfacher: Sie würden einfach ein mehrdimensionales Element wie das folgende verwenden:

@code1=("10101010", "01010101"); $bit=$code1[0][0] (..through to..) code1[0][7] $bit=$code1[1][0] ... code1[1][7] 

Das ist also mein Arduino-Code. Willkommen zu Vorschlägen

int pinArray[]={2,3,4,5,6,7,8,9}; int code1[]={B10101010, B01010101,B10101010, B01010101,B10101010, B01010101}; int count=0; int split=0; // Counter for the bit loop int led; // Store bit data byte x; // Used to store the binary data in code1 void setup(){ for (count=0; count<8; count++){ pinMode(pinArray[count],OUTPUT); // Sets pinMode as output on pinArray pins ] } void loop(){ for (count=0; count<6; count++){ x=code1[count]; ledDisplay(x); } } void ledDisplay(){ for (split=7; split>=0; split--){ led=bitRead(x,split); if (led == 1){ digitalWrite(split+2,HIGH); } else{ digitalWrite(split+2,LOW); } } } 

Habe gerade die Aufteilung geändert, da realisiertes Bit7 die am weitesten links stehende Ziffer ist. Bei der Aufteilung addiere ich 2 zum Wert. Muss dies eingeschlossen werden Klammern, dh (split + 2)?

Kommentare

  • Ihre Einrückungen sind verwirrend. Drücken Sie Strg + T
  • Wenn ich Wenn ich meinen Code im Texteditor schreibe, verwende ich die Tabulatortaste, um Code einzurücken, sodass die " für " Klammern usw. öffnen / schließen usw. in derselben Spalte (die in meinem Desktop-Browser korrekt angezeigt wird – möglicherweise auf dem Telefon möglicherweise falsch – wird daher CRTL + t in f verwenden Zukunft beim Posten. (Ich weiß, dass CODE1 ' nicht der gleichen Konvention folgt, aber dann versuche ich, in derselben Zeile offen / geschlossen zu bleiben, damit es nicht ' ist t ' trifft auf ' das nächste Array, wenn man bedenkt, dass ich 14 solcher Arrays haben werde) Dies ist nicht ' bedeutet nicht, dass Sie ' böse ' sind, da ich es zu schätzen weiß, dass Sie sich die Zeit genommen haben, hilfreich zu sein und nur zu zeigen Meine persönliche ' Namenskonvention '
  • Strg-T ist nur eine schnelle Möglichkeit, den Code korrekt einzurücken Was auch immer der Standardstil der IDE ' ist. Sie müssen es jedoch nicht ' verwenden. Sie können einen beliebigen Einrückungsstil verwenden, wenn Sie ihn manuell bearbeiten. Alternativ können Sie die IDE für Ihren Lieblingsstil konfigurieren . Stellen Sie einfach sicher, dass Sie einen Einrückungsstil verwenden und ihn konsistent anwenden.

Antwort

Es gibt nur zwei Fehler I. kann in Ihrem Programm erkennen:

  1. Ein Codeblock sollte durch geschweifte Klammern begrenzt werden:

     for (count=0; count<8; count++){ pinMode(pinArray[count],OUTPUT); } // ← ‘}’ instead of ‘]’  
  2. Wenn eine Funktion erwartet, dass Argumente übergeben werden, sollten diese als Parameter im Funktionsprototyp deklariert werden:

     void ledDisplay(byte x){ // ← mind the “byte x” // ... }  

Abgesehen davon hier einige Vorschläge, um den Code aussehen zu lassen Schöner und hoffentlich wartbarer:

  • konsistent einrücken
  • Verwenden Sie const, um die Verwendung von Konstanten
  • zu qualifizieren benannte Konstanten anstelle von magischen Zahlen
  • halten Variablen möglichst lokal
  • Beachten Sie, dass ein int, das entweder 0 oder 1 ist, einem booleschen
  • use pinArray[] für den Zugriff auf die Pins

Übernehmen Bei diesen Vorschlägen erhalte ich Folgendes:

 const int PIN_COUNT = 8; const int pinArray[PIN_COUNT] = { 2, 3, 4, 5, 6, 7, 8, 9 }; const int CODE_COUNT = 6; const int code1[CODE_COUNT] = { B10101010, B01010101, B10101010, B01010101, B10101010, B01010101 }; void setup() { for (int count = 0; count < PIN_COUNT; count++) { pinMode(pinArray[count], OUTPUT); } } void loop() { for (int count = 0; count < CODE_COUNT; count++) { ledDisplay(code1[count]); } } void ledDisplay(byte x) { for (int split = 7; split >= 0; split--) { if (bitRead(x, split)) { digitalWrite(pinArray[split], HIGH); } else { digitalWrite(pinArray[split], LOW); } } }  

Kommentare

  • Ausnahmsweise wünschte ich mir einmal, ich hätte die Möglichkeit, eine Antwort zu bewerten. Sie haben mir sehr konstruktive Ratschläge gegeben und nicht nur hier und da einen Hinweis. (Die "] " war nur ein Tippfehler, aber danke, dass Sie darauf hingewiesen haben.) Ich mag auch den booleschen Kommentar, der eine speichern wird extra ein paar Bytes. Ich werde jetzt " const " untersuchen, um zu sehen, was genau das bewirkt … Auch hier bin ich ehrlich gesagt sehr dankbar für Ihr eingehendes Feedback

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.