循环遍历数组会超过元素的数量

时间:2013-08-02 19:47:26

标签: c dwm

我有这个数组:

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;

完整计划: dwm-6.0 dwm-6.0-cyclelayout.patch

2 个答案:

答案 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美分:

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

它还有助于了解ArgLayout的类型。