Vanson Ho Vanson Ho - 2 months ago 6
C Question

Why calling this function produces error "<function> is not a function or function pointer"?

Seems like the function

qwertyInches()
should work but when I call it in
main()
it gives me


[Error] called object 'qwertyInches' is not a function or function pointer.


Any help would be greatly appreciated.

#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;
}

Answer

There is a qwertyInches local variable inside main() which shadows qwertyInches() function.

Quoting C11, chapter ยง6.2.1, Scopes of identifiers (emphasis mine)

[....] If an identifier designates two different entities in the same name space, the scopes might overlap. If so, the scope of one entity (the inner scope) will end strictly before the scope of the other entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.

Solution: Change one of the names.

That said, the first argument of qwertyInches() function should be a char *, but you're passing a size_t (output of strlen()) which is plain wrong. Change that too.