我想制作一个结构体数组,问题是何时每个单个结构体具有不同大小的数组。 我试图建立一个指向数组的指针,但我不明白这一点。
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}引起。
答案 0 :(得分:1)
如果要将初始化元素分配给指针,则需要将其视为复合文字。
示例:
更改
{"mov", 0, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{DIRECT , INDEX , REGISTER} },
到
{"mov", 0, 2, (int []){IMMEDIATE ,DIRECT , INDEX , REGISTER}, (int []){DIRECT , INDEX , REGISTER} },
注意::
(int [])
将具有本地范围并正在访问它们 超出范围是不确定的行为。
答案 1 :(得分:1)
首先,我认为当我不得不编译您的代码时,我曾发出过很多警告,如果我是您,我会尽量避免这些警告,墙警告不是错误,但有些是并且是调试的好方法。
大多数错误是:
incompatible integer to pointer conversion initializing 'int *' with an expression of type '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} },
要知道第一个操作码的示例具有一个DIRECT的sourceAddressingMode,可以使用具有以下内容的'&'运算符:
if (Opcode[0].sourceAddressingMode & DIRECT)
//do stuff
希望会有所帮助,我很高兴知道kiran Biradar会如何考虑此解决方案而不是强制转换。欢呼