#include <iostream>
#include <cstring>
using namespace std;
void searchCenzur()
{
char str[80] = "lsasacsalolcassalolasclolcascaslol";
int j = 0;
for(int i = 0; i < 80; i++)
{
if(str[i] == "l")
{
if(str[i+1] == "o")
{
if(str[i+2] == "l")
{
j++;
}
}
}
}
cout << "количество совпадений: " << j << endl;
}
int main()
{
searchCenzur();
return 0;
}
ошибка main.cpp:14:27: error: ISO C++ forbids comparison between
pointer and integer [-fpermissive]
задан 19 сен 2016 в 14:55
2
Вот так будет правильно:
#include <iostream>
#include <cstring>
using namespace std;
void searchCenzur()
{
char str[80] = "lsasacsalolcassalolasclolcascaslol";
int j = 0;
for (int i = 0; i < 80; i++)
{
if (str[i] == 'l')
{
if (str[i + 1] == 'o')
{
if (str[i + 2] == 'l')
{
j++;
}
}
}
}
cout << "количество совпадений: " << j << endl;
}
int main()
{
searchCenzur();
return 0;
}
if (str[i] == "l")
Вы сравниваете один символ со строкой(набором символов), в с++ так нельзя, только символ с символом и в одной кодировке.
UPD:
Судя по коду нужно найти количество совпадений подстроки в строке – если Вы хотели решить именно эту проблему, то готовое решение в соседней теме.
ответ дан 19 сен 2016 в 15:03
DuracellDuracell
1,9913 золотых знака16 серебряных знаков33 бронзовых знака
2
When working with pointers and integers in C or C++, you might encounter a warning message like the following:
warning: comparison between pointer and integer
This guide will help you understand the cause of this warning, and provide step-by-step solutions to resolve it.
Table of Contents
- Understanding the Warning
- Common Scenarios and Solutions
- FAQs
Understanding the Warning
This warning occurs when you try to compare a pointer with an integer, which is not a valid operation in C or C++. Pointers store memory addresses, while integers store numeric values. Comparing them directly can lead to unexpected behavior and potential bugs in your program.
The compiler throws this warning to alert you that you might be unintentionally comparing different data types, and you should revise your code accordingly.
Common Scenarios and Solutions
Here are some common scenarios where you might encounter the “comparison between pointer and integer” warning and their solutions.
Scenario 1: Comparing a Pointer with a Constant Integer
You might encounter this warning when you accidentally compare a pointer with a constant integer.
Example:
#include<stdio.h>
int main() {
int *p = NULL;
if (p == 0) {
printf("The pointer is NULL.n");
}
return 0;
}
Solution:
To fix this issue, compare the pointer with NULL
instead of the constant integer 0
.
#include<stdio.h>
int main() {
int *p = NULL;
if (p == NULL) {
printf("The pointer is NULL.n");
}
return 0;
}
Scenario 2: Comparing an Integer Pointer with a Character
You might encounter this warning when you accidentally compare an integer pointer with a character.
Example:
#include<stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;
if (p == 'a') {
printf("The pointer points to the character 'a'.n");
}
return 0;
}
Solution:
To fix this issue, compare the integer value pointed by the pointer with the character’s ASCII value.
#include<stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;
if (*p == 'a') {
printf("The pointer points to the character 'a'.n");
}
return 0;
}
FAQs
1. What is a pointer in C and C++?
A pointer is a variable that stores the memory address of another variable. Pointers allow you to directly access and manipulate memory locations, which can improve the efficiency of your code.
2. What is the difference between a pointer and an integer?
A pointer is a variable that stores a memory address, while an integer is a variable that stores a numeric value. They are different data types and should not be directly compared in C or C++.
3. How do I compare a pointer with a constant integer?
To compare a pointer with a constant integer, you should first dereference the pointer to get the integer value it points to, and then compare the dereferenced value with the constant integer.
4. Can I convert an integer to a pointer?
Yes, you can convert an integer to a pointer using a type cast. However, this is generally not recommended, as it can lead to undefined behavior if the integer value does not represent a valid memory address.
5. Can I compare pointers of different types?
In C, you can compare pointers of different types using a type cast, as long as the pointers have the same underlying type. In C++, comparing pointers of different types is not allowed and will result in a compilation error.
- Pointers in C and C++
- Understanding Pointers and Memory Addresses
- C Type Casting
- C++ Type Casting
Many time during running c++ program you get comparison errors. Sometimes it will be iso c++ forbids comparison between pointer and integer or sometimes you will get iso c++ forbids comparison between pointer and integer [-fpermissive]. Here we will see when these type of c++ compiler error occurs and how to resolve these iso c++ forbids comparison between pointer and integer errors from c++ program.
#include <iostream> using namespace std; int main() { char str[2]; cout << "Enter ab string"; cin >> str; if (str == 'ab') { cout << "correct"; } else { cout << "In correct"; } return 0; }
Output:
Here during string comparison you are getting compilation errors. “error: ISO C++ forbids comparison between pointer and integer [-fpermissive]”
SOLUTION FOR ERROR:
if(str==’ab’), here str is const char* type. Which is array of character.
Here ‘ab’ is consider as integer value. ideally it should be as constant string value.
Because of single quote it is considered as integer value.
So for comparison you need to use double quote “ab”. And declare it as string variable.
Now you can compare using strcmp(str, “ab”) or using str == “ab”.
#include <iostream> using namespace std; int main() { string str; cout << "Enter ab string: "; cin >> str; if (str == "ab") { cout << "correct"; } else { cout << "In correct"; } return 0; }
Output:
2. error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
#include <iostream> using namespace std; int func(int i, int j) { int val = 1; if (val > func) { return (val+1); } return val; } int main() { int val = func(3,6); return 0; }
Output:
SOLUTION FOR ERROR:
If you see if condition if(val > func), then here we have by mistake given function name which has different datatype then integer value.
So our comparison is wrong. Whenever any comparison is wrong you will get this error. Ideally here we need to compare with some integer value.
int val = 1; int IntValue = 0; if (val > IntValue) { return (val+1); } return val;
Here we have removed function name and comparing it with Integer value. Now that error will be resolved.
CONCLUSION:
Whenever you are getting any error similar to ISO C++ forbids comparison between pointer and integer [-fpermissive], Then check that comparison condition. You will get to know that comparison condition is mismatch with two different data type of variables. For resolving c++ forbids comparison error you just need to compare similar kind of variables in conditions. I hope given two examples will be helpful for your to find out your code issue. If you like this article then please check other c++ related information in given website. Happy Coding !! 🙂
Reader Interactions
Mario*xD 1 / 1 / 0 Регистрация: 20.09.2011 Сообщений: 37 |
||||
1 |
||||
20.05.2014, 20:38. Показов 10170. Ответов 1 Метки нет (Все метки)
Привет, ребят. Выскакивает ошибка ISO C++ forbids comparison between pointer and integer при компиляции на 85, 125, 135 строках. Помогите разобраться. Заранее спасибо.
0 |
Заблокирован |
||||||||
20.05.2014, 21:14 |
2 |
|||||||
char sex[0]; – ты пытаешься создать массив нулевой длинны… Если sex у тебя предполагает один символ, уберай вообще скобки с нулём – char sex;
тут ты объявляешь переменную p и не задав её никакого значения используешь её в качестве ограничительного условия в циклах.
0 |
Offline
Зарегистрирован: 21.10.2019
Выдает ошибку:
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); } }
Что я делаю не так?