我有这个数组:
static const Layout layouts[] = {
{ "[]=", tile },
{ "><>", NULL },
{ "[M]", monocle },
};
此函数应遍历数组:
int
cyclelayout(const Arg *arg) {
static unsigned short int layout = 0;
if (++layout >= sizeof(layouts)/sizeof(layouts[0])) {
layout = 0;
}
setlayout( &((Arg) {.v = &layouts[layout]}));
}
当它被调用时,它应该设置下一个布局,或者如果它超出数组元素则返回0。但它遍及数组元素,程序崩溃。我弄清楚什么是错的?
Arg和布局:
typedef union {
int i;
unsigned int ui;
float f;
const void *v;
} Arg;
typedef struct {
const char *symbol;
void (*arrange)(Monitor *);
} Layout;
答案 0 :(得分:1)
int // This says to return an int.
cyclelayout(const Arg *arg) {
static unsigned short int layout = 0;
if (++layout >= sizeof(layouts)/sizeof(layouts[0])) {
layout = 0;
}
setlayout( &((Arg) {.v = &layouts[layout]})); // This doesn't look like valid C to me?
return 4; // http://xkcd.com/221/
}
如果你的函数应该“遍历一个数组”,那么它不应该在某个地方有一个循环吗?
循环有各种风格:
for
do-while
while
我没有在你的函数中看到这些关键字的任何,因此我认为它不会“循环”任何事情。
答案 1 :(得分:0)
我的2美分:
setLayout
是else
子句的一部分,它不是一个真正的错误,但你有一些隐含的东西,对任何人都不可读,不是明确的< / LI>
++variable
,它返回引用而不是像增量后运算符variable++
那样的对象副本,它可能不是您想要的“数量”用于比较它还有助于了解Arg
和Layout
的类型。