ISO C++ запрещает сравнение указателя и целого числа [-fpermissive]

Кодекс

int cycle_length(int i, int j) {
    int cycleLength = 0;
    for (int k = i; k <= j; k++) {
        cout << algorithm(k) << endl;
        if (algorithm(k) > cycle_length) {
            cycleLength = algorithm(k);
        }
    }
    return cycleLength;
}

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

Я получил эту ошибку в этой строке if ( algorithm(k) > cycle_length).

Как же так, тот же самый код работает прямо в main()?? и что означает эта ошибка???

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

int algorithm(int number1) {
    int counter = 1, number = number1;
    do {
        if (number % 2 == 0) {
            number = number / 2;
            counter++;
        } else {
            number = (3 * number) + 1;
            counter++;
        }
    } while (number != 1);

    return counter;
}

person Mahmoud    schedule 29.01.2013    source источник
comment
Как определяется algorithm?   -  person David Rodríguez - dribeas    schedule 29.01.2013
comment
алгоритм (k) возвращает указатель? У вас есть другие алгоритмы()?   -  person qPCR4vir    schedule 29.01.2013


Ответы (1)


Вы путаете имя функции с вашей локальной переменной с почти таким же именем:

int cycle_length(int i, int j)
{
    int cycleLength

Ваша функция называется cycle_length, ваша переменная называется cycleLength, но вы используете cycle_length дальше.

Сообщение об ошибке немного странное, потому что компилятор не «сравнивает имена переменных с именами функций, чтобы увидеть, есть ли похожие, а затем предполагает, что, возможно, вы просто набрали его неправильно» — он просто говорит: «Хм, вы сравнение указателя функции [то, что вы получаете из имени функции] с целым числом, это не включено!»

person Mats Petersson    schedule 29.01.2013
comment
clang мог бы сделать лучшее предложение. Позвольте мне попробовать это здесь. - person Carl Norum; 29.01.2013
comment
Это не лучшее предложение, но сообщение об ошибке содержит типы, поэтому вы можете сказать, что сравниваете с указателем на функцию. Это все же лучше, чем gcc, но не так хорошо, как попытка исправить опечатку. Сообщение: excpp.cpp:13:27: error: comparison between pointer and integer ('int' and 'int (*)(int, int)') Еще одна веская причина использовать clang! - person Carl Norum; 29.01.2013
comment
Я заметил, что clang имеет тенденцию выдавать немного более подробные сообщения об ошибках в целом [что может несколько раздражать, когда у вас много ошибок, потому что первое из них прокручивается за пределы экрана, прежде чем вы его видите...] - person Mats Petersson; 29.01.2013
comment
Ну, БОЛЬШУЮ часть времени у меня с этим проблем нет, но иногда у вас возникает одна из тех ситуаций, когда какой-то отсутствующий/лишний символ вызывает много ошибок... [Отсутствие точки с запятой в заголовочном файле является фаворитом для этого] . - person Mats Petersson; 29.01.2013
comment
Верно, но clang выдает намного больше ошибок в случае с точкой с запятой, чем gcc. Включая предложение о том, где его разместить. В этом случае определенно стоит немного прокрутить страницу, особенно для новичков. - person Carl Norum; 29.01.2013
comment
Хм, не думаю, что я наткнулся именно на эту ошибку в clang — я имел в виду тенденцию создавать несколько строк для одной ошибки, которая, когда вы получаете их много (скажем, вы забыли включить ‹string›, и таким образом получить жалобу на каждое использование строки и, возможно, другие ошибки, потому что она была потеряна), даже буфер прокрутки иногда недостаточно длинный (да, я могу установить более длинный буфер прокрутки). В любом случае, мы немного разошлись... - person Mats Petersson; 29.01.2013