gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:56:34 26 4
gpt4 key购买 nike

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

我想更新 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 的值。

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

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

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

编辑这是我正在使用的代码。

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);
}

此时我在 outvec[x] 变量和 Sprite 结构中的一些变量中拥有了我需要的所有数据。

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];
}

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

我想做的是不要在我的项目中间放置这么大的代码块,而是将它放在一个函数中。一个函数,例如

submit(sprite* s);

这将采用该 Sprite ,对数据进行矩阵转换,然后将 outvec、颜色、uv 附加到正确位置的 v_buff 上。

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

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

最佳答案

您可以向您的 submit() 函数传递一个数值:

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

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

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

关于c - 每次调用函数时迭代一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com