你好, 我有一个关于以下问题的可能直截了当的问题:
我有一个函数
double afunction(double *myarray)
{
double ret = 1.0;
for(int i = 0; i < 4; i++)
ret *= myarray[i]*myarray[i];
return ret;
}
现在我想修改它,以便传递两个新参数:int index
描述要更改 myarray
的哪个索引,如下所示:myarray[ index ] = *添加;
。这将是以下内容:
double afunction(double *myarray, int index, double *add)
{
myarray[ index ] += *add;
double ret = 1.0;
for(int i = 0; i < 4; i++)
ret *= myarray[i]*myarray[i];
return ret;
}
问题是:我不想修改数组 myrray
并且我不想为创建新数组这是因为内存问题(稍后将在 GPU 上计算,无论如何我无法在内核函数中分配一个全新的数组。
轻松解决这个问题?
谢谢!
编辑
对不起,我打错了。相反,myarray[ index ] = *add;
我的意思是 myarray[ index ] += *add;
编辑2
一个更大的函数的例子,以后可以很容易地扩展到大约 50 个不同的返回案例。所以让 if 语句通过在每个返回案例中添加 *add
来修改特定值 myarray[index]
是非常丑陋的:(
double afunction(double *myarray, int funcIndex, int indexAdd, double *add)
{
myarray[ indexAdd ] += *add;
if(funcIndex >= 1 && funcIndex <= 4)
return myarray[1]*myarray[1]*myarray[2];
switch(funcIndex)
{
case 5:
return sin(myarray[3]) * cos(myarray[1]);
case 6:
double ret = exp(myarray[1]);
for(int i = 1; i < 5; i++)
ret *= (myarray[ i ]-myarray[ 5-i ]);
return ret;
case 7:
double ret = 0.0;
for(int i = 1; i < 10; i++)
ret += myarray[ i ];
return ret;
}
return 0.0;
}
最佳答案
double ret = 1.0;
for(int i = 0; i < 4; i++)
if (index == i)
ret *= (*add) * (*add);
else
ret *= myarray[i]*myarray[i];
或:
double ret = (*add) * (*add);
for(int i = 0; i < 4; i++)
ret *= myarray[i]*myarray[i];
ret /= myarray[index] * myarray[index];
这不是 100% 等价,因为您使用的是 float 。
编辑:好的,看到您编辑了原始问题。一种可能可以接受的替代方法是:
myarray[ indexAdd ] -= *add;
完成其余计算后。同样,不能保证 myarray[indexAdd]
会完全返回到它的旧值。
或者更好的是,将旧值保存在函数的顶部,然后恢复它:
float old = myarray[ indexAdd ];
myarray[ indexAdd ] += *add;
//do work
myarray[ indexAdd ] = old;
关于c++ - 关于C++中函数调用和求值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5991277/