Ошибка: 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
#define max_count_list_operators (byte)6 #define max_size_op_code (byte)7 #define max_size_op_short (byte)10 char* opCode[max_count_list_operators][max_size_op_code]; char* opShort[max_count_list_operators][max_size_op_short]; char opMain[max_size_op_short]; char* opPrioritet[] = {(char*)"25001", (char*)"25099", (char*)"25002", (char*)"25020"}; byte opStart = 0; // MTS char opReal[max_size_op_short + max_size_op_code]; byte opCSQ; char opTxtCSQ[4]; byte opStepMain, opCount, opNumStep; void getPrefOp() { memset(opMain, '\0', max_size_op_short); for (byte i = 0; i < opCount; ++i) { byte j = 0; while ((opPrioritet[opStart][j] != 0) && (opPrioritet[opStart][j] == opCode[i][j])) ++j; if (j == 5) { byte k = 0; while (opShort[i][k] != 0) { opMain[k] = opShort[i][k]; ++k; } opMain[k] = 0; break; } } //Serial.print("Main operator = "); Serial.println(opMain); // ---------------------DEBUG str------------------- } sketch\initmod.h: In function 'void getPrefOp()': sketch\initmod.h:28:85: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive] while ((opPrioritet[opStart][j] != 0) && (opPrioritet[opStart][j] == opCode[i][j])) ++j;-
я сравниваю элемент массива char с байтом, направьте плиз на путь истинный, что написать чтоб этот warning не вылазил?
Просьба подсказать по C
есть код, все хорошо работает, но есть предупреждения, Arduino IDE 1.8.9
#define max_count_list_operators (byte)6 #define max_size_op_code (byte)7 #define max_size_op_short (byte)10 char* opCode[max_count_list_operators][max_size_op_code]; char* opShort[max_count_list_operators][max_size_op_short]; char opMain[max_size_op_short]; char* opPrioritet[] = {(char*)"25001", (char*)"25099", (char*)"25002", (char*)"25020"}; byte opStart = 0; // MTS char opReal[max_size_op_short + max_size_op_code]; byte opCSQ; char opTxtCSQ[4]; byte opStepMain, opCount, opNumStep; void getPrefOp() { memset(opMain, '\0', max_size_op_short); for (byte i = 0; i < opCount; ++i) { byte j = 0; while ((opPrioritet[opStart][j] != 0) && (opPrioritet[opStart][j] == opCode[i][j])) ++j; if (j == 5) { byte k = 0; while (opShort[i][k] != 0) { opMain[k] = opShort[i][k]; ++k; } opMain[k] = 0; break; } } //Serial.print("Main operator = "); Serial.println(opMain); // ---------------------DEBUG str------------------- } sketch\initmod.h: In function 'void getPrefOp()': sketch\initmod.h:28:85: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive] while ((opPrioritet[opStart][j] != 0) && (opPrioritet[opStart][j] == opCode[i][j])) ++j;-
я сравниваю элемент массива 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.
И еще раз повторю, сказать компилятору, что вы уверены в своих действиях можно явным приведением типа. И компилятору станет наплевать на этот факт. Как это сделать я уже выше показал, да и вам это не я один советовал.
- вся простыня, работает ОК
//---initmod.h--- extern void sendIdxATcommand(byte idxCmd, bool clrBuf); extern void sendATcommand(char * inStr, bool clrBuf); extern void sendByteToModem(byte inBt); extern void resetModem(); extern bool findRespFromBuf(char * inStr, byte inByte); extern void clearRespBuf(); #define max_count_list_operators (byte)6 #define max_size_op_code (byte)6 #define max_size_op_short (byte)10 char* opCode[max_count_list_operators][max_size_op_code]; char* opShort[max_count_list_operators][max_size_op_short]; char opMain[max_size_op_short]; char* opPrioritet[] = {"25001", "25099", "25002", "25020"}; byte opStart = 0; // 0=MTS Work 2=Megafon Debug char opReal[max_size_op_short * 2]; byte opCSQ; char opTxtCSQ[4]; byte opStepMain, opCount, opNumStep; void getPrefOp() { for (byte i = 0; i < opCount; ++i) { byte j = 0; while ((opPrioritet[opStart][j] != 0) && (opPrioritet[opStart][j] == opCode[i][j])) ++j; if (j == 5) { byte k = 0; while (opShort[i][k] != 0) { opMain[k] = opShort[i][k]; ++k; } opMain[k] = 0; break; } } //Serial.print("Main operator = "); Serial.println(opMain); // ---------------------DEBUG str------------------- } void processingOperatorsNames(byte stByte) { if (!stByte) return; switch (opStepMain) { case 0: { // begin if ((stByte == '(') && (opCount < max_count_list_operators)) { ++opStepMain; // go to find id operator memset(opShort[opCount], '\0', max_size_op_short); } break; } case 1: { // find id operator if (isdigit(stByte)) ++opStepMain; /* go to find ,*/ else opStepMain = 0; break; } case 2: { // find , if (stByte == ',') ++opStepMain;/* skip long operator name go to find ,*/ else opStepMain = 0; break; } case 3: { // find , if (stByte == ',') ++opStepMain;/* go to find "*/ break; } case 4: { // find " if (stByte == '\"') { ++opStepMain;/* go to get short name "*/ opNumStep = 0; memset(opShort[opCount], '\0', max_size_op_short); } else { opStepMain = 0; } break; } case 5: { // short name if ((opNumStep >= (max_size_op_short - 1)) || (stByte == '\"')) { // end of short name - go to find , or " ++opStepMain; // go to find , } else { opShort[opCount][opNumStep] = stByte; ++opNumStep; } break; } case 6: { // find , if (stByte == ',') ++opStepMain;/* go to find "*/ break; } case 7: { // find " if (stByte == '\"') { ++opStepMain;/* go to get code "*/ opNumStep = 0; memset(opCode[opCount], '\0', max_size_op_code); } else { opStepMain = 0; } break; } case 8: { // code if ((opNumStep >= (max_size_op_code - 1)) || (stByte == '\"')) { // end of code - go to find " ++opStepMain; // go to find " } else { opCode[opCount][opNumStep] = stByte; ++opNumStep; } break; } case 9: { // find " if (((stByte == '\"') || (stByte == ')')) && (opCount < (max_count_list_operators - 1))) ++opCount; // end processing operator opStepMain = 0; break; } default: {} } } void processingRealOperator(byte stByte) { switch (opStepMain) { case 0: { // find " if (stByte == '\"') { memset(opReal, '\0', (max_size_op_short * 2)); opNumStep = 0; ++opStepMain; } break; } case 1: { // get op name if ((stByte == '\"') || (opNumStep >= ((max_size_op_short * 2) - 1))) { ++opStepMain; } else { opReal[opNumStep] = stByte; ++opNumStep; } break; } default: {} } } void processingCSQ(byte stByte) { if (stByte == ',') { // end str if ((opNumStep > 0) && (opNumStep < 3)) { opCSQ = atoi(opTxtCSQ); opNumStep = 6; } } else if (isdigit(stByte)) { if (opNumStep < 2) { opTxtCSQ[opNumStep] = stByte; ++opNumStep; } } } void initModem(byte inByte, bool inExist) { if (!waitRespModem) { if ((current_millis - timerWaitCmdModem) >= delayInitModem) { sendIdxATcommand(0, true); } } else { if ((current_millis - timerWaitCmdModem) >= delayWaitCmdModem) { resetModem(); return; } if (inByte) { switch (stepCmdModem) { case 0: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(1, true); ++stepCmdModem; } break; } case 1: { if (findRespFromBuf((char *) "SHUT OK\r\n", inByte)) { sendIdxATcommand(2, true); ++stepCmdModem; } break; } case 2: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(3, true); ++stepCmdModem; } break; } case 3: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(4, true); ++stepCmdModem; } break; } case 4: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(5, true); ++stepCmdModem; } break; } case 5: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(6, true); ++stepCmdModem; } break; } case 6: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(7, true); ++stepCmdModem; } break; } case 7: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { opCount = 0; opStepMain = 0; sendIdxATcommand(26, true); ++stepCmdModem; } break; } case 8: { // processing - save operators to massiv if (inExist) processingOperatorsNames(inByte); if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(8, true); ++stepCmdModem; } break; } case 9: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { // // ---------------------DEBUG UNIT------------------- /*Serial.print("List operators "); Serial.print(opCount); Serial.println(" :"); for (byte i = 0; i < opCount; ++i) { Serial.print("Operator name = "); byte j = 0; while ((opShort[i][j]) > 0) { Serial.write((byte)(opShort[i][j])); ++j; } Serial.print(" code = "); j = 0; while ((opCode[i][j]) > 0) { Serial.write((byte)(opCode[i][j])); ++j; } Serial.println(""); }*/ // end DEBUG UNIT sendIdxATcommand(9, true); ++stepCmdModem; } break; } case 10: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { getPrefOp(); sendATcommand("AT+COPS=4,1,\"", false); byte k = 0; while (opMain[k] != 0) { sendByteToModem(opMain[k]); ++k; } sendATcommand("\"\r", true); ++stepCmdModem; } break; } case 11: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(10, true); ++stepCmdModem; } break; } case 12: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(11, true); ++stepCmdModem; } break; } case 13: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(12, true); ++stepCmdModem; } break; } case 14: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(13, true); ++stepCmdModem; } break; } case 15: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(14, true); ++stepCmdModem; } break; } case 16: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(15, true); ++stepCmdModem; } break; } case 17: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(23, true); ++stepCmdModem; } break; } case 18: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { opStepMain = 0; memset(opReal, '\0', (max_size_op_short * 2)); sendIdxATcommand(24, true); ++stepCmdModem; } break; } case 19: { if (inExist) processingRealOperator(inByte); if (findRespFromBuf((char *) "OK\r\n", inByte)) { opCSQ = 0; memset(opTxtCSQ, '\0', 4); opTxtCSQ[0] = '0'; opNumStep = 0; sendIdxATcommand(25, true); ++stepCmdModem; } break; } case 20: { if (inExist) processingCSQ(inByte); if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(16, true); ++stepCmdModem; } break; } case 21: { if (findRespFromBuf((char *) "OK\r\n", inByte)) { sendIdxATcommand(17, true); ++stepCmdModem; } break; } case 22: { if (findRespFromBuf((char *) "IP GPRSACT\r\n", inByte)) { sendIdxATcommand(18, true); ++stepCmdModem; } break; } case 23: { if (findRespFromBuf((char *) "\r\n", inByte)) { sendIdxATcommand(19, true); ++stepCmdModem; } break; } case 24: { if (findRespFromBuf((char *) "IP STATUS\r\n", inByte)) { stepCmdModem = 0; deviceMode = modeMainWork; waitRespModem = 0; clearRespBuf(); mqttStep = mBegin; currentBroker = 0; countErrBroker = 0; timerCountErrBroker = current_millis; currentCmd = cmdNone; startReconnectBroker = 0; #ifdef SHOW_UART_LOG Serial.println(F("Ready")); #endif // строка тестирования сброса модема // после снятия комментария светодиод модема должен вести себя согласно даташита // т е примерно 7...8 секунд пока инициализируется быстрое моргание // потом 4...7 секунд несколько медленных вспышек // наблюдаем параллельно еще и за монитором порта // как только появлется надпись Power ON значит прошел сигнал // RESTET на пин - начинаем отсчет //delay(1500); resetModem(); // test reset modem // вот эту строку снять комментарий для теста // значения мограния светодиода из даташита // off - is not running // 64 ms ON / 800 ms OFF - not registered the network // 64 ms ON / 3000 ms OFF - registered to the network // 64 ms ON / 300 ms OFF - GPRS communication is established } break; } default: {} } } } }- отдельная строчка с ошибкой
sketch\initmod.h: In function 'void processingOperatorsNames(byte)': sketch\initmod.h:74:41: warning: invalid conversion from 'byte {aka unsigned char}' to 'char*' [-fpermissive] opShort[opCount][opNumStep] = stByte; ^~~~~~- как привести типы чтоб компилятор не ругался?
т е я понимаю что компилятор прав, но как исправить че то никак не додумаюсь
я бы все же рекомендовал memcmp, поскольку известна длинна строки.
обязательно попробую и буду использовать как до стенда доберусь, не знал о функции
Если вы объявляли массив char, то должно было быть
А так вы объявили массив указателей на байт :)
И strcmp или memcmp вызывали бы логическую ошибку. Потому что char - это один байт, а char* в вашем случае это два байта.
да, warning исчез, завтра на железке попробую, спасибо
У вас там и opCode так же не правильно объявлен.
У вас там и opCode так же не правильно объявлен.
Да, конечно, я все просмотрю, все warning попытаюсь исправить, спасибо.