Почему вызов этой функции приводит к ошибке "<функция> не является функцией или указателем на функцию"?

Похоже на функцию qwertyInches() должно работать, но когда я звоню в main() это дает мне

[Ошибка] вызываемый объект 'qwertyInches' не является функцией или указателем на функцию.

Любая помощь будет принята с благодарностью.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Global constant
const int MAX_LENGTH = 81;   // global constant for max input line length


void qwertyInches (char row[], double *inches, int x, double y) {
    int d;
    for (d = 0; d < strlen(row); d++) {
        if (x == row[d]) {
            *inches = *inches + y;
        }
    }
}


int main() {
    int count[256] = { 0 };
    int  letterCounter = 0;
    int qwertyCounter = 0;
    int homeRowCounter = 0;
    int dvorakCounter = 0;
    char qwertyHomeRow[23] = {"asdfghjkl;ASDFGHJKL:\"'" };
    char dvorakHomeRow[22] = {"aoeuidhtns-_AOEUIDHTNS"};
    double percentOfCharQwerty = 0.0;
    double percentOfCharDvorak = 0.0;
    char qwertyHomeRowInches[4] = {"ghGH"};
    char qwertyRowInches[46] = {"qweruiopQWERUIOP{[}]\ZzXx|CcVvNnMm<,>./?"};
    char qwertyNumberInches[25]= {"`~1!2@3#4$5%7&8*9(0)-_=+)"};
    char qwertyTAndYInches[4] = {"TtYy"};
    char num6Inches[2] = {"6^"};
    char dvorakHomeRowInches[4]= {"iIDd"};
    char dvorakRowInches[41] = {"\"<',.>PpGgCcRrLl?/:+=|:;QqJjKkBb\MmWwVvZz"};
    char dvorakYandFInches[4] = {"YyFf"};
    char dvorakNumberInches [25] = {"~`1!2@3#4$5%7&8*9()0{[]}"};
    double dvorakInches = 0.0;
    double qwertyInches = 0.0;


    /* loop counters */
    int k;
    int l;
    int d;
    /* file handle --- in this case I am parsing this source code */
    FILE *fp = fopen("newsample.txt", "r");

    /* a holder for each character (stored as int) */
    int c;

    /* for as long as we can get characters... */
    while((c=fgetc(fp))) {

        /* break if end of file */
        if(c == EOF) {
            break;
        }
        else if (c == 32 || c == 10 || c == 9) {
            count[c]+=1;
        }
        /* otherwise add one to the count of that particular character */
        else {
            count[c]+=1;
            letterCounter++;
            for (l = 0; l < strlen(dvorakHomeRow); l++) {
                if (c == qwertyHomeRow[l]) {
                    qwertyCounter++;
                }
                if (c == dvorakHomeRow[l]) {
                    dvorakCounter++;
                }
            }
            qwertyInches(strlen(qwertyHomeRowInches) , &qwertyInches, c, .75 );

        }

    }


percentOfCharQwerty = (double) qwertyCounter / (double) letterCounter * 100;
percentOfCharDvorak = (double) dvorakCounter / (double) letterCounter * 100;

printf("Amount of Letters: %d\n", letterCounter);
printf("qwerty counter: %d\n", qwertyCounter);
printf("Dvorak counter: %d\n", dvorakCounter);
printf("Percent of qwerty letters %.2lf\n", percentOfCharQwerty);
printf("Percent of Dvorak letters %.2lf\n", percentOfCharDvorak);
printf("qwertyInches: %.2lf\n", qwertyInches);
printf("dvorakInches: %.2lf\n", dvorakInches);
/* close the file */
fclose(fp);
return;
}

3 ответа

Решение

E сть qwertyInches локальная переменная внутри main() какие тени qwertyInches() функция.

квотирование C11 Глава §6.2.1, Области применения идентификаторов (выделено мое)

[....] Если идентификатор обозначает два разных объекта в одном и том же пространстве имен, области действия могут перекрываться. Если это так, область действия одной сущности (внутренняя область) заканчивается строго перед областью действия другой сущности (внешняя область). Во внутренней области видимости обозначает сущность, объявленную во внутренней области; сущность, объявленная во внешней области видимости, скрыта (и не видна) во внутренней области видимости.

Решение: Измените одно из имен.

Тем не менее, первый аргумент qwertyInches() функция должна быть char *, но вы передаете size_t (вывод strlen()) что совершенно неправильно. Измени это тоже.

когда я вызываю его в main, это дает мне это... [Ошибка], вызываемая объектом 'qwertyInches', не является функцией или указателем на функцию.

И конечно компилятор прав. внутриmain()это объявление затеняет объявление функции:

double qwertyInches = 0.0;

Таким образом, в main(), qwertyInches ссылается на локальную переменную типа doubleне функция.

Вы определяете оба qwertyInches как переменная И функция.

void qwertyInches (char row[], double *inches, int x, double y) {

а также

   double qwertyInches = 0.0;

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

Другие вопросы по тегам