将数组参数传递给函数

时间:2012-01-12 16:32:14

标签: c++

我想立即将参数传递给函数,而不创建像这样的附加变量:

void DrawSprite( float a[2], float b[2] ) { /* */ }

DrawSprite( (0.0f, 0.0f), (50.0f, 50.0f) );

是否可能,如果可以,该怎么做?

6 个答案:

答案 0 :(得分:4)

您可以执行以下操作(使用g++ -std=c++11编译):

#include <array>

typedef std::array<float, 2> Point2f;

void foo(Point2f v) {
  // do something
}

int main() {
  foo( {1.0, 1.0} );
}

{} - 样式初始化称为初始化列表,它可从C ++ 11开始提供。 std::array也是如此。

供参考:

答案 1 :(得分:3)

是的,你可以这样做。

试试这个:

void DrawSprite( float a[2], float b[2] ) { /* */ }

DrawSprite( (float[2]){1.0, 2.0}, (float[2]){3.0, 4.0} );

在第二行包含数组大小是好的,因为它允许编译器强制执行数组的大小,但你不必这样做。

如果您输入的语法很烦人,可以使用预处理器宏:

#define P(X,Y) (float[]){X, Y}
DrawSprite(P(1.0,2.0), P(3.0,4.0));

或者也许是内联函数。

答案 2 :(得分:3)

您可以这样称呼它:

float x[2] = {0.0F, 0.0F};
float y[2] = {50.0F, 50.0F};
DrawSprite(x, y);

答案 3 :(得分:2)

DrawSprite( (float[2]){1.0, 2.0}, (float[2]){3.0, 4.0} );

这适用于GCC,但在MSVC中不起作用。我相信这不是标准的C ++

答案 4 :(得分:1)

最好将它声明为使用malloc声明的float数组。它将使您能够在工作完成后随意释放阵列。因为malloc内存将在堆中分配。传递数组有时会导致阶段模糊,导致代码崩溃

答案 5 :(得分:1)

这个重要问题的一些答案似乎具有误导性。问题是:将固定大小的数组传递给函数。首先是

  float x[2] = {0.1F, 0.2F};
  float y[2];
  y=x;

error: invalid array assignment(在gcc 4.6.1上;但我们应该在这里说“标准”,而不是特定的编译器功能)。非常正确 - 操作应该完成什么? xy都指向堆栈上的一段内存,因此将float* x复制到y几乎没有意义,因为值不会被复制到最初保留的地方y[0],y[1]

float x[2]唯一明智的演员是float *y。这正是调用函数时发生的情况。您的函数DrawSprite(float a[2], float b[2])实际上被视为DrawSprite(float* a, float* b)(您可以打印typeid(a).name()进行检查)。因此,您可以将x传递给DrawSprite,此x只会转换为float*

第二个问题是初始化。代码(float[2]){1.0, 2.0}确实构造了float的固定大小临时数组(再次可以typeid((float[2]){1.0, 2.0}).name()进行检查,至少在gcc上),但是你可以做的不多使用此数组,因为禁止分配float [2]。您可以将其投放到float*(例如,按z=(float[2]){1.0,2.0};分配,但分配到float* z;,所以它真的是z=(float*)(float[2]){1.0,2.0};),或者您可以将其传递给您的函数,相同,即转换为float*