gpt4 book ai didi

c++ - 我不明白我在此编程代码中遇到的错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:48 24 4
gpt4 key购买 nike

我一直收到这个错误,我使用的是 VS 2013。我下载了 MUD ROM 2.4b6 的源代码,当我编译时,这就是我得到的。

错误5 error C2109: expression must be a pointer to a complete object type

错误是针对 spec_table 的:

fun == spec_table[cmd].function 

这是给我带来问题的代码。我完全不知道要去哪里?顺便说一句,spec_table 是在代码最顶部的同一个文件中定义的。任何人都可以分享一些见解吗?

/* OLC Inserted */
/*****************************************************************************
Name: spec_string
Purpose: Given a function, return the appropriate name.
Called by: <???>
****************************************************************************/
char *spec_string( SPEC_FUN *fun ) /* OLC */
{
int cmd;

for ( cmd = 0; spec_table[cmd].function[0] != '\0'; cmd++ )
if ( fun == spec_table[cmd].function )
return spec_table[cmd].name;

return 0;
}

spec_table 定义在文件的最顶部,这部分:它只是一个片段,因为整个东西太大了。

const   struct  spec_type    spec_table[] =
{
{ "spec_breath_any", spec_breath_any },
{ "spec_breath_acid", spec_breath_acid },
{ "spec_breath_fire", spec_breath_fire },
{ "spec_breath_frost", spec_breath_frost },
{ "spec_breath_gas", spec_breath_gas },
{ "spec_breath_lightning", spec_breath_lightning },

这是头文件中 spec_type 的声明。

struct spec_type
{
char * name; /* special function name */
SPEC_FUN * function; /* the function */
};

这是 SPEC_FUN 的声明

typedef bool SPEC_FUN   args( ( CHAR_DATA *ch ) );

这是 CHAR_DATA 的声明

    struct  char_data
{
CHAR_DATA * next;
CHAR_DATA * next_in_room;
CHAR_DATA * master;
CHAR_DATA * leader;
CHAR_DATA * fighting;
CHAR_DATA * reply;
CHAR_DATA * pet;
MEM_DATA * memory;
SPEC_FUN * spec_fun;
MOB_INDEX_DATA * pIndexData;
DESCRIPTOR_DATA * desc;
AFFECT_DATA * affected;
NOTE_DATA * pnote;
OBJ_DATA * carrying;
OBJ_DATA * on;
ROOM_INDEX_DATA * in_room;
ROOM_INDEX_DATA * was_in_room;
AREA_DATA * zone;
PC_DATA * pcdata;
GEN_DATA * gen_data;
bool valid;
char * name;
long id;
sh_int version;
char * short_descr;
char * long_descr;
char * description;
char * prompt;
char * prefix;
sh_int group;
sh_int clan;
sh_int sex;
sh_int class;
sh_int race;
sh_int level;
sh_int trust;
int played;
int lines; /* for the pager */
time_t logon;
sh_int timer;
sh_int wait;
sh_int daze;
sh_int hit;
sh_int max_hit;
sh_int mana;
sh_int max_mana;
sh_int move;
sh_int max_move;
long gold;
long silver;
int exp;
long act;
long comm; /* RT added to pad the vector */
long wiznet; /* wiz stuff */
long imm_flags;
long res_flags;
long vuln_flags;
sh_int invis_level;
sh_int incog_level;
long affected_by;
sh_int position;
sh_int practice;
sh_int train;
sh_int carry_weight;
sh_int carry_number;
sh_int saving_throw;
sh_int alignment;
sh_int hitroll;
sh_int damroll;
sh_int armor[4];
sh_int wimpy;
/* stats */
sh_int perm_stat[MAX_STATS];
sh_int mod_stat[MAX_STATS];
/* parts stuff */
long form;
long parts;
sh_int size;
char* material;
/* mobile stuff */
long off_flags;
sh_int damage[3];
sh_int dam_type;
sh_int start_pos;
sh_int default_pos;
};

最佳答案

现在我们有了所需的代码...

struct spec_type
{
char * name; /* special function name */
SPEC_FUN * function; /* the function */
};

我假设 function 是一个函数指针。你不能索引一个函数指针,它没有意义,因为这些指针不指向一个完整的类型。例如,您不能将 sizeof 设为函数类型,那么编译器如何知道如何到达下一个元素?

无论如何都是错的; function[0] 永远不会是 char 类型。您是要检查 name 字段中的空字符吗?那会更有意义。

当你索引一个指针类型时,真正发生的事情是这样的:

p[n] = *(p + n) = *(p incremented by sizeof n bytes)

看起来您只是想获取函数的字符串表示形式。试试这个:

// you should be returning a const char*, not a char*
const char *spec_string( SPEC_FUN *fun ) /* OLC */
{
int cmd;
static const int size = sizeof spec_table / sizeof spec_table[0];
for (cmd = 0; cmd < size; cmd++) {
if (fun == spec_table[cmd].function) {
return spec_table[cmd].name;
}
}

return 0;
}

关于c++ - 我不明白我在此编程代码中遇到的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22233088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com