我不明白我在这个编程代码中得到的错误

时间:2014-03-06 18:36:48

标签: c++

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

错误5错误C2109:expression必须是指向完整对象类型的指针

错误是针对spec_table:

fun == spec_table[cmd].function 

这是它给我问题的代码。我完全不知道该去哪里? Btw 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;
};

1 个答案:

答案 0 :(得分:1)

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

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