Ichki kodni kalit/case bayonotiga aylantiring

Men fotosuratlarda doimiy qiymatni o'qiyapman va lazer tashqi ob'ekt bilan kesilsa, u ovozli signal ohangini eshitadi.

Ba'zi odamlar tomonidan taklif qilinganidek, bu ishni osonlashtiradi. Quyidagi qisqa kodimni yozdim, uni o'zgartirishga yordam bera olasizmi?

agar case kodini o'zgartiradigan bo'lsa, case ifodasini o'zgartiradi.

 int sensorPin = A0;
 int sensorPin1 = A1;
 int sensorPin2 = A2;
 int sensorPin3 =  A3;
 int sensorValue0 = 0;
 int sensorValue1 = 0;
 int sensorValue2 = 0;
 int sensorValue3 = 0;
 const int BUZZER = 9;
 const int BUZZER1 = 7;
 const int BUZZER2 = 8;
 const int BUZZER3 = 5;

void setup() {
 Serial.begin(9600);
 pinMode(BUZZER, OUTPUT);
 pinMode(BUZZER1, OUTPUT);
 pinMode(BUZZER2, OUTPUT);
 pinMode(BUZZER3, OUTPUT);
//put your setup code here, to run once:
}

void loop() {
  sensorValue0 = analogRead(sensorPin);
  sensorValue1 = analogRead(sensorPin1);
  sensorValue2 = analogRead(sensorPin2);
  sensorValue3 = analogRead(sensorPin3);
  Serial.println(sensorValue0);
  delay(100);

  if (sensorValue0>920)
   noTone(BUZZER);
  else 
   tone(BUZZER, 500);

  if (sensorValue1>850)
   noTone(BUZZER1);
  else 
   tone(BUZZER1, 300);

  if (sensorValue2>850)
   noTone(BUZZER2);
  else 
   tone(BUZZER2, 700);
}
1
@SDsolar, yordam markazi kod sharhlari mavzu bo'yicha. Ushbu OPning noto'g'ri ishi bo'lgan yagona narsa loyiha tanqidiy yorliqni kiritmas edi.
qo'shib qo'ydi muallif Yoni Baciu, manba
Bu holda, agar operatorning if operatorlari va differn o'zgaruvchilari (sensorValue0, 1 va 2) uchun operatordan foydalana olmaysiz. Bundan tashqari, siz sensorValue3 uchun buzzerni yo'qotdingizmi?
qo'shib qo'ydi muallif Pat, manba

6 javoblar

Kalit faqat bitta o'zgaruvchidan turli xil alohida qiymatlarni tanlashi mumkin. Agar siz bir nechta parametrlarga egalik qilsangiz va alohida qiymatlarni qidirmagan bo'lsangiz, uni almashtirishdan foydalanishingiz kerak.

3
qo'shib qo'ydi

Bu holda, kalit so'zlari o'rinli bo'lmaydi.

Kodni optimallashtirish siz uchun ishni bajaradigan va asosiy pastadir ko'rinishini yaxshiroq bajaradigan funksiyani qo'shib, o'zgartirishi mumkin.

void readValue (const int& sensorPin, const int& limit, const int& buzzerPin, const int& frequency)
{
  const int value = sensorValue0 = analogRead(sensorPin);
  if (value > limit)
  {
    noTone(buzzerPin);
  }
  else
  {
    tone(buzzerPin, frequency);
  }
}

Shunday qilib, siz ruxsat beradigan pimler sifatida ko'proq qo'ng'iroqni va sensorni qo'shishingiz mumkin.

2
qo'shib qo'ydi
Aytgancha, yuqorida aytib o'tilgan umumiy overkill men sizni faqat muammo haqida fikrlashning boshqa yo'lini taklif qilyapman. Siz sensorni va buzg'ich pimni uzib tashlashingiz va ularni bu sinf ichidan yashirishingiz mumkin, faqatgina bir enumdan o'tib, ularni 2-qatorda ko'rib chiqishingiz mumkin. Shunga qaramasdan, uning overkill, lekin qiziqarli, siz o'ralgan bo'lsangiz :)
qo'shib qo'ydi muallif Thomas Myron, manba

"Kommutatorlik ishi ba'zi kishilar tomonidan tavsiya etilganidek osonlashtiradi".

Bu bepul maslahat juda qimmat bo'lishi mumkinligi haqidagi ajoyib misoldir :)

Agar siz noyob narsa qilmasangiz, siz hozirgi yondashuvingizdan yaxshiroq yo'l tutasiz.

tartibga solish: aytib o'tilganidek, bir switch/Case tuzilishi foydali bo'lishi mumkin bo'lgan vaziyatlarni ko'ra olaman. Misol uchun, agar siz bir nechta parametrlarni izchil to'plamlar majmui bilan solishtirishingiz kerak bo'lsa, kodni o'qishni qiyinlashtirmasdan buni qilishning bir usuli shunday bo'ladi:

THRESHOLD_TypeDef threshold(uint16_t val) {
  if (val < VAL1) return THRESHOLD1;
  if (val < VAL2) return THRESHOLD2;
  ...
  if (val < VALn) return THRESHOLDn;
}

THRESHOLD_TypeDef - bu sanaladi.

va sizning kodingizga quyidagi kabi yozishingiz mumkin:

   switch (threshold(myval)) {
   case THRESHOLD1: do_something1(); break;
   case THRESHOLD2: do_something2(); break;    
   ...

Uning afzalligi shubhasiz, yaxshiroq okunabilirlik va mustahkamlikdir: bir xil funktsiyani turli xil parametrlarga qo'llashingiz mumkin, buning uchun "tasniflash" ning izchil to'plamini yaratishingiz mumkin.

Kamchiliklari ham aniq: har bir eshik uchun (), faqat bir tasnif majmuini sinab ko'rishingiz mumkin. Lekin har doim turli xil parametrlarga qo'llaniladigan bir nechta funktsiyalarni yaratishingiz mumkin.

1
qo'shib qo'ydi

Faqat qiziqarli, bu erda masalani hal qilishning yana bir yo'li: C ++ sinfini yarating. Ushbu kod sizning dastlabki kodingizdan biroz kattaroq ko'rinishi mumkin, ammo afzallik, ya'ni qo'shimcha funktsiyalarni qo'shishni xohlasangiz, faqat sinfni o'zgartirish kerak.

class Sensor {
public:
    Sensor(uint8_t analog_pin, uint8_t buzzer_pin, uint16_t threshold, uint16_t tone_duration)
        : analog_pin(analog_pin), buzzer_pin(buzzer_pin), threshold(threshold), tone_duration(tone_duration)
    {
    }
    void setup() {
        pinMode(buzzer_pin, OUTPUT);
    }
    void loop() {
        sensor_value= analogRead(analog_pin);
        delay(100);
        if (sensor_value> threshold)
            noTone(buzzer_pin);
       else 
           tone(buzzer_pin, tone_duration);
    }
protected:
    uint8_t analog_pin, buzzer_pin;
    uint16_t threshold, sensor_value, tone_duration;
};

Keyin, Sensor moslamalarni yaratishingiz mumkin:

Sensor sensors[] = {
    Sensor(A0, BUZZER1, 920, 500),
    Sensor(A1, BUZZER2, 850, 300),
    Sensor(A2, BUZZER3, 850, 700)
};
const uint8_t num_sensors = sizeof(sensors)/sizeof(sensors[0]);

void setup() {
    for (int i = 0; i < num_sensors; i++) {
        sensors[i].setup();
    }
}
void loop() {
    for (int i = 0; i < num_sensors; i++) {
        sensors[i].loop();
    }
}
1
qo'shib qo'ydi

Actually, you cannot really rewrite this, due to the > operator instead of the == operator.

Bundan tashqari, siz uchta o'zgaruvchanlikni tekshirasiz va bitta switch bayonotini tekshirish uchun faqat bitta o'zgaruvchidan foydalanish mumkin.

Biroq, nima qilsangiz, bunday parametrlarga ega funktsiya yaratish:

void set(int sensorValue, int value, int buzzer, int frequency)
{
  if (sensorValue > value)
  {
       noTone(buzzer);
  }
  else
  {
       tone(buzzer, frequency);
  }
}

va qo'ng'iroq qiling:

 set(sensorValue0, 920, BUZZER, 500);
 set(sensorValue1, 850, BUZZER1, 300);
 set(sensorValue2, 850, BUZZER2, 700);
 set(sensorValue3, ...);//I think you miss this one
1
qo'shib qo'ydi

Sizning sharoitlaringiz shunga o'xshash:

bool condition = variable > someValue;

O'zgaruvchining qiymati (ya'ni, sensorValue ) shuning uchun doimiy bo'lishi kerak.

Biroq, switch iborasi bizning o'zgaruvchining qiymati alohida bo'lganida ishlatiladi.

Natijada kodingizda switch iboralarini ishlatishingiz mumkin emas.

1
qo'shib qo'ydi