0

我有这个数组:

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。但它会遍历数组元素并且程序崩溃。我想不通怎么了?

参数和布局:

typedef union {
    int i;
    unsigned int ui;
    float f;
    const void *v;
} Arg;

typedef struct {
    const char *symbol;
    void (*arrange)(Monitor *);
} Layout;

完整程序: dwm-6.0 dwm-6.0-cyclelayout.patch

4

2 回答 2

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

我在你的函数中没有看到任何这些关键字,所以我得出结论它不会“循环”任何东西。

于 2013-08-02T20:02:00.343 回答
0

我的 2 美分:

  • 你有一个隐藏的 if/else 结构,setLayoutelse子句的一部分,这不是一个真正的错误,但你有一些隐含的东西,任何人都看不懂,不是明确的
  • 您正在使用一个预增量运算符++variable,它返回一个引用,而不是像后增量运算符variable++那样返回对象的副本,它可能不是您要在比较中使用的“数量”
  • 考虑到您已声明在函数的签名中返回一个 int,您没有返回任何值

它也将有助于了解什么是类型ArgLayout类型。

于 2013-08-02T20:06:47.817 回答