switch

Valerman
Offline
Зарегистрирован: 06.01.2020

Подскажите как оператор switch case, заставить работать вместе с датчиком температуры? Я так понял в switch подходят тип данных только int и char. Как число от показаний датчика вставить тогда, если показания с точкой? В инете примеров нет.

#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE    DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  switch () { 
    case 1: //тут температура от 20 до 24.9
      Serial.println("1111");
      break;
    case 2: //тут 25-30 градусов
      Serial.println("2222");
      break;
  }


 

bwn
Offline
Зарегистрирован: 25.08.2014

Округлить до безточки. БайтА, али интА.)))

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот тут какая логика: case 1: //тут температура от 20 до 24.9 ?

Valerman
Offline
Зарегистрирован: 06.01.2020

sadman41 пишет:

Вот тут какая логика: case 1: //тут температура от 20 до 24.9 ?

когда в case 20-24 градусов : выполняется задание. 

Везде примеры как под копирку. А как case сделать case в диапазоне от 20 до 30 не пишут.
switch (var) {
    case 1:
      //выполняется, когда var равно 1
      break;
    case 2:
      //выполняется когда  var равно 2
      break;
bwn
Offline
Зарегистрирован: 25.08.2014

Valerman пишет:

А как case сделать case в диапазоне от 20 до 30 не пишут.

Может потому, что это не самая лучшая идея? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Как это - не пишут? Пишут: https://www.geeksforgeeks.org/using-range-switch-case-cc/

Только с float-константами в case это не прокатит.

Однако, переменная типа float, полагаю, будет неявно приведена к int и запись типа case 20 .. 24 вполне себе сработает. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Valerman пишет:

 

Везде примеры как под копирку. А как case сделать case в диапазоне от 20 до 30 не пишут.
 

Потому что оператор case для этог не подходит. В вашем случае надо использовать if

 

if (var >=20 &&  var <22){

... делаем что нибудь
} else
if (var >= 22 && var <24){
.. делаем что нибудь еще
} else
if (.....) {
 ..}
else {
 делаем если ничего другого не подошло
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Как это - не пишут? Пишут: https://www.geeksforgeeks.org/using-range-switch-case-cc/

О как, а я, со своим языковым дебилизмом, и не знал. Делал на ифах, православных, и не парился. А теперь, новые печали.((( Вот зачем?))))

sadman41
Offline
Зарегистрирован: 19.10.2016

Не вижу смысла париться и теперь. Я об case range вспоминаю только тогда, когда об этом спрашивают ;) А в быту тоже лесенки if-ов строю.

Valerman
Offline
Зарегистрирован: 06.01.2020

Спасибо за ответы 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sadman41 пишет:

Не вижу смысла париться и теперь. Я об case range вспоминаю только тогда, когда об этом спрашивают ;) А в быту тоже лесенки if-ов строю.

если в тексте программы постоили вы лесенкой больше двух if, то похоже вы тупите. Надо писать или if(  && )   или if/else if/ else if/ else .  Лесенка if источник визуально не контролируемой ошибки

sadman41
Offline
Зарегистрирован: 19.10.2016

Спасибо, что не заставляешь в классы всё обёртывать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:
Лесенка if источник визуально не контролируемой ошибки
Абалдеть! В старые времена по весне в полнолуние все обычно на goto кидались, а теперь уже и if не угодил :-(

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

иногда и без гото никак)
например выход из вложенных циклов)

гото в сишке еще не самый хардкор)

есть еще сетджамп лонгджамп который вообще
скачет по стековым фреймам)

кстати на ардуинке лонгджамп работает?)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

baby_in_Arduino пишет:
на ардуинке лонгджамп работает?)

да.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

baby_in_Arduino пишет:
иногда и без гото никак) например выход из вложенных циклов) гото в сишке еще не самый хардкор) есть еще сетджамп лонгджамп который вообще скачет по стековым фреймам) кстати на ардуинке лонгджамп работает?)

За >20 лет программирования на С++ - ни разу не сталкивался с необходимостью применения goto, в том числе - при вложенных циклах. Путает goto прочтение логики - очень путает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

так c case вроде читабельнее код делается не находите???

(интересно по объему кода что)

pps сейчас луна на половине, растущая )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

baby_in_Arduino пишет:
иногда и без гото никак)

например выход из вложенных циклов)

За последние четверть века ни разу не столкнулся с необходимостью использовать goto. 

А если из вложенных циклов иначе не выйти, может, следует подумать о том, чтобы сами циклы переписать более адекватным образом?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DIYMan пишет:

За >20 лет программирования на С++ - ни разу не сталкивался с необходимостью применения goto, в том числе - при вложенных циклах. Путает goto прочтение логики - очень путает.

Не могу похвастаца тем же. :) 

void internalRead(void) override {
		
         uint8_t data[DEV_MEMORY_SIZE];
	 int		error = 0;

		if (!WakeUpDevice(FDevAddress)) {
			error = err_i2c_DeviceNotFound;
			goto err_exit;
		}

		delay(5);

		Wire.beginTransmission(FDevAddress);
		Wire.write(CMD_READ);
		Wire.write(0x00);
		Wire.write(0x04);
		if (Wire.endTransmission() > 0) {
			error = err_i2c_ReadError;
			goto err_exit;
		}

		delay(2);


		Wire.requestFrom(FDevAddress, DEV_MEMORY_SIZE);
		if (Wire.readBytes(data, DEV_MEMORY_SIZE) != DEV_MEMORY_SIZE) {
			error = err_i2c_ReadError;
			goto err_exit;
		}

		
		if (!CheckCRC(data,DEV_MEMORY_SIZE-2)) {
			error = err_i2c_CRCError;
			goto err_exit;
		}

		Check(data);

		return;

	err_exit:
		if (error == err_i2c_CRCError) {
			PostMessage(msg_Error, error);
		}
		else {
			Error(error);
		}
	}

иногда, без goto код получаеца более на.уеверченным, особенно, када исключений нет. :) 

Можете кидать в меня Дейкстрой. 

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

вот DetSimen напомнил мне еще один паттерн в чистой сишке с применением goto, это конечно же обработка ошибок

вообще мне в сишке запомнилось два случая использования goto

1. это когда надо выйти из вложенных циклов не заводя лишние флажки которые надо проверять в каждом цикле(что по моему только мусорит код)

2. обработка ошибок в чистой сишке
это либо паттерн с goto
либо цепочка вложенных if
либо уж совсем хардкор на сетджамп лонгджамп

с goto мне код казался даже чище чем лесенка if

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

pps сейчас луна на половине, растущая )))

Так и я ж говорю, народ к полнолунию готовится :-)

sadman41
Offline
Зарегистрирован: 19.10.2016

По мне так когда приходится биться за кажный байт - лучше джампнуть через goto, чем заводить всякие условия.

Можно, конечно, полировать какаю-нить процедуру разворачивая и сворачивая циклы, переписывая кажный раз, но, как говорится - человек предполагает, а компилятор оптимизирует.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

pps сейчас луна на половине, растущая )))

Так и я ж говорю, народ к полнолунию готовится :-)

то-есть апофеоз нам только предстоит )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn,

та, не, Народ перед пятницей чуток разминается. Сраться из-за goto - вот это уж точно неприлично - куда как неприличнее, чем его использовать. :-)

А использование - ну, ещё один инструмент в ящике. Каждый сам решает что ему в ящике таскать (если в конторе корпоративного стандарта нет).

Кстати, о корпоративных стандартах:

был у нас один MISRA-ст, всё хотел нас в свою веру затащить, так в их MISRA-стском "Символе Веры" прямо сказано (стр. 65) : "The goto statement shall not be used" (здесь и далее номера страниц по PDF файлу, а не написанному на странице).

а вот ребята из NASA, похоже приземлённее немного - их "руководство по стилю" допускает goto в тех случаях, о которых как раз говорил baby_in_Arduino, см на стр. 38 и 67.

Так что, baby_in_Arduino, если нужна будет работа - на АвтоВАЗ даже не суйтесь, а вот в NASA попробуйте - могут и взять.

Ну, и наконец, специальная вкусняшка для совсем начинающих.

Вы, правда думаете, что умеете использовать goto? Ну, знаете, молодой матрос - салажонок думает, что он умеет материться, пока не встретит матёрого, боцмана :-) в общем, запускайте и разбирайте примеры, "жратва акулья" :---)))

Первый пример - примерно то, что нужно ТС - делаем что-то в зависимости от значения на аналоговом пине

void setup(void) {
	Serial.begin(57600);
	void * labs[] = {&&_0_255, &&_256_511, &&_512_767, &&_768_1023};
	
	goto *labs [analogRead(0) >> 8];

_0_255:
	Serial.println("PIN A0 is in the lower quarter");
	goto fin; 

_256_511:
	Serial.println("PIN A0 is in the lower-middle quarter");
	goto fin; 

_512_767:
	Serial.println("PIN A0 is in the upper-middle quarter");
	goto fin; 

_768_1023:
	Serial.println("PIN A0 is in the upper quarter");

fin:;
}

void loop(void) {}

А вот здесь как раз использование goto для выхода из цикла (как доктор прописал :-)

void setup(void) {
	Serial.begin(57600);
	void * lab[] = {&&kaka, &&mumu, &&kuku, &&fin}; // это массив меток
	const int totalLabels = sizeof(lab)/sizeof(lab[0]);
	int i = 0;
beg:
//
// Ходим по всем меткам в цикле
//
	while (i < totalLabels) goto *lab[i++];
	
kaka:
	Serial.println("Kaka Label Area");
	goto beg; 

mumu:
	Serial.println("Mumu Label Area");
	goto beg; 

kuku:
	Serial.println("Kuku Label Area");
	goto beg; 

fin:
	Serial.println("fin Label Area");
}

void loop(void) {}

Ну, вот, как-то так :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

DIYMan пишет:

За >20 лет программирования на С++ - ни разу не сталкивался с необходимостью применения goto, в том числе - при вложенных циклах. Путает goto прочтение логики - очень путает.

Не могу похвастаца тем же. :) 

void internalRead(void) override {
		
         uint8_t data[DEV_MEMORY_SIZE];
	 int		error = 0;

		if (!WakeUpDevice(FDevAddress)) {
			error = err_i2c_DeviceNotFound;
			goto err_exit;
		}

		delay(5);

		Wire.beginTransmission(FDevAddress);
		Wire.write(CMD_READ);
		Wire.write(0x00);
		Wire.write(0x04);
		if (Wire.endTransmission() > 0) {
			error = err_i2c_ReadError;
			goto err_exit;
		}

		delay(2);


		Wire.requestFrom(FDevAddress, DEV_MEMORY_SIZE);
		if (Wire.readBytes(data, DEV_MEMORY_SIZE) != DEV_MEMORY_SIZE) {
			error = err_i2c_ReadError;
			goto err_exit;
		}

		
		if (!CheckCRC(data,DEV_MEMORY_SIZE-2)) {
			error = err_i2c_CRCError;
			goto err_exit;
		}

		Check(data);

		return;

	err_exit:
		if (error == err_i2c_CRCError) {
			PostMessage(msg_Error, error);
		}
		else {
			Error(error);
		}
	}

иногда, без goto код получаеца более на.уеверченным, особенно, када исключений нет. :) 

Можете кидать в меня Дейкстрой. 

а ведь похвастался!!! удачно применив в удачном месте )))
PS а ведь надысь в ролике посмотрел, почину в C goto - какашка

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот из-за таких примеров, как у ЕвгенияП простому люду запрещают из цикла по goto выпрыгивать :(

А вообще, конечно, настолько это бессмысленно холиварная тема - if, goto и пр. Всё равно их компилятор в одну и ту же массу jmp превратит.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

Первый пример - примерно то, что нужно ТС - делаем что-то в зависимости от значения на аналоговом пине

А вот здесь как раз использование goto для выхода из цикла (как доктор прописал :-)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

PS а ведь надысь в ролике посмотрел, почину в C goto - какашка

Ох, не те Вы источники для образования выбираете. Про goto лучше Кнута читать (Кнут в программировании это как Хилл с Хоровицем).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen, тебе - безусловно можно.

А вот ТС ... не знаю ... в общем должен предупредить: "Все трюки выполнены профессионалами, не пытайтесь повторить их дома" :-)))

sadman41
Offline
Зарегистрирован: 19.10.2016

Ты ещё интерактивных батников в MS-DOS-е не видел, поди ))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

PS а ведь надысь в ролике посмотрел, почину в C goto - какашка

Ох, не те Вы источники для образования выбираете. Про goto лучше Кнута читать (Кнут в программировании это как Хилл с Хоровицем).

МИФИ однако )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Ты ещё интерактивных батников в MS-DOS-е не видел, поди ))

как не видел, это задание было моим ученикам,  на ночь )))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

Все трюки выполнены профессионалами

Тоже мне, бином Ньютона!

Привёл бы лучше пример, который ты китайцам приводил. Вот там и впрямь "выполнено профессионалами".  Приведи? Если в лом писать, я могу написать и выложить, не против?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

МИФИ однако )))

Я не про МИФИ, а про

ua6em пишет:

надысь в ролике посмотрел

Или теперь, когда в МИФИ появилась кафедра теологии, там техническим вещам по ютубу учить стали?

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ворота, я сейчас должен убегать, если хочешь сам пример про функции напиши (с ардуиновским контекстом, конечно).

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Вы, правда думаете, что умеете использовать goto? Ну, знаете, молодой матрос - салажонок думает, что он умеет материться, пока не встретит матёрого, боцмана :-) в общем, запускайте и разбирайте примеры, "жратва акулья" :---)))

Евгений, какое ж это goto ? - чистый switch case

Что касается меня... я старый структураст :) за все годы программирования goto не использовал ни разу. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

b707 пишет:
я старый структураст :)
Ща, подготовлю пример на использование приёма. которым Петрович китайских стуктурастов троллил - там песня! Это потребует какого-то времени, но оно стоит того, поверь!

P.S.
Блин, чёта не выходит, наверное, я какую-то тонкость забыл. Простите, мужики, что наобещал. Петрович, может сам когда-нибудь выложит.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

МИФИ однако )))

Я не про МИФИ, а про

ua6em пишет:

надысь в ролике посмотрел

Или теперь, когда в МИФИ появилась кафедра теологии, там техническим вещам по ютубу учить стали?

Тимофей Хирьянов выкладывает, уточняю, Московский Физико-Технический Институт ...запутался я в этих Ваших институтах )))

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

я хоть и не совсем начинающий но код в #23 начал взламывать мне мозг

когда я учился никакой магии с && не было (это ведь из нового стандарта C++?)

а адреса меток goto я мог взять только в ассемблерной вставке(мы так дельту оффсет вычисляли в базонезависимом коде)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я, оказывается, забыл расшарить файл со стилем НАСА, пришёл запрос от кого-то из вас. Я расшарил для всех, попробуйте сейчас.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А у нас в ассемблере без goto совсем никак... Вовсе не структурированный язык, сцуко.

Green
Offline
Зарегистрирован: 01.10.2015

Так и на ассемблере всё можно оформить так что ассемблер и не узнаешь.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mykaida пишет:

А у нас в ассемблере без goto совсем никак... Вовсе не структурированный язык, сцуко.

Видел реализацию набора макросов для ассемблера - while, if и вся байда - а потом на этих макросах народ как на паскале писал. Я тогда так и не понял (и до сих пор не понимаю), чем заводить такие макросы, чего сразу на паскале-то не писать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:

когда я учился никакой магии с && не было 

О какой магии речь? Указателей что ли не было? И адреса брать нельзя было?

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

ЕвгенийП пишет:

О какой магии речь? Указателей что ли не было? И адреса брать нельзя было?

нельзя было взять адрес два раза && (или что эта конструкция сейчас означает)))

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

baby_in_Arduino пишет:

ЕвгенийП пишет:

О какой магии речь? Указателей что ли не было? И адреса брать нельзя было?

нельзя было взять адрес два раза && (или что эта конструкция сейчас означает)))

Читайте, сударь, читайте - полезное это дело

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ЕвгенийП пишет:

Видел реализацию набора макросов для ассемблера - while, if и вся байда - а потом на этих макросах народ как на паскале писал. Я тогда так и не понял (и до сих пор не понимаю), чем заводить такие макросы, чего сразу на паскале-то не писать?

Не встречал. А на ассемблере писал от безысходности - не нашел си. Тем более паскаля.

Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

Видел реализацию набора макросов для ассемблера - while, if и вся байда - а потом на этих макросах народ как на паскале писал. Я тогда так и не понял (и до сих пор не понимаю), чем заводить такие макросы, чего сразу на паскале-то не писать?


Ну как зачем! Затем что вы получаете язык более высокого уровня не требующем компилятора! При этом сохраняя все преимущества ассемблера.

Green
Offline
Зарегистрирован: 01.10.2015

mykaida пишет:

А на ассемблере писал от безысходности - не нашел си. Тем более паскаля.


Да на ассемблере тоже можно очень красиво писать используя макросредства. Ничем не хуже чем на Си. Другое дело, что с переносимостью проблема и стандартных библиотек нет.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так дед вон прямо в ардуино IDE ассемблерные файлы добавляет. Я тоже как-то пробовал. Нормально, прямо из файлв .ide вызываешь функции написанные на ассемблере. Проблемы-то никакой - писать на всём можно.

Green
Offline
Зарегистрирован: 01.10.2015

Так это не то. А вот что бы в ассемблере писать на си-подобном... http://caxapa.ru/lib/CwithoutC.html