Я начинающий программист на C++ с очень небольшими знаниями о C++. Я создавал программу в среде IDE и компиляторе: Dev-C++ 5.6.3. Я столкнулся с этой ошибкой: ISO C++ запрещает сравнение между указателем и целым числом [-fpermissive]. Я не знаю, что это значит.
Ошибка C++: ISO C++ запрещает сравнение между указателем и целым числом [-fpermissive]
Ответы (2)
"Y"
, "y"
, "n"
и "N"
— это строки в стиле C, которые представляют собой массивы символов, заканчивающихся нулем. При попытке их сравнить они вырождаются в указатели на const char
. С другой стороны, inputy
объявляется как int
. Это источник вашего сравнения между ошибками указателя и целого числа.
Чтобы решить эту проблему, сравните inputy
с символами вместо строк: 'Y'
, 'y'
, 'n'
и 'N'
(обратите внимание на одинарные, а не на двойные кавычки).
person
user3553031
schedule
22.07.2014
Также необходимо внести изменение: либо
inputy
будет char
, либо scanf("%c"
не будет использоваться.
- person M.M; 22.07.2014
У тебя другая проблема. Вы объявили int inputy;
, но пытаетесь прочитать символ, выполнив scanf("%c", &inputy);
. Строка формата %c
не соответствует типу данных &inputy
. Если вы хотите прочитать символ, вы должны использовать правильный тип для входной переменной:
char inputy;
scanf("%c", &inputy);
person
Blastfurnace
schedule
22.07.2014
Ах да, путаница, вызванная тем фактом, что так много символьных функций в C используют
int
для передачи или возврата символа.
- person Mike DeSimone; 22.07.2014
Подумайте об этом, если вы работаете на платформе с прямым порядком байтов и если память, используемая
inputy
, каким-то образом была инициализирована 0
, тогда будет наблюдаться правильное поведение, даже если указатель указывает на неправильный тип (поскольку байт указатель указывает на младший байт int
). Определенно неопределенное поведение с точки зрения языка.
- person Mike DeSimone; 22.07.2014
goto
может быть хорошей идеей в определенных ситуациях, но держу пари, что это никогда не будет хорошей идеей для новичка. - person chris   schedule 22.07.2014goto
, — это восстановление после ошибок в некоторых загадочных ситуациях. Как на платформе без обработки исключений. - person Mike DeSimone   schedule 22.07.2014Lobby
,Shut2
иError
, не публикуется, поэтому невозможно узнать, что здесь происходит. Еще одна большая проблема — смешивание кода<iostream>
(cout
) и<stdio.h>
(scanf
,getch
). Это может иметь всевозможные странные побочные эффекты, потому что эти две библиотеки ввода-вывода не всегда синхронизируются друг с другом. - person Mike DeSimone   schedule 22.07.2014goto
везде. - person user3553031   schedule 22.07.2014sync_with_stdio(false)
. Пожалуйста, поправьте меня, если это неправильно. (Не то чтобы я рекомендовал смешивать их в любом случае.) - person chris   schedule 22.07.2014%c
вместоscanf
ожидаетchar *
, а неint *
. - person T.C.   schedule 22.07.2014goto
... - person M.M   schedule 22.07.2014cfront
) было новой вещью. Мило с их стороны решить проблему навсегда. - person Mike DeSimone   schedule 22.07.2014if
можно заменить тернарными операторами, а последовательные операторы можно превратить в длинную серию,
выражения с разделителями). - person Mike DeSimone   schedule 22.07.2014constexpr
(кроме рекурсии), пока C ++ 14 не исправил нас. - person chris   schedule 22.07.2014