Comparison between pointer and integer как исправить

#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]

Nicolas Chabanovsky's user avatar

задан 19 сен 2016 в 14:55

Михаил's user avatar

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:

Судя по коду нужно найти количество совпадений подстроки в строке – если Вы хотели решить именно эту проблему, то готовое решение в соседней теме.

Дух сообщества's user avatar

ответ дан 19 сен 2016 в 15:03

Duracell's user avatar

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

  1. Understanding the Warning
  2. Common Scenarios and Solutions
  3. 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 строках. Помогите разобраться. Заранее спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <iostream.h>
#include <string.h>
#include <iomanip.h>
#include <math.h>
#define size 512
struct Data{unsigned d,m,y;};
struct Human
{
    Data birth;
    char name[20],surname [20];
    char sex[0];
    unsigned hight;
} 
human;
int main()
{
    const int Color = system( "color F0" );
    setlocale (LC_ALL,"Russian");
    Human* list;
    list= new Human[512];
    using namespace std;
    int n=1, i, z, choose, p, min=999, m=0, poct=0;
    float sredpoct;
    cout<<"Список людей и их данные"<<endl<<endl<<endl;
    for(z=0;z<999999;z++)
        {
            cout<<"1.Ввод данных (обязательно)"<<endl<<"2.Вывод всех данных в алфавитном порядке"<<endl<<"3.Средний рост мужчин"<<endl<<"4.Имя самой молодой девушки, чей рост превосходит средний рост мужчин"<<endl<<"5.Завершить программу"<<endl;
            cout<<"Цифра: ";
            cin>>choose;
            choose=choose++;
            cout<<endl;
            switch(choose)
                {
                    case 5: return 0;
                    case 1: for(i=0;i<n;i++)
                        {
                            cout<<"Введите фамилию: ";
                            cin>>list[i].surname;
 
                            cout<<"Введите имя: ";
                            cin>>list[i].name;
 
                            for(int u=0;u<p;u++)
                                {
                                    cout<<"Введите месяц рождения: ";
                                    cin>>list[i].birth.m;
                                    if((list[i].birth.m>0) && (list[i].birth.m<13))break;
                                    else p++;
                                }
 
                            for(int u=0;u<p;u++)
                                {
                                    cout<<"Введите день рождения: ";
                                    cin>>list[i].birth.d;
                                    if(list[i].birth.m==2)
                                        {
                                            if((list[i].birth.d>0) && (list[i].birth.d<29))break;
                                            else p++;
                                        }
 
                                    else if((list[i].birth.m==1) || (list[i].birth.m==3) || (list[i].birth.m==5) || (list[i].birth.m==7) || (list[i].birth.m==8) || (list[i].birth.m==10) || (list[i].birth.m==12))
                                        {
                                            if((list[i].birth.d>0) && (list[i].birth.d<32))break;
                                            else p++;
                                        }
 
                                    else if((list[i].birth.m==4) || (list[i].birth.m==6) || (list[i].birth.m==8) || (list[i].birth.m==11))
                                        {
                                            if((list[i].birth.d>0) && (list[i].birth.d<31))break;
                                            else p++;
                                        }
                                }
                            for(int u=0;u<p;u++)
                                {
                                    cout<<"Введите год рождения: ";
                                    cin>>list[i].birth.y;
                                    if ((list[i].birth.y>1930) && (list[i].birth.y<2001)) break;
                                    else p++;
                                }
 
                            for(int u=0;u<p;u++)
                                {
                                    cout<<"Введите пол(м/ж): ";
                                    cin>>list[i].sex;
                                    if((list[i].sex=='m') || (list[i].sex=='f'))break;
                                    else p++;
                                }
 
                            for(int u=0;u<p;u++)
                                {
                                    cout<<"Введите рост (в сантиметрах): ";
                                    cin>>list[i].hight;
                                    if((list[i].hight>0) && (list[i].hight<220))break;
                                    else p++;
                                }
                            cout<<"Хотите продолжить? (0-Нет, 1-Да): ";
                            cin>>choose;
                            if(!choose)break;
                            else n++;
                        }   break;
                            // Кусок первый
                    Human Z;
                    case 2: cout<<endl<<"Данные а алфавитном порядке:";
                            for(int q=0;q<n-1;q++)
                                {  
                                    for(int w=q+1;w<n;w++)
                                       {
                                            if (strcmp(list[q].surname,list[w].surname)>0)
                                                {
                                                    Z=list[q];
                                                    list[q]=list[w];
                                                    list[w]=Z;
                                                }
                                        }
                                }
                            for(int i=0;i<n;i++)
                                {
                                    cout<<endl<<list[i].surname<<" "<<list[i].name<<" (Дата рождения: "<<list[i].birth.d<<"."<<list[i].birth.m<<"."<<list[i].birth.y<<")"<<endl;
                                    cout<<"Пол: "<<list[i].sex<<endl;
                                    cout<<"Рост: "<<list[i].hight<<endl;
                                }break; 
                            //Кусок второй
                
                    case 3: for(int i=0;i<n;i++)
                                        if(list[i].sex=='m')
                                            {
                                                m++;
                                                poct=list[i].hight+poct;break;
                                            }
                            sredpoct=(poct)/(m);
                            cout<<"Средний рост мужчин "<<sredpoct<<"см";break;
                            //Кусок третий
            
                    case 4: for(int i=0;i<n;i++)
                                if(list[i].sex=='f')
                                    if((list[i].hight<min) && (list[i].hight>poct)) min=list[i].hight;
                            for(int i=0;i<n;i++)
                                {
                                    if((list[i].hight=min) && (list[i].hight>poct)) cout<<list[i].surname<<" "<<list[i].name<<endl;
                                    else cout<<"Таких нет"<<endl;
                                }
                            break;
                }
        }
    delete list;
    system("pause");
}



0



newbie666

Заблокирован

20.05.2014, 21:14

2

C++
1
2
3
4
5
6
7
struct Human
{
    Data birth;
    char name[20],surname [20];
    char sex[0];
    unsigned hight;
}

char sex[0]; – ты пытаешься создать массив нулевой длинны… Если sex у тебя предполагает один символ, уберай вообще скобки с нулём – char sex;

C++
1
int n=1, i, z, choose, p, min=999, m=0, poct=0;

тут ты объявляешь переменную 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);
   }
}

Что я делаю не так?

Добавить комментарий