【问题标题】:Why calling this function produces error "<function> is not a function or function pointer"?为什么调用此函数会产生错误“<function> 不是函数或函数指针”?
【发布时间】:2017-01-26 12:35:42
【问题描述】:

似乎函数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;
}

【问题讨论】:

  • 在众多答案中,您似乎也传递了错误的参数。 char row[] 是第一个参数,但传入 strlen(qwertyHomeRowInches),这是一个 int;
  • @MichaelPickett 你的意思是size_t,对吧?
  • @SouravGhosh 是的,我做到了。我的错。

标签: c function scope function-call


【解决方案1】:

main() 内部有一个 qwertyInches 局部变量,它会影响 qwertyInches() 函数。

引用C11,第 §6.2.1 章,标识符范围强调我的

[....] 如果一个标识符指定了两个不同的同名实体 空间,范围可能重叠。如果是这样,一个实体的范围(内部范围)将结束 严格在其他实体的范围之前(外部范围)。 在内部范围内, 标识符指定在内部范围内声明的实体;在外部声明的实体 范围在内部范围内隐藏(不可见)。

解决方案:更改其中一个名称。

也就是说,qwertyInches() 函数的第一个参数应该是 char *,但您传递的是 size_tstrlen() 的输出),这是完全错误的。也改变它。

【讨论】:

    【解决方案2】:

    当我在 main 中调用它时,它给了我这个... [错误] 称为对象 'qwertyInches' 不是函数或函数指针。

    当然编译器是对的。 main()中,这个声明隐藏了函数声明:

    double qwertyInches = 0.0;
    

    因此,在main() 中,qwertyInches 指的是double 类型的局部变量,而不是函数。

    【讨论】:

      【解决方案3】:

      您将qwertyInches 定义为变量和函数。

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

         double qwertyInches = 0.0;
      

      只需更改上述之一的名称。我通常给我的函数一个“动作”名称,给我的变量一个“事物”名称。

      【讨论】:

        猜你喜欢
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 2012-05-28
        相关资源
        最近更新 更多