Utilisation de tableaux, de données binaires et de bitRead

Cest mon premier code tapé manuellement. Je suis sûr quil peut y avoir des « erreurs décolier » flagrantes, alors je me suis demandé si les gens pouvaient lui donner le « once over » En particulier, je nai jamais utilisé de tableaux C ++, stockant des données binaires à lintérieur, puis essayant de les lire un peu par bit. En perl, beaucoup plus facile; vous utiliseriez simplement un truc multidimensionnel comme celui-ci:

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

Voici donc mon code Arduino. Bienvenue dans les suggestions .

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); } } } 

Je viens de modifier le fractionnement car le bit 7 est le chiffre le plus à gauche. En mode fractionné, jajoute 2 à la valeur. Cela doit-il être inclus dans crochets, cest-à-dire (split + 2)?

Commentaires

  • Vos retraits sont confus. Appuyez sur Ctrl + T
  • Quand je écris mon code dans léditeur de texte, jutilise la touche de tabulation pour indenter le code, de sorte que les " pour " les crochets ouvrants / fermants, etc. dans la même colonne, (qui semble safficher correctement dans le navigateur de mon ordinateur – peut-être incorrect sur le téléphone – utilisera donc CRTL + t dans f utile lors de la publication. (Je sais que CODE1 ne suit ' que la même convention, mais jessaye de garder ouvert / fermé sur la même ligne donc ça ne ' t ' exécuter dans ' le tableau suivant, en gardant à lesprit que jaurai 14 de ces tableaux) Ceci nest pas ' t censé être ' méchant ' pour vous, car japprécie que vous preniez le temps dêtre utile, simplement en le montrant ma ' convention de dénomination personnelle '
  • Ctrl-T est juste un moyen rapide dobtenir le code correctement mis en retrait quel que soit le style par défaut de lEDI '. Cependant, vous n’avez pas ' à l’utiliser. Vous pouvez utiliser le style dindentation que vous voulez si vous le gérez manuellement. Vous pouvez également configurer lEDI pour votre style préféré . Assurez-vous simplement dadopter un style de retrait et de lappliquer de manière cohérente.

Réponse

Il ny a que deux erreurs I peut repérer dans votre programme:

  1. Un bloc de code doit être délimité par des accolades:

     for (count=0; count<8; count++){ pinMode(pinArray[count],OUTPUT); } // ← ‘}’ instead of ‘]’  
  2. Si une fonction sattend à recevoir des arguments, ceux-ci doivent être déclarés comme paramètres dans le prototype de la fonction:

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

Autre que cela, voici quelques suggestions pour donner un aspect de code plus agréable et, espérons-le, plus facile à maintenir:

  • indentez systématiquement
  • utilisez const pour qualifier les constantes
  • use des constantes nommées au lieu de nombres magiques
  • gardez les variables locales si possible
  • notez quun entier qui vaut 0 ou 1 équivaut à un booléen
  • utilisez pinArray[] pour accéder aux broches

Appliquer Ces suggestions, jobtiens ce qui suit:

 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); } } }  

Commentaires

  • Pour une fois, jaimerais sincèrement avoir la possibilité de voter pour une réponse. Vous mavez donné des conseils très constructifs, plutôt quun simple indicateur ici et là. (Le "] " était juste une faute de frappe, mais merci de lavoir signalé) Jaime aussi le commentaire booléen, qui sauvera un quelques octets supplémentaires. Je vais maintenant rechercher " const " pour voir ce que cela fait exactement … Encore une fois, je suis honnêtement très reconnaissant pour vos commentaires approfondis

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *