将数组参数传递给函数

3
我希望能够直接将参数传递给函数,而不需要像这样创建额外的变量:
```python var = some_value my_function(var) ```
void DrawSprite( float a[2], float b[2] ) { /* */ }

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

可以实现,如果可以的话,怎么做呢?

1
你不需要将一个数组传递给函数,只需要在函数中传递一个指向该数组的指针。话虽如此,你的问题并没有任何意义。 - Alok Save
@Als 不,数组不是指针。数组就是数组。这并不意味着传递原始数组就意味着复制数组。 - wilhelmtell
1
你可能需要考虑为你的点添加一个类(使用C++0x更容易通过引用/右值传递),或者查看初始化列表https://dev59.com/Z2025IYBdhLWcg3w6KOO(请查看第一篇帖子,不太漂亮但很接近)。 - ted
1
@wilhelmtell:我不知道我何时说或暗示array是一个指针。我完全看不出你的评论与我的评论有任何相关性。 - Alok Save
6个回答

4

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

或者是一个内联函数。

像这样的东西会抛出很多语法错误,当我将 '{' 改为 '(' 时,它会说“无法从 'float' 转换为 'float [2]'”。 - Neomex
我发布的第一个代码块可以在MinGW的g++中成功编译。如果你无法解决你添加的语法错误,请发另一个问题并发布你的代码。 - David Grayson
正如其他人在这里写的那样,这是因为我使用的是不支持它的MVC++。(C++0x调用?) - Neomex

3

您可以这样调用:

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

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

这在GCC中可以工作,但在MSVC中无法工作。我认为这不是标准的C++。


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*

1
最好将其声明为使用malloc声明的浮点数组。这将使您能够在完成工作后自由释放数组。由于malloc会在堆中分配内存,因此传递数组有时可能导致模糊的阶段并导致代码崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接