Error iso c forbids comparison between pointer and integer fpermissive

I am trying to compile the following code on Ubuntu (64-bit), with Code::Blocks 10.05 as IDE: #include using namespace std; int main() { char a[2]; cout << "enter ab...

I am trying to compile the following code on Ubuntu (64-bit), with Code::Blocks 10.05 as IDE:

#include <iostream>
using namespace std;
int main() {
    char a[2];
    cout << "enter ab ";
    cin >> a;
    if (a == 'ab') // line 7
    {
         cout << "correct";
    }
    return 0;
}

On line 7, my compiler gives me the error «ISO C++ forbids comparison between pointer and integer [-fpermissive]».

Why doesn’t this work? I know I could use an std::string to work around the problem, but I want to understand the current problem.

Anton Golov's user avatar

Anton Golov

3,4341 gold badge21 silver badges41 bronze badges

asked Feb 14, 2012 at 16:57

Thunfische's user avatar

2

char a[2] defines an array of char‘s. a is a pointer to the memory at the beginning of the array and using == won’t actually compare the contents of a with 'ab' because they aren’t actually the same types, 'ab' is integer type. Also 'ab' should be "ab" otherwise you’ll have problems here too. To compare arrays of char you’d want to use strcmp.

Something that might be illustrative is looking at the typeid of 'ab':

#include <iostream>
#include <typeinfo>
using namespace std;
int main(){
    int some_int =5;
    std::cout << typeid('ab').name() << std::endl;
    std::cout << typeid(some_int).name() << std::endl;
    return 0;
}

on my system this returns:

i
i

showing that 'ab' is actually evaluated as an int.

If you were to do the same thing with a std::string then you would be dealing with a class and std::string has operator == overloaded and will do a comparison check when called this way.

If you wish to compare the input with the string «ab» in an idiomatic c++ way I suggest you do it like so:

#include <iostream>
#include <string>
using namespace std;
int main(){
    string a;
    cout<<"enter ab ";
    cin>>a;
    if(a=="ab"){
         cout<<"correct";
    }
    return 0;
}

answered Feb 14, 2012 at 16:59

shuttle87's user avatar

shuttle87shuttle87

15.2k10 gold badges76 silver badges106 bronze badges

4

This one is due to:

if(a=='ab') , here, a is const char* type (ie : array of char)

'ab' is a constant value,which isn’t evaluated as string (because of single quote) but will be evaluated as integer.

Since char is a primitive type inherited from C, no operator == is defined.

the good code should be:

if(strcmp(a,"ab")==0) , then you’ll compare a const char* to another const char* using strcmp.

Johannes Weiss's user avatar

answered Feb 14, 2012 at 17:00

dweeves's user avatar

dweevesdweeves

5,49521 silver badges28 bronze badges

3

In DEVC++, I faced same issue and i got solution.
I used single quote instead of double quote.

answered May 23, 2020 at 12:07

Rajpurohit Dhanpal Singh's user avatar

In your code,you wrote char a[2]; which is wrong.You shoud’ve wrote char* a[2]; Then you can get your proper output.

answered Mar 25, 2020 at 9:53

user13121373's user avatar

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

Содержание

  1. Когда 2 + 2 = «4»
  2. Ошибка компиляции
  3. Результат False
  4. Результат True
  5. ошибка: ISO C ++ запрещает сравнение между указателем и целым числом [-fpermissive]
  6. Решение
  7. Arduino.ru
  8. Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru
  9. forum.arduino.ru
  10. Ошибка: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  11. Когда 2 + 2 = «4»
  12. Ошибка компиляции
  13. Результат False
  14. Результат True

Когда 2 + 2 = «4»

Во время отдыха от отладки JavaScript, я читал статью про особенности PHP и неожиданно задумался каковы же будут результаты сравнения 2 + 2 = «4» для разных языков программирования. И вот что из этого получилось.

Итоговая таблица для тех кто не хочет много читать
Результат Ошибка компиляции False True
Языки C++
Pascal
FORTRAN-95
Java
C#
Go
Rust
Haskel
C
Lisp
Python
Lua
Ruby
JavaScript
PHP
Perl

Компилятор C выдаёт предупреждение, компилятор C++ ошибку которая превращается в предупреждение если указать флаг -fpermissive.

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

Бонусом — функции вывода на консоль для этих языков.

Ошибка компиляции

Самый простое и неинтересное поведение — это ошибка компиляции, происходит во всех строго типизированных языках.

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

Если указать флаг -fpermissive то произойдёт сравнение указателя на строку и числа 4 которое скорее всего вернёт 0.


Fatal: illegal character «‘»‘» ($22)
Сообщение об ошибке довольно непонятное

Error: Incompatible types: got «Char» expected «Int64»
Сообщение об ошибке стало вполне понятным. Спасибо GebekovAS.

Error: Operands of comparison operator ‘==’ at (1) are INTEGER(4)/CHARACTER(1)

Забавно что в этом тексте нет собственно сообщения о том, что сравнение невозможно, просто констатация факта.

error: incomparable types: int and String

В сообщение об ошибке всё хорошо кроме того, что не указана какая операция вызвала ошибку.

error CS0019: Operator `==’ cannot be applied to operands of type `int’ and `string’

cannot convert «4» to type int
invalid operation: «4» == 2 + 2 (mismatched types string and int)

А тут еще лучше

error: the trait `core::cmp::PartialEq ` is not implemented for the type `_` [E0277]

Логичное, но честно говоря далеко не самое понятное сообщение об ошибке

No instance for (Num Char) arising from a use of `+’

Сперва я не понял сообщение, потом немного подумал и понял. Но стал понимать Haskel еще меньше чем раньше.
Решение от Sirikid если всё таки очень хочется сравнить ideone.com/CJifV3

Результат False

Следующие на очереди языки которые позволяют сравнивать число и строку, при этом возвращая false (или что-то похожее), скорее всего из-за несовпадения типов переменных.

результат — 0. Сравнение указателя на строку и числа 4 скорее всего вернёт 0. При этом выводится предупреждение, почти такое же как в C++:

warning: comparison between pointer and integer [enabled by default]

False
Спасибо, ACPrikh. «Адинэснеги встали в ряд гуру C Lisp Python Lua Ruby.»

Результат True

И наконец языки которые вернут true для сравнения.

К счастью есть операция строгого сравнения (тройное равенство ===), которая вернёт false

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

Операции строгого сравнения нет, кроме того для шестнадцатеричной записи (а почему бы и нет)

Perl интерпретирует строку «0x4» как 0 (в отличие от JavaScript и PHP, которые разбирают шестнадцатеричные строки) и вернёт FALSE, при выводе на консоль так же будет пустая строка.

true
Спасибо, impetus. «При дефолтных ключах/настройках, что документировано и для этого языка логично и ожидаемо.»

true
Спасибо Chpock, «every value is a string».

Есть ли еще языки с необычным поведением при сравнении числа со строкой, я пока не знаю.

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

UPDATE
Исправил досадную ошибку с паскалем, спасибо указавшим. И добавил примеры из комментариев.

Источник

ошибка: ISO C ++ запрещает сравнение между указателем и целым числом [-fpermissive]

Я получаю эту ошибку, может кто-нибудь сказать мне, почему это так?

Обратите внимание, что это функциональная проблема, т.е.
Вам нужно написать свое решение только в форме Функции.
Код драйвера для вызова / вызова вашей функции будет добавлен онлайн-судьей GfG.

Решение

Сравнение неверно как n1 а также n2 являются int тип и root имеет Node* тип

Возможно, вы пытаетесь сравнить с int данные

если твой Node реализация

как ваша функция делает Node *root;

ты мог бы сделать

После прочтения ссылки предоставлено ваше решение

Просто для другого пользователя ссылка, предоставленная пользователем, имеет следующий вопрос

Учитывая двоичное дерево и значения 2 узлов n1 и n2, ваша задача — найти наименьшего общего предка из этих двух узлов. Вам необходимо выполнить функцию LCA. Вы не должны читать входные данные из stdin / console. Есть несколько тестовых случаев. Для каждого теста этот метод будет вызываться индивидуально.

Вход: задача состоит в том, чтобы завершить метод LCA, который принимает 3 аргумента,
корень дерева и два узла значения n1 и n2. Узел структуры имеет
часть данных, в которой хранятся данные, указатель на левого потомка и указатель
чтобы правильно ребенок. Есть несколько тестовых случаев. Для каждого теста
этот метод будет вызываться индивидуально.

Вывод: функция должна возвращать узел, который является наименее распространенным
предок двух узлов n1 и n2.

Ограничения: 1 if (root == n1 || root == n2) должно было:

Боюсь, этот программный тест очень низкого качества.

Ваша линия if (root == n1 || root == n2) , Сообщение об ошибке «ISO C ++ запрещает сравнение между указателем и целым числом». В этом контексте «сравнение» является любым из == , != , , , > , или же >= , У вас есть два из них на ссылочной линии; root == n1 а также root == n2 ,

Если вы посмотрите, где эти переменные объявлены, вы увидите, что root это Node* , что означает «указатель на Node «, а также n1 а также n2 являются int s, что означает «целое число». Таким образом, оба сравнения пытаются сравнить указатель ( root ) для целое число ( n1 или же n2 ), о котором говорит ошибка, не допускается.

Вы можете рассматривать указатель как номер телефона переменной (обычная метафора — это адрес, но в этом случае номер телефона работает лучше) и int как просто число. Вы можете рассматривать номер телефона как int (например, если номер телефона 555-867-5309, вы можете притвориться, что это номер 5 558 675 309), но вы редко хотите делать это, поэтому C ++ заставляет вас быть явным при попытке. То, что вы делаете, это как спросить «это номер телефона root так же, как этот номер мне передали »; теоретически это то, что вы могли бы сделать, но это вероятно, не то, что вы на самом деле хотите.

В этом случае, что вы хотите сделать, это (вероятно, я не знаю проблему точно), чтобы метафорически «позвонить» root и спросите, какое число он знает, получив root->data , Таким образом, строка, которую вы хотите, вероятно, является некоторым вариантом

Обратите внимание, что остальная часть вашей функции выглядит странно, и я думаю, что у вас могут быть другие проблемы, но это позволит вам сосредоточиться на них, пройдя мимо ошибки компилятора.

Не часть ответа, а информация о том, как использовать Stack OVerflow, который не помещается в комментарии:

Причина, по которой вас так сильно понизили, возможно, в том, что вы спросили, почему произошла ошибка, когда это не совсем то, что вы хотели. Сообщение об ошибке довольно ясно об этом; Я объясню это более подробно в первых двух параграфах моего ответа, но большинство программистов на C ++ уже знают большинство из них, это конкретное сообщение об ошибке было относительно ясным, и неясно, какую часть вы не понимаете. Если часть этого сбивает с толку, вам лучше спросить о эта конкретная часть (например, «О каком сравнении идет речь?» или «Почему это не разрешено?»); Кроме того, так как вы также хотите получить информацию о том, как фиксировать это полезно, если вы объясните, что вы хотите сделать и почему.

Источник

Arduino.ru

Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru

forum.arduino.ru

Ошибка: ISO C++ forbids comparison between pointer and integer [-fpermissive]

dany.ino: In function ‘void loop()’:

dany.ino:63:14: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]

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

Не читаете текст ошибки, не смотрите в строку 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.

И еще раз повторю, сказать компилятору, что вы уверены в своих действиях можно явным приведением типа. И компилятору станет наплевать на этот факт. Как это сделать я уже выше показал, да и вам это не я один советовал.

Источник

Когда 2 + 2 = «4»

Во время отдыха от отладки JavaScript, я читал статью про особенности PHP и неожиданно задумался каковы же будут результаты сравнения 2 + 2 = «4» для разных языков программирования. И вот что из этого получилось.

Итоговая таблица для тех кто не хочет много читать
Результат Ошибка компиляции False True
Языки C++
Pascal
FORTRAN-95
Java
C#
Go
Rust
Haskel
C
Lisp
Python
Lua
Ruby
JavaScript
PHP
Perl

Компилятор C выдаёт предупреждение, компилятор C++ ошибку которая превращается в предупреждение если указать флаг -fpermissive.

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

Бонусом — функции вывода на консоль для этих языков.

Ошибка компиляции

Самый простое и неинтересное поведение — это ошибка компиляции, происходит во всех строго типизированных языках.

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

Если указать флаг -fpermissive то произойдёт сравнение указателя на строку и числа 4 которое скорее всего вернёт 0.


Fatal: illegal character «‘»‘» ($22)
Сообщение об ошибке довольно непонятное

Error: Incompatible types: got «Char» expected «Int64»
Сообщение об ошибке стало вполне понятным. Спасибо GebekovAS.

Error: Operands of comparison operator ‘==’ at (1) are INTEGER(4)/CHARACTER(1)

Забавно что в этом тексте нет собственно сообщения о том, что сравнение невозможно, просто констатация факта.

error: incomparable types: int and String

В сообщение об ошибке всё хорошо кроме того, что не указана какая операция вызвала ошибку.

error CS0019: Operator `==’ cannot be applied to operands of type `int’ and `string’

cannot convert «4» to type int
invalid operation: «4» == 2 + 2 (mismatched types string and int)

А тут еще лучше

error: the trait `core::cmp::PartialEq ` is not implemented for the type `_` [E0277]

Логичное, но честно говоря далеко не самое понятное сообщение об ошибке

No instance for (Num Char) arising from a use of `+’

Сперва я не понял сообщение, потом немного подумал и понял. Но стал понимать Haskel еще меньше чем раньше.
Решение от Sirikid если всё таки очень хочется сравнить ideone.com/CJifV3

Результат False

Следующие на очереди языки которые позволяют сравнивать число и строку, при этом возвращая false (или что-то похожее), скорее всего из-за несовпадения типов переменных.

результат — 0. Сравнение указателя на строку и числа 4 скорее всего вернёт 0. При этом выводится предупреждение, почти такое же как в C++:

warning: comparison between pointer and integer [enabled by default]

False
Спасибо, ACPrikh. «Адинэснеги встали в ряд гуру C Lisp Python Lua Ruby.»

Результат True

И наконец языки которые вернут true для сравнения.

К счастью есть операция строгого сравнения (тройное равенство ===), которая вернёт false

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

Операции строгого сравнения нет, кроме того для шестнадцатеричной записи (а почему бы и нет)

Perl интерпретирует строку «0x4» как 0 (в отличие от JavaScript и PHP, которые разбирают шестнадцатеричные строки) и вернёт FALSE, при выводе на консоль так же будет пустая строка.

true
Спасибо, impetus. «При дефолтных ключах/настройках, что документировано и для этого языка логично и ожидаемо.»

true
Спасибо Chpock, «every value is a string».

Есть ли еще языки с необычным поведением при сравнении числа со строкой, я пока не знаю.

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

UPDATE
Исправил досадную ошибку с паскалем, спасибо указавшим. И добавил примеры из комментариев.

Источник

Я получаю эту ошибку, может кто-нибудь сказать мне, почему это так?

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (root == n1 || root == n2)

Обратите внимание, что это функциональная проблема, т.е.
Вам нужно написать свое решение только в форме Функции.
Код драйвера для вызова / вызова вашей функции будет добавлен онлайн-судьей GfG.

Вот код:

/* A binary tree node
struct Node
{
int data;
Node* left, * right;
}; */
/*you are required to
complete this function */
Node * LCA(Node* root ,int n1 ,int n2 )
{
if(root==NULL)
{
return NULL;
}
if(root==n1||root==n2)
{
return root;
}
Node* left=LCA(root->left,n1,n2);
Node* right=LCA(root->right,n1,n2);
if(root->left!=NULL&&root->right!=NULL)
{
return root;
}
if(root->left==NULL&&root->right==NULL)
{
return NULL;
}
return left!=NULL?left:right;
//Your code here
}

-4

Решение

if(root==n1||root==n2)

Сравнение неверно как n1 а также n2 являются int тип и root имеет Node* тип

Возможно, вы пытаетесь сравнить с int данные

если твой Node реализация

struct Node {
int data;
struct Node *next;
};

как ваша функция делает Node *root;

ты мог бы сделать

if (root->data == n1 || root->data == n2)

После прочтения ссылки предоставлено ваше решение

Просто для другого пользователя ссылка, предоставленная пользователем, имеет следующий вопрос

Учитывая двоичное дерево и значения 2 узлов n1 и n2, ваша задача — найти наименьшего общего предка из этих двух узлов. Вам необходимо выполнить функцию LCA. Вы не должны читать входные данные из stdin / console. Есть несколько тестовых случаев. Для каждого теста этот метод будет вызываться индивидуально.

Вход: задача состоит в том, чтобы завершить метод LCA, который принимает 3 аргумента,
корень дерева и два узла значения n1 и n2. Узел структуры имеет
часть данных, в которой хранятся данные, указатель на левого потомка и указатель
чтобы правильно ребенок. Есть несколько тестовых случаев. Для каждого теста
этот метод будет вызываться индивидуально.

Вывод: функция должна возвращать узел, который является наименее распространенным
предок двух узлов n1 и n2.

Ограничения: 1 <= Т <= 30, 1 <= Количество узлов <= 100 и 1 <= Данные узла <= 1000

Node *LCA(Node *root, int n1, int n2)
{
if (root == NULL)
return NULL;

if (root->data == n1 || root->data == n2)
return root;

Node *left  = LCA(root->left, n1, n2);
Node *right = LCA(root->right, n1, n2);

if (left && right)
return root;

if (left)
return left;
else
return right;
}

Пример объяснения

Пример:

Input
1
2
1 2 L 1 3 R
2 3

Output
1

In above example there is one  test case which represent a tree with 3 nodes and 2 edges where root is 1, left child of 1 is 2 and right child of 1 is 3.

2

Другие решения

В вашем коде есть ошибка вырезания / вставки: if (root == n1 || root == n2) должно было:

if (root->data == n1 || root->data == n2)

Боюсь, этот программный тест очень низкого качества.

0

Ваша линия if (root == n1 || root == n2), Сообщение об ошибке «ISO C ++ запрещает сравнение между указателем и целым числом». В этом контексте «сравнение» является любым из ==, !=, <, <=, >, или же >=, У вас есть два из них на ссылочной линии; root == n1 а также root == n2,

Если вы посмотрите, где эти переменные объявлены, вы увидите, что root это Node*, что означает «указатель на Node«, а также n1 а также n2 являются ints, что означает «целое число». Таким образом, оба сравнения пытаются сравнить указатель (root) для целое число (n1 или же n2), о котором говорит ошибка, не допускается.

Вы можете рассматривать указатель как номер телефона переменной (обычная метафора — это адрес, но в этом случае номер телефона работает лучше) и int как просто число. Вы можете рассматривать номер телефона как int (например, если номер телефона 555-867-5309, вы можете притвориться, что это номер 5 558 675 309), но вы редко хотите делать это, поэтому C ++ заставляет вас быть явным при попытке. То, что вы делаете, это как спросить «это номер телефона root так же, как этот номер мне передали »; теоретически это то, что вы могли бы сделать, но это вероятно, не то, что вы на самом деле хотите.

В этом случае, что вы хотите сделать, это (вероятно, я не знаю проблему точно), чтобы метафорически «позвонить» root и спросите, какое число он знает, получив root->data, Таким образом, строка, которую вы хотите, вероятно, является некоторым вариантом

if (root->data == n1 || root->data == n2)

Обратите внимание, что остальная часть вашей функции выглядит странно, и я думаю, что у вас могут быть другие проблемы, но это позволит вам сосредоточиться на них, пройдя мимо ошибки компилятора.


Не часть ответа, а информация о том, как использовать Stack OVerflow, который не помещается в комментарии:

Причина, по которой вас так сильно понизили, возможно, в том, что вы спросили, почему произошла ошибка, когда это не совсем то, что вы хотели. Сообщение об ошибке довольно ясно об этом; Я объясню это более подробно в первых двух параграфах моего ответа, но большинство программистов на C ++ уже знают большинство из них, это конкретное сообщение об ошибке было относительно ясным, и неясно, какую часть вы не понимаете. Если часть этого сбивает с толку, вам лучше спросить о эта конкретная часть (например, «О каком сравнении идет речь?» или «Почему это не разрешено?»); Кроме того, так как вы также хотите получить информацию о том, как фиксировать это полезно, если вы объясните, что вы хотите сделать и почему.

0

Mario*xD

1 / 1 / 0

Регистрация: 20.09.2011

Сообщений: 37

1

20.05.2014, 20:38. Показов 9242. Ответов 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



New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

archcomp opened this issue

Jun 18, 2018

· 8 comments

Comments

@archcomp

Using crosstool-NG 1.23.0 with Ubuntu 18.04 LTS.
When Building, it gives error

[INFO ] Installing pass-1 core C gcc compiler
[EXTRA] Configuring core C gcc compiler
[EXTRA] Building gcc
[ERROR] /home/mv/crosstool-ng/.build/src/gcc-6.3.0/gcc/ubsan.c:1474:23: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
[ERROR] make[2]: *** [ubsan.o] Error 1
[ERROR] make[2]: *** Waiting for unfinished jobs….
[ERROR] make[1]: *** [all-gcc] Error 2
[ERROR]
[ERROR] >>
[ERROR] >> Build failed in step ‘Installing pass-1 core C gcc compiler’
[ERROR] >> called in step ‘(top-level)’
[ERROR] >>
[ERROR] >> Error happened in: CT_DoExecLog[scripts/functions@338]
[ERROR] >> called from: do_gcc_core_backend[scripts/build/cc/100-gcc.sh@674]
[ERROR] >> called from: do_gcc_core_pass_1[scripts/build/cc/100-gcc.sh@227]
[ERROR] >> called from: do_cc_core_pass_1[scripts/build/cc.sh@35]
[ERROR] >> called from: main[scripts/crosstool-NG.sh@653]
[ERROR] >>
[ERROR] >> For more info on this error, look at the file: ‘build.log’
[ERROR] >> There is a list of known issues, some with workarounds, in:
[ERROR] >> ‘docs/B — Known issues.txt’
Build Log file attached.
build.log

@gmac80

Hi,
When compiling using pages 3 and 5 of Bootlin’s instructions on Ubuntu 18.04 LTS, I had the same issue, but was able to compile once I inserted a (const char*) cast:
if (xloc.file == NULL || strncmp (xloc.file, "1", 2) == 0 || xloc.file == (const char*)'' || xloc.file[0] == 'xff' || xloc.file[1] == 'xff')

Please could a maintainer verify that this is the correct solution.

@tpetazzoni

This issue is a duplicate of #735, i.e the problem exists in CT-NG 1.23.0 but not in later versions.

@halilgithub

@gmac80

In which file did you do the fix ?

@stilor

The fix was in one of the patches in the packages/gcc; AFAIR it is fixed in the current GCC6 release upstream (6.4).

@stilor

@gmac80 No, your fix was not correct: your check is equivalent to the 1st condition (xloc.file == NULL). It should’ve been xloc.file[0] == ''.

@gmac80

@gmac80

@stilor

@gmac80 The source is that the code was invalid, but older compilers failed to detect it. When the host OS switched to newer compiler, that code started to err out.

bensuperpc

added a commit
to bensuperpc/dockcross
that referenced
this issue

Jun 25, 2021

@bensuperpc

JonasVautherin

pushed a commit
to dockcross/dockcross
that referenced
this issue

Jun 25, 2021

@bensuperpc

@JonasVautherin

Понравилась статья? Поделить с друзьями:
  • Error is not valid auth 10
  • Error is not utf 8 encoded python saving disabled
  • Error is not recoverable exiting now перевод
  • Error is not recoverable exiting now ubuntu
  • Error is not recoverable exiting now centos