正确使用程序中的函数原型

时间:2013-07-11 11:17:39

标签: c

我必须在我的一个程序中使用以下C函数(使用Kiel编译器):

Prototype: int fopen (FILE* f, char* filename, char* mode)
Parameters: 
1. f-Pointer to file structure
2. filename-Pointer to a memory location that contains the filename.
3. mode-Pointer to a memory location that contains the file open mode.
Return Value: 1, if file was opened successfully.
0, otherwise.

当我尝试这个时,我收到错误:

FILE * f;
char* filename;
char* mode;
int t;


filename[0]= 'g';

mode[0]='w';


t= fopen( f, filename[0],mode[0]);

错误:

COPYRIGHT Copyright (C) 2012 - 2013 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** ERROR C141 IN LINE 171 OF F34x_MSD_F931DC_main.c: syntax error near 'FILE'
*** ERROR C202 IN LINE 171 OF F34x_MSD_F931DC_main.c: 'f': undefined identifier
*** ERROR C141 IN LINE 172 OF F34x_MSD_F931DC_main.c: syntax error near 'char'
*** ERROR C202 IN LINE 172 OF F34x_MSD_F931DC_main.c: 'filename': undefined identifier
*** ERROR C141 IN LINE 173 OF F34x_MSD_F931DC_main.c: syntax error near 'char'
*** ERROR C202 IN LINE 173 OF F34x_MSD_F931DC_main.c: 'mode': undefined identifier
*** ERROR C141 IN LINE 174 OF F34x_MSD_F931DC_main.c: syntax error near 'int'
*** ERROR C202 IN LINE 174 OF F34x_MSD_F931DC_main.c: 't': undefined identifier
*** ERROR C202 IN LINE 177 OF F34x_MSD_F931DC_main.c: 'filename': undefined identifier
*** ERROR C202 IN LINE 179 OF F34x_MSD_F931DC_main.c: 'mode': undefined identifier
*** ERROR C202 IN LINE 182 OF F34x_MSD_F931DC_main.c: 't': undefined identifier

C51 COMPILATION COMPLETE.  0 WARNING(S),  11 ERROR(S)

有人可以帮我正确使用吗?

更新

当我把变量声明放在main的开头我设法删除所有错误。但是现在出现了一个新的错误:

COPYRIGHT Copyright (C) 2012 - 2013 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** ERROR C214 IN LINE 184 OF F34x_MSD_F931DC_main.c: illegal pointer conversion

我得到了一些提示here,但即便如此也无法理解如何解决此问题

4 个答案:

答案 0 :(得分:2)

int fopen (FILE* f, char* filename, char* mode)

这意味着您应该将指针传递给参数filename,但是您传递的是filename[0],这是一个字符。参数mode也是如此。

以下代码将执行:

FILE* f;
char* filename="file.txt";   //assuming the file you want to write in is called file.txt and in the same folder with the project
int t;

t= fopen(f, filename, "w");

但是,我认为你应该花一些时间来完全理解关于C的一些基础知识。你没有malloc指针的任何内存,这往往会导致一些运行时错误。你似乎对类型有些混乱。在处理文件之前,最好有一个坚实的基础,否则会有更多的问题。

答案 1 :(得分:1)

传递参数的正确方法是

            t= fopen(f, filename, mode);

答案 2 :(得分:0)

此处,filenamemode都是char* s(指向char的指针)。但是,您提供fopen filename[0]mode[0],这两者都是char

char* filename;
char* mode;
t= fopen( f, filename[0],mode[0]);

正确的方法是传递char* s:

t= fopen(f, filename, mode);

这不会导致编译错误,但会导致运行时错误:在解除引用之前,您没有为指针分配内存。您可以通过以下几种方式解决此问题:

1:将它们声明为数组:

char filename[2] = "g";
char mode[2] = "w";
...

2:动态分配内存:

char * filename = calloc(2,1);
char * mode = calloc(2,1);
filename[0]= 'g';
mode[0]='w';
...
free(filename);
free(mode);

答案 3 :(得分:0)

有几个错误让我觉得你没有C指针的经验。因此,除了你的问题:

a)所有指针都未初始化。这将导致未定义的行为。

b)所有指针都指向无保留的内存。这将导致未定义的行为。

c)filenamemodechar *,并被视为字符串。它们必须以0结尾。

与您的问题主题有更高的关系:

d)你没有传递指针,但是数组的第一个元素,指针应指向(并且)。

可能你想做这样的事情:

t= fopen( f, "g", "w");

这是有效的,因为字符串文字在C中是char *

e)C中已有fopen()

f)如果你有自己的fopen(),它应该可以通过参数列表返回类型为FILE *的实体。有两种方法可以做到这一点:

你有一个FILE类型的实体,并传递一个指向这个的实体:

 FILE file;
 t= fopen( &file, "g", "w");

fopen()创建该实体,因此您拥有类型为FILE *的实体并传递指向此实体的指针:

FILE *file;
t= fopen( &file, "g", "w");

我强烈建议花更多时间学习,指针如何在C中工作。这并不容易。