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

Я начинающий программист на C++ с очень небольшими знаниями о C++. Я создавал программу в среде IDE и компиляторе: Dev-C++ 5.6.3. Я столкнулся с этой ошибкой: ISO C++ запрещает сравнение между указателем и целым числом [-fpermissive]. Я не знаю, что это значит.


person Voltwitz    schedule 22.07.2014    source источник
comment
@drescherjm, goto может быть хорошей идеей в определенных ситуациях, но держу пари, что это никогда не будет хорошей идеей для новичка.   -  person chris    schedule 22.07.2014
comment
Единственное хорошее применение, которое я нашел для goto, — это восстановление после ошибок в некоторых загадочных ситуациях. Как на платформе без обработки исключений.   -  person Mike DeSimone    schedule 22.07.2014
comment
@MikeDeSimone, правда, единственное хорошее применение, которое я видел в C, - это обработка ошибок. Я не исключаю возможности того, что он может быть действительно полезен где-то еще.   -  person chris    schedule 22.07.2014
comment
Тем не менее, код, на который ссылаются Lobby, Shut2 и Error, не публикуется, поэтому невозможно узнать, что здесь происходит. Еще одна большая проблема — смешивание кода <iostream> (cout) и <stdio.h> (scanf, getch). Это может иметь всевозможные странные побочные эффекты, потому что эти две библиотеки ввода-вывода не всегда синхронизируются друг с другом.   -  person Mike DeSimone    schedule 22.07.2014
comment
Эта программа выглядит как прямой перевод с gwbasic. C++ имеет гораздо лучшие способы управления потоком программы, чем использование goto везде.   -  person user3553031    schedule 22.07.2014
comment
@MikeDeSimone, насколько я знаю, они синхронизируются по умолчанию, пока вы не позвоните sync_with_stdio(false). Пожалуйста, поправьте меня, если это неправильно. (Не то чтобы я рекомендовал смешивать их в любом случае.)   -  person chris    schedule 22.07.2014
comment
Как насчет cin вместо scanf()?   -  person drescherjm    schedule 22.07.2014
comment
Также есть небольшая проблема, что %c вместо scanf ожидает char *, а не int *.   -  person T.C.    schedule 22.07.2014
comment
Из всех проблем в этом коде все прыгают на goto...   -  person M.M    schedule 22.07.2014
comment
@chris: я раньше не видел эту функцию. (Изучал язык на компиляторах, которые всегда говорят, что шаблоны и обработка исключений не поддерживаются.) Я думаю, он был стандартизирован C++98 или около того?   -  person Mike DeSimone    schedule 22.07.2014
comment
@MikeDeSimone, я думаю, да, учитывая, что cppreference не имеет замечания с момента C++xx. Я никогда не использовал его, поэтому я не знаком с ним, кроме этого момента.   -  person chris    schedule 22.07.2014
comment
@chris Я просто помню, что у меня были проблемы со случайным переупорядочением вывода при смешивании вызовов, но опять же, это было в начале 90-х, когда стандартные библиотеки C ничего не делали для интеграции с библиотеками C++ или других языков, а также наличие собственного компилятора C++ (как в отличие от cfront) было новой вещью. Мило с их стороны решить проблему навсегда.   -  person Mike DeSimone    schedule 22.07.2014
comment
@MikeDeSimone, я все время слышу об этих волшебных временах, и хотя было бы здорово испытать их, я продолжаю убеждаться, что не быть рядом в то время - это хорошо.   -  person chris    schedule 22.07.2014
comment
@chris Я не скучаю по тем странностям, когда циклы нельзя использовать во встроенных функциях (потому что их нельзя свести к выражениям, в отличие от того, как операторы if можно заменить тернарными операторами, а последовательные операторы можно превратить в длинную серию , выражения с разделителями).   -  person Mike DeSimone    schedule 22.07.2014
comment
@MikeDeSimone, забавно, что вы должны упомянуть об этом, потому что он снова появился с функциями constexpr (кроме рекурсии), пока C ++ 14 не исправил нас.   -  person chris    schedule 22.07.2014


Ответы (2)


"Y", "y", "n" и "N" — это строки в стиле C, которые представляют собой массивы символов, заканчивающихся нулем. При попытке их сравнить они вырождаются в указатели на const char. С другой стороны, inputy объявляется как int. Это источник вашего сравнения между ошибками указателя и целого числа.

Чтобы решить эту проблему, сравните inputy с символами вместо строк: 'Y', 'y', 'n' и 'N' (обратите внимание на одинарные, а не на двойные кавычки).

person user3553031    schedule 22.07.2014
comment
Также необходимо внести изменение: либо 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
comment
Ах да, путаница, вызванная тем фактом, что так много символьных функций в C используют int для передачи или возврата символа. - person Mike DeSimone; 22.07.2014
comment
Подумайте об этом, если вы работаете на платформе с прямым порядком байтов и если память, используемая inputy, каким-то образом была инициализирована 0, тогда будет наблюдаться правильное поведение, даже если указатель указывает на неправильный тип (поскольку байт указатель указывает на младший байт int). Определенно неопределенное поведение с точки зрения языка. - person Mike DeSimone; 22.07.2014