1

有没有办法在不重复代码的情况下按顺序使用这个函数中的每个参数?例如,第一次通过循环我想使用 R,下一次我想使用 L 等等。 valuestruct 的设置顺序与参数相同,因此 button 方法将返回等价bool 我需要根据 int i 的 currentbutton。如果有更好的方法来完成同样的事情,那也没关系。

int valuex=0;

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F) {

        bool value[4] = {true, false, true, false};
        bool currentbutton;

        for (int i=0; i < 12; i++) {
            currentbutton=valuestruct.button(i);

            if(currentbutton) {
                "I want to grab each argument in sequence here"=value[valuex];
                valuex++;
                if(valuex>ARRAYSIZE(value))
                    valuex=0;
            }
        }
    }
4

6 回答 6

4

如果您确实坚持使用此函数原型(并且不遵循此处传递数组或列表的其他建议-更好),则可以使用类似的东西-

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F)
{
   bool* Bools[] = { &R, &L, &D, &U, &T, &S, &B, &A, &Y, &X, &W, &E, &G, &F };

   // *Bools[i] can be used to access the ith element.

   // Print the 4th element.
   std::cout << *Bools[3];

   // Change the value of the 5th.
   *Bools[4] = true;
}

顺便说一句,如果您真的不需要更改传递的值,则不应通过引用传递它们。通过引用传递布尔值只会浪费时间和空间。它还会使这里的代码不那么混乱。

于 2009-04-09T07:33:19.077 回答
3

您是否考虑过使用布尔数组?:) 收藏绝对是要走的路。如果您需要保留元数据以过滤或获取某些值,请考虑使用 Map。

于 2009-04-09T07:14:40.370 回答
3

还是位域?快速和肮脏的版本:

int field = FLAG_R | FLAG_L

void SetValue(int fields) {
    for (int i = 0; i < FLAG_COUNT; i++) {
        if (fields & (1 << i)) {
            // Flag #i is set
        }
    }
}

编辑

顺便说一句,如果您不更改值,则将布尔值作为参考传递是无用的。用于引用的指针可能比保存 bool 本身的类型长。

于 2009-04-09T07:33:05.570 回答
1

您可以使用可变参数支持,因为您有固定数量的参数,您知道要循环多少。IIRC 它实际上并不要求函数具有可变参数。

va_list args;                                                                                                     
va_start(args,R);
// your code here...
va_end();

如果这是离题,请原谅我......自从我主动编写 C 代码以来已经有好几年了。

于 2009-04-09T07:33:00.233 回答
1

我会将其添加到 hexagon 的答案中,但我还不能编辑帖子。

int valuex=0;

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A
             ,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F) 
{
    bool* bools[] = { &R, &L, &D, &U, &T, &S, &B, &A, &Y, &X, &W, &E, &G, &F };
    bool value[4] = {true, false, true, false};
    bool currentbutton;

    for (int i=0; i<12 && i < ARRAYSIZE(bools); i++) {
            currentbutton=valuestruct.button(i);

            if(currentbutton) {
                    *bools[i]=value[valuex];
                    valuex++;
                    if(valuex>ARRAYSIZE(value))
                            valuex=0;
            }
    }
}

虽然我不明白在哪里认为您只会读取布尔值的值,但您可能不会设置所有这些值。

于 2009-04-09T09:02:59.970 回答
0

您可以将参数放入数组并传递数组。根据调用代码是什么,这可能会导致更少的代码。

于 2009-04-09T07:14:54.833 回答