1

この関数を呼び出すとき

 4 char *file_reader(FILE *fp, char *file_name, const char *mode) {
  5     char *buffer;
  6     fp = fopen(file_name, mode);
  7 
  8     if (fp != NULL) {
  9         fseek(fp, 0L, SEEK_END);
 10         long s = ftell(fp);
 11         rewind(fp);
 12         buffer = malloc(s);
 13         if (buffer != NULL) {
 14             fread(buffer, s, 1, fp);
 15             fclose(fp);
 16             fp = NULL;
 17         }
 18         if (fp != NULL)
 19             fclose(fp);
 20     } else {
 21         printf("No such file.\n");
 22         return "ERR";
 23     }
 24     return buffer;
 25 }

 char *file_content = file_reader(fp, input_file, "r");

gcc は不平を言い続けましたがreturn from incompatible pointer type [enabled by default]、互換性のないポインター型は見当たりません。誰でもそれについて何か考えがあります、ありがとう。

4

3 に答える 3

0

「互換性のないポインタ型」は、定数文字列「ERR」に対するものです。

于 2013-01-20T00:14:49.827 に答える
0

動作します。でコンパイルしました-Wall -Werror -Wextra -pedantic -std=c11

#include "stdio.h"
#include "stdlib.h"
FILE* fp;
char* input_file = "asdf.txt";
char *file_reader(FILE *fp, char *file_name, const char *mode) {
    char *buffer;
    fp = fopen(file_name, mode);
    if (fp != NULL) {
        fseek(fp, 0L, SEEK_END);
        long s = ftell(fp);
        rewind(fp);
        buffer = malloc(s);
        if (buffer != NULL) {
            fread(buffer, s, 1, fp);
            fclose(fp);
            fp = NULL;
        }
        if (fp != NULL)
            fclose(fp);
    } else {
        printf("No such file.\n");
        return "ERR";
    }
    return buffer;
}
int main() {
    char *file_content = file_reader(fp, input_file, "r");
    printf("%s\n", file_content);
    return 0;
}
于 2013-01-19T08:18:20.917 に答える
0

これは、呼び出しを行った時点で file_reader() のプロトタイプが欠落しているように聞こえます。プロトタイプがない場合intは、関数の戻り値の型と見なされます。

これを解決するには、関数のプロトタイプをヘッダーに配置してから含めるか、呼び出しを行う前に手動でプロトタイプを作成する必要があります。したがって、これが必要です:

char *file_reader(FILE *fp, char *file_name, const char *mode);

file_reader() のもう 1 つの問題は、そのfile_nameパラメーターを作成するのを忘れたことですconst

于 2013-01-19T08:18:56.063 に答える