c - 如何声明从结构到最终数组的指针

标签 c pointers

我想制作一个结构数组,问题是每个结构何时具有不同大小的数组。 我试图创建一个指向数组的指针,但我不明白这一点。

typedef struct {

    char *opcodeName;

    int   opcodeNumber;

    int   howManyOprendsNeeded;

    int   *sourceAddressingMode;

    int   *destAddressingMode;

}Opcode;
typedef enum {

  IMMEDIATE, DIRECT, INDEX, REGISTER

}ADDRESSING_MODE;
static const Opcode opcodes[] = {

        {"mov", 0, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{DIRECT , INDEX , REGISTER}   },
        {"cmp" ,1, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER}, {IMMEDIATE ,DIRECT , INDEX , REGISTER}},
        {"add" ,2, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{DIRECT , INDEX , REGISTER }    },
        {"sub" ,3, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{ DIRECT , INDEX , REGISTER}   },
        {"not" ,4, 1, {-1}                                   , {DIRECT , INDEX , REGISTER}  },
        {"clr" ,5, 1, {-1}                                   , {DIRECT , INDEX , REGISTER} },
        {"lea" ,6, 2, {DIRECT,INDEX}                         , {DIRECT , INDEX , REGISTER}   },
        {"inc" ,7, 1, {-1}                                   , {DIRECT , INDEX , REGISTER} },
        {"dec" ,8, 1, {-1}                                   , {DIRECT , INDEX , REGISTER} },
        {"jmp" ,9, 1, {-1}                                   , {DIRECT ,REGISTER}  },
        {"bne" ,10, 1,{-1}                                   , {DIRECT , REGISTER}  },
        {"red" ,11, 1,{-1}                                   ,  {DIRECT , INDEX , REGISTER}  },
        {"prn" ,12, 1,{-1}                                   , {IMMEDIATE ,DIRECT , INDEX , REGISTER}  },
        {"jsr" ,13, 1,{-1}                                   , {DIRECT , REGISTER}  },
        {"rts" ,14, 0,{-1}                                  , {-1}},
        {"stop",15, 0,{-1}                                  , {-1}},


};

如果我不知道大小是多少,如何从 strcut 声明数组。 我得到的错误: 1.从 'int' 初始化 'int *' 使指针来自整数,而无需由 {IMMEDIATE ,DIRECT , INDEX , REGISTER} 引起的强制转换 [-Wint-conversion]。 2.标量初始值设定项中的多余元素。由 {-1} 引起。

最佳答案

首先,我想当我编译你的代码时我有很多警告,如果我是你我会尽量避免这些,墙警告不是错误,但有些是并且是调试的好方法。 大多数错误是: 使用“int”类型的表达式初始化“int *”的指针转换不兼容

一个对我来说可能很有意义的方法是,正如您事先知道数组的这些大小以这种方式声明它们:

int   sourceAddressingMode[4];

int   destAddressingMode[4];

但不是最优的。

对我来说最好的方法是使用二元运算符:

你的操作码变成:

typedef enum {

IMMEDIATE 0, DIRECT 1, INDEX 2, REGISTER 4

}ADDRESSING_MODE;

您的 sourceAddressingMode 和 destAddressingMode 是 int 类型。

声明很简单,看起来像

{"mov", 0, 2, {IMMEDIATE | DIRECT | INDEX | REGISTER},{DIRECT | INDEX | REGISTER}   },

并且要知道例如您的第一个 opCode 有一个 DIRECT 的 sourceAddressingMode,您可以使用 '&' 运算符,例如:

if (Opcode[0].sourceAddressingMode & DIRECT)
  //do stuff

希望这会有所帮助,我很高兴知道 kiran Biradar 对这个解决方案而不是强制转换的看法。干杯

关于c - 如何声明从结构到最终数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492109/

相关文章:

c - 在程序中进行函数调用后,控制跳转到未指定的内存位置

c - 下面的递归方法如何与 (i++,i) 括起来的参数一起使用?谁能解释一下吗?

c++ - 根据用户输入从模板创建对象

c++ - 令人困惑的 memcpy 行为,如何停止重叠

c - 任意长度的二维数组

c++ - C 中的 limit.h 未确认值

C:临时文件打开后立即删除

C++ char* 错误,程序崩溃

c - 使用结构进行动态内存分配

c++ - 将 char 指针中的字符替换为 memmove