Ошибка: ISO C++ forbids comparison between pointer and integer [-fpermissive]
- Войдите на сайт для отправки комментариев
Вс, 01/12/2019 - 19:56
Выдает ошибку:
\dany.ino: In function 'void loop()':
\dany.ino:63:14: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
Вот сам код:
#include "DHT.h" // подключаем библиотеку DHT.h #define DHTPIN 6 // тот самый номер пина, о котором упоминалось выше #define DHTTYPE DHT11 // определяем тип датчика DHT dht(DHTPIN, DHTTYPE); // инициация датчика #include <Servo.h> // подключаем библиотеку Servo.h Servo servoPrivod; // "называем" сервопривод #define servo 7 // определям пин, к которому подключен сервопривод #define MODULE_P 8 // Определяем пин нагревательного элемента #define PUMP_AMOUNT 4 // Определяем количесво помп #define START_PIN 2 // Определяем старотовый пин byte pump_pins[PUMP_AMOUNT]; // Массив для пинов помп int val[PUMP_AMOUNT]; // Массив для влажности #define led 11 // пин светодиода #include <OneWire.h> // подключаем библиотеку OneWire ds(10); // пин датчика темпеатуры #define nas 9 // пин насоса void setup() { Serial.begin(9600); // Включаем предачу по последовательному порту pinMode(DHTPIN, OUTPUT); // Включаем DHT модуль dht.begin(); servoPrivod.attach(servo); // определяем пин сервопривода сервопривод (13 пин) pinMode(MODULE_P, OUTPUT); // включаем пин нагревательного модуля digitalWrite(MODULE_P, HIGH); // выключаем модуль pinMode(led, OUTPUT); // подключение лампочки pinMode(nas, OUTPUT); // подключение насоса for (byte i = 0; i < PUMP_AMOUNT; i++) // настройка помп и не только { pump_pins[i] = START_PIN + i; // пробегаем по всем помпам pinMode(START_PIN + i, OUTPUT); // настраиваем пины, к которым подключены помпы digitalWrite(START_PIN + i, HIGH); // выключаем от греха val[i] = 0; // присваиваем каждой переменной владности 0 } } void loop() { for(byte i = 0; i < PUMP_AMOUNT; i++) // цикл для управления помпами { val[i] = analogRead(i); // считываем показания с i-го датчика val[i] = map(val[i], 327, 1023,100, 0); // обработка сигнала Serial.println(val[i]); // передаем показания на последовательный порт } int vl1 = (val[1] + val[2] + val[3])/3; // считаем среднюю влажность почвы for(byte i = 0; i < PUMP_AMOUNT; i++) // цикл для управления помпами { if(val < 40) // условие включения помпы { digitalWrite(pump_pins[i], LOW); delay(5000); digitalWrite(pump_pins[i], HIGH); } else { digitalWrite(pump_pins[i], HIGH); } } delay(500); int hv = dht.readHumidity(); // считываем показания влажности с датчика DHT int tv = dht.readTemperature(); // считываем показания температуры с датчика DHT if (isnan(hv) || isnan(tv)) // проверка исправности датчика DHT return; Serial.println(hv); // передаем показания на последовательный порт Serial.println(tv); // передаем показания на последовательный порт if (tv > 20 || tv > 20) // условия включения сервопривода { servoPrivod.write(180); delay(1000); } servoPrivod.write(0); if(val[0] < 20) // условия срабатываения сигнализатора { digitalWrite(led, HIGH); delay(1000); } else { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } //считываем показания сдатчика температуры byte i; byte data[12]; byte addr[8]; float celsius; // поиск датчика if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // измерение температуры delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // начало чтения измеренной температуры //показания температуры из внутренней памяти датчика for ( i = 0; i < 9; i++) { data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; // датчик может быть настроен на разную точность, выясняем её byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс // преобразование показаний в градусы Цельсия celsius = (float)raw / 16.0; Serial.print("t="); Serial.println(celsius); //управляем нагревательным элеметом if (celsius < 50) { digitalWrite(MODULE_P, LOW); digitalWrite(nas, HIGH); } else { digitalWrite(MODULE_P, HIGH); digitalWrite(nas, LOW); } }
Что я делаю не так?
Не читаете текст ошибки, не смотрите в строку 63 и не думаете за переменную val.
Да, большое спасибо, невнимательно код редактировал
Просьба подсказать по C
есть код, все хорошо работает, но есть предупреждения, Arduino IDE 1.8.9
-
я сравниваю элемент массива char с байтом, направьте плиз на путь истинный, что написать чтоб этот warning не вылазил?
Просьба подсказать по C
есть код, все хорошо работает, но есть предупреждения, Arduino IDE 1.8.9
-
я сравниваю элемент массива char с байтом, направьте плиз на путь истинный, что написать чтоб этот warning не вылазил?
подозреваю что opCode это трехмерный массив (двухмерный массив указателей) а opPrioritet двумерный массив
м.б. так : (opPrioritet[opStart][j] == *opCode[i][j]) ?
щас обновлю Arduino ide попробую, спасибо
подозреваю что opCode это трехмерный массив (двухмерный массив указателей) а opPrioritet двумерный массив
м.б. так : (opPrioritet[opStart][j] == *opCode[i][j]) ?
помогло, спасибо, ругаться перестал.
завтра проверю на реальном железе
Update: нет, с такими исправлениями код на реальном железе перестал работать.
я сравниваю элемент массива char с байтом
Нет, ты сравниваешь char с указателем на char. Что имеет весьма мало смысла. Могу предположить, что ты пытался реализовать strcmp, но запутался в размерностях массивов.
Не, с размерность у меня все ок, в обоих массива по 5 байт + ноль. По факту да, изобретаю велосипед strcmp.
Попробую поработать с типами данных и указателями, спасибо.
Самое любопытное, на другом компе с такой же IDE warning не появляется, где то отключены, поищу доку.
Не следует путать размер и размерность массива.
Настройки->сообщения компилятора
Кстати, тогда не понял чем strcmp или memcmp не подходит.
Вообще с типами данных работать не нужно :) ИМХО, нужно стараться так писать, что бы не использовать приведений типа. А то можно такого нахреновертить,
Я попозже до компа доберусь, опишу более подробно вопрос с примерами. Strcmp для сравнения 5 байт думаю как пушкой по воробьям.
Если кратко, в функцию приходит входящий из модема байт (и тип byte), он заносится в двумерный массив, который описан как char *
Т е я понимаю возмущение компилятора когда я байт заношу в массив char через указатель :)
Но логически и по факту же работает, как мне сказать ему что у меня все правильно?
Причём входящий тип байта исправить не могу, слишком много на него завязано.
Кастануть byte переменную к (char)
Нет.
У тебя неправильно. Ты сравниваешь указатель с char. Тот факт, что код работает, говорит о том, что где-то еще есть ошибка, которая совпадает с этой.
Я не понимаю, откуда такое мнение. Все встроенные функции , лично я считаю, самыми быстрыми и уже оптимизированными. Правда я бы все же рекомендовал memcmp, поскольку известна длинна строки. Считается что memcmp более надежная, поскольку выход за пределы массива от нее не грозит. Не даром мелкомягкие рекомендуют использовать strncmp.
И еще раз повторю, сказать компилятору, что вы уверены в своих действиях можно явным приведением типа. И компилятору станет наплевать на этот факт. Как это сделать я уже выше показал, да и вам это не я один советовал.
- вся простыня, работает ОК
- отдельная строчка с ошибкой
- как привести типы чтоб компилятор не ругался?
т е я понимаю что компилятор прав, но как исправить че то никак не додумаюсь
я бы все же рекомендовал memcmp, поскольку известна длинна строки.
обязательно попробую и буду использовать как до стенда доберусь, не знал о функции
Если вы объявляли массив char, то должно было быть
А так вы объявили массив указателей на байт :)
И strcmp или memcmp вызывали бы логическую ошибку. Потому что char - это один байт, а char* в вашем случае это два байта.
да, warning исчез, завтра на железке попробую, спасибо
У вас там и opCode так же не правильно объявлен.
У вас там и opCode так же не правильно объявлен.
Да, конечно, я все просмотрю, все warning попытаюсь исправить, спасибо.