我制作了一个程序而不知道为什么Code::Blocks
会给我一些错误:
error: conflicting types for 'loadSavedGame'
note: previous declaration of 'loadSavedGame' was here(In headers of file)
In function 'loadSavedGame':error: incompatible types when assigning to type 'struct saveGame' from type 'struct saveGame *'
我不明白,因为给我一个错误,如果我以同样的方式宣布其他函数,请看:
struct configParam{
char *clave;
char *valor;
};
struct saveGame{
char *id;
char *score;
char *position;
char *maze_level;
char *achievements;
char *time_playing;
char *virtual_players;
};
void loadSettings(char fileName[],struct configParam *paramsReaded[], int *length, int *statusCode);
void saveSettings(char fileName[],struct configParam paramsToWrite[], int length, int *statusCode);
void loadSavedGame(char fileName[],struct saveGame *savedGamesReaded[], int *length, int *statusCode);
void saveGame(char fileName[],struct saveGame savedGamesToWrite[], int length, int *statusCode);
void loadSettings(char fileName[],struct configParam *paramsReaded[], int *length, int *statusCode){
*paramsReaded = (struct configParam*)malloc((*length)*sizeof(struct configParam)); //THIS WORK
int j;
for(j=0; j<*length; j++){
(*paramsReaded)[j].clave = (char *)malloc(MAX_STRING*sizeof(char)); //reserva de memoria para los miembros "clave" y "valor" de la estructura
(*paramsReaded)[j].valor = (char *)malloc(MAX_STRING*sizeof(char));
}
}
void loadSavedGame(char fileName[], struct saveGame *savedGamesReaded, int *length, int *statusCode){
*savedGamesReaded = (struct saveGame*)malloc((*length)*sizeof(struct saveGame)); // HERE SHOW AN ERROR :(
int j;
for(j=0; j<*length; j++){
(*savedGamesReaded)[j].id = (char *)malloc(MAX_STRING*sizeof(char));
(*savedGamesReaded)[j].score = (char *)malloc(MAX_STRING*sizeof(char));
(*savedGamesReaded)[j].position = (char *)malloc(MAX_STRING*sizeof(char));
(*savedGamesReaded)[j].maze_level = (char *)malloc(MAX_STRING*sizeof(char));
(*savedGamesReaded)[j].achievements = (char *)malloc(MAX_STRING*sizeof(char));
(*savedGamesReaded)[j].time_playing = (char *)malloc(MAX_STRING*sizeof(char));
(*savedGamesReaded)[j].virtual_players = (char *)malloc(MAX_STRING*sizeof(char));
}
}
两个函数的工作方式基本相同,只有“loadsaveGame”指向更长的数组,然后我不知道为什么它不起作用(函数loadsaveGame) 谢谢你的回复人员
答案 0 :(得分:2)
让我们将其进一步减少到OnSubscribeInputStreamToLines
......
void loadSettings(struct configParam *paramsReaded[]){
*paramsReaded = malloc(42); // This compiles.
}
void loadSavedGame(struct saveGame *savedGamesReaded){
*savedGamesReaded = malloc(42); // This doesn't.
}
有什么区别?让我们进一步研究剥离参数标识符和主体以形成这两个函数的原型:
void loadSettings(struct configParam *[]);
void loadSavedGame(struct saveGame *);
你现在看到了区别吗?第一个使用两个间接级别(*
和[]
),而第二个级别仅使用一个间接级别。
如果您打算在loadSettings
返回后分配给存在的对象,则第一个使用正确的习语。它看起来很健全。
第二个尝试使用相同的模式,但它缺少[]
...嗯?
P.S。为了将来参考,请了解如何制作MCVE,以便您可以更轻松地发现这些简单的印刷问题。
P.P.S。在尝试将某些内容存储到它指向的对象之前,请不要忘记检查malloc
(对于NULL
值)的返回值。
答案 1 :(得分:0)
你得到错误
错误:&#39; loadSavedGame&#39;
的冲突类型注意:先前声明了'loadSavedGame&#39;在这里(在文件的标题中)
是因为这是函数loadSavedGame
的原型 -
void loadSavedGame(char fileName[],struct saveGame *savedGamesReaded[], int *length, int *statusCode);
虽然定义你写了 -
void loadSavedGame(char fileName[], struct saveGame *savedGamesReaded, int *length, int *statusCode){
参见
中参数二的类型 第一个struct saveGame *savedGamesReaded[]
(结构指针数组)中的1。
2。在定义函数struct saveGame *savedGamesReaded
(指向struct的指针)时的第二个
因此类型冲突,错误。你在定义函数时错过[]
。
下一个错误是由于这个 -
*savedGamesReaded = (struct saveGame*)malloc((*length)*sizeof(struct saveGame)); // HERE SHOW AN ERROR :(
这也是由于上述问题。如果保留指针数组,即struct saveGame *savedGamedReaded[]
,这将是一个有效的语句,并且不会产生错误。由于*
和[]
将提供两个间接级别。
但如果没有,那么使用*
会产生问题。然后你将不得不删除它。
答案 2 :(得分:0)
以下代码可能更多是您要实施的内容
代码需要对每个malloc添加的
进行错误检查从代码中删除所有'混乱'。 从代码中删除所有未使用的函数参数 代码编译时没有错误/警告
#include <stdlib.h>
#define MAX_STRING (100)
struct configParam
{
char *clave;
char *valor;
};
struct saveGame
{
char *id;
char *score;
char *position;
char *maze_level;
char *achievements;
char *time_playing;
char *virtual_players;
};
//prototypes
void loadSavedGame(struct saveGame **savedGamesReaded, int *length );
void loadSettings( struct configParam **paramsReaded, int *length );
void loadSettings( struct configParam **paramsReaded, int *length )
{
*paramsReaded = malloc((*length)*sizeof(struct configParam)); //THIS WORK
int j;
for(j=0; j<*length; j++)
{
(*paramsReaded)[j].clave = malloc(MAX_STRING); //reserva de memoria para los miembros "clave" y "valor" de la estructura
(*paramsReaded)[j].valor = malloc(MAX_STRING);
}
}
void loadSavedGame(struct saveGame **savedGamesReaded, int *length )
{
*savedGamesReaded = malloc((*length)*sizeof(struct saveGame));
int j;
for(j=0; j<*length; j++)
{
(*savedGamesReaded)[j].id = malloc(MAX_STRING);
(*savedGamesReaded)[j].score = malloc(MAX_STRING);
(*savedGamesReaded)[j].position = malloc(MAX_STRING);
(*savedGamesReaded)[j].maze_level = malloc(MAX_STRING);
(*savedGamesReaded)[j].achievements = malloc(MAX_STRING);
(*savedGamesReaded)[j].time_playing = malloc(MAX_STRING);
(*savedGamesReaded)[j].virtual_players = malloc(MAX_STRING);
}
} // end function: loadSavedGame