每次调用函数时迭代一个值

时间:2016-01-18 17:14:51

标签: c arrays algorithm for-loop static

我怎样才能实现这样的目标?我有这个功能在另一个经常调用的函数中提交。

我想更新idx变量,使其增加1作为动态数组的偏移量。

int idx = 0;
float* abc;  //initialized to 18 floats
float* a, *b, *c; //each initialized to 3 floating values

//set some variable that's updated once submit is called to know where to offset the memory
void submit() {
    int local_idx = idx;
    abc[local_idx++] = a[0]; //first call to submit(), local idx starts at 0
    abc[local_idx++] = b[0];
    abc[local_idx++] = c[0];

    abc[local_idx++] = a[1];
    abc[local_idx++] = b[1];
    abc[local_idx++] = c[1];

    abc[local_idx++] = a[2];
    abc[local_idx++] = b[2];
    abc[local_idx++] = c[2];  //first call to submit(), local idx ends at 8
}


void update() {
    //do work   //fill 3 new values into *a, *b, *c
    submit();   //here idx = 0
    //do work   //fill 3 new values into *a, *b, *c
    submit();   //here idx = 1
    //do work   //fill 3 new values into *a, *b, *c
    submit();   // here idx = 2 etc....
}

每当我拨打submit()时,idx值都会增加1。

所以在第一次提交idx = 0, local_idx = 0时,数组的值为0-5。

然后在下一次调用全局idx = 5local_idx = 5时填充元素6,12。我已尝试将local_idx的值复制回全局{{ 1}}值但只是使数字运行到无穷大。

如何编写控制语句以控制此数据流?我想去

idx

修改 这是我正在使用的代码。

submit() //0  fills in elements 0-5
submit() //1  fills in elements 6-12
submit() //2  fills in elements 13-19
//.....

此时我拥有outvec [x]变量中所需的所有数据以及精灵结构中的一些变量。

for (int i = 0; i < count; i++) {
    //--------------- start update vertex data ---------------------

    sp = sprites[i];
    vmathT3MakeIdentity(&rotation);
    vmathT3MakeIdentity(&scale);
    vmathT3MakeIdentity(&translation);
    vmathT3MakeIdentity(&ttmp);

    vmathT3MakeScale(&scal, &sp->scale);
    vmathT3MakeRotationZYX(&rotation, &sp->angle);
    vmathT3MakeTranslation(&translation, &sp->pos);
    vmathT3Mul(&tmp, &translation, &scale);
    vmathT3Mul(&tmp, &tmp, &rotation);

    vmathM4MakeFromT3(&sprites[i]->model_mat, &tmp);

    cg_quad_getquadverts(&sp->in_vec30, &sp->invec31, &sp->invec32, &sp->invec33, sp->quad);

    vmathM4MulV4(&sp->outvec0, &sp->m_mat, &sp->invec30);
    vmathM4MulV4(&sp->outvec1, &sp->m_mat, &sp->invec31);
    vmathM4MulV4(&sp->outvec2, &sp->m_mat, &sp->invec32);
    vmathM4MulV4(&sp->outvec3, &sp->m_mat, &sp->invec33);
}

这是我编写的代码,我目前正在使用它并且它可以工作,但我需要将它抽象出来。手动更改这些变量会导致错误。

我想要做的不是在我的项目中间放置这么多代码,而是把它放在一个函数中。像

这样的功能
for (int i = 0; i < count; i++) {
    sp = sprites[i];
    idx = 0;
    // v0
    v_buff[idx++] = sp->outvec30.x;
    v_buff[idx++] = sp->outvec31.y;
    v_buff[idx++] = sp->outvec32.z;

    v_buff[idx++] = sp->quad->colors[0];
    v_buff[idx++] = sp->quad->colors[1];
    v_buff[idx++] = sp->quad->colors[2];
    v_buff[idx++] = sp->quad->colors[3];

    v_buff[idx++] = sp->quad->tex_coords[0];
    v_buff[idx++] = sp->quad->tex_coords[1];

    // v1
    v_buff[idx++] = sp->outvec31.x;
    v_buff[idx++] = sp->outvec31.y;
    v_buff[idx++] = sp->outvec31.z;

    v_buff[idx++] = sp->quad->colors[4];
    v_buff[idx++] = sp->quad->colors[5];
    v_buff[idx++] = sp->quad->colors[6];
    v_buff[idx++] = sp->quad->colors[7];

    v_buff[idx++] = sp->quad->tex_coords[2];
    v_buff[idx++] = sp->quad->tex_coords[3];

    // v2
    v_buff[idx++] = sp->outvec32.x;
    v_buff[idx++] = sp->outvec32.y;
    v_buff[idx++] = sp->outvec32.z;

    v_buff[idx++] = sp->quad->colors[8];
    v_buff[idx++] = sp->quad->colors[9];
    v_buff[idx++] = sp->quad->colors[10];
    v_buff[idx++] = sp->quad->colors[11];

    v_buff[idx++] = sp->quad->tex_coords[4];
    v_buff[idx++] = sp->quad->tex_coords[5];

    // v3
    v_buff[idx++] = sp->outvec33.x;
    v_buff[idx++] = sp->outvec33.y;
    v_buff[idx++] = sp->outvec33.z;

    v_buff[idx++] = sp->quad->colors[12];
    v_buff[idx++] = sp->quad->colors[13];
    v_buff[idx++] = sp->quad->colors[14];
    v_buff[idx++] = sp->quad->colors[15];

    v_buff[idx++] = sp->quad->tex_coords[6];
    v_buff[idx++] = sp->quad->tex_coords[7];
}

将获取该精灵,对数据执行矩阵变换,然后将outvec,color,uv附加到正确位置的v_buff上。

但到目前为止,我将其置于函数内的尝试都失败了。它不是非常复杂的代码,但我只是没有看到如何将这个函数抽象出来。

是否有人可以建议我如何将上面的代码放在一个函数中,以便我可以在每个循环中多次调用它而不会完全颠覆已经存储在v_buff中的数据?

3 个答案:

答案 0 :(得分:2)

您可以将submit()函数传递给值:

submit(0)
submit(5)
submit(6)

并在您的函数submit()中,将值指定给local_idx;您可以使用for循环或某个循环,但这是可选的。

另一方面,您也可以使用idx的静态值;你需要在函数中使用一个静态变量,并且值将在调用之间保存。

答案 1 :(得分:0)

我相信,您需要将local_idx定义为static变量。

或者,为了更好,完全摆脱local_idx,将idx本身设为static,并使用与索引相同的内容。

在那种情况下,

  • 它会在连续调用函数之间保持它的值。 (保留 它在整个生命周期中的最后存储值,即整个执行,见下文
  • 只会初始化一次。

详细说明static存储类说明符,引用C11标准,章节§6.2.4,

  

在没有存储类说明符的情况下声明其标识符的对象   _Thread_local,以及外部或内部链接或存储类   说明符static具有静态存储持续时间。它的一生就是整个执行   程序及其存储的值仅在程序启动之前初始化一次。

也就是说,您需要确保用于abc的索引值有效,以避免undefined behavior超出范围。

答案 2 :(得分:0)

使变量成为静态。例如

void submit() {
    static int idx;
    int local_idx = idx++;

    if ( idx > SomePredefinedValue ) idx = 0;

    abc[local_idx++] = a[0]; //first call to submit(), local idx starts at 0
    abc[local_idx++] = b[0];
    abc[local_idx++] = c[0];

    abc[local_idx++] = a[1];
    abc[local_idx++] = b[1];
    abc[local_idx++] = c[1];

    abc[local_idx++] = a[2];
    abc[local_idx++] = b[2];
    abc[local_idx++] = c[2];  //first call to submit(), local idx ends at 8
}