例如,我有下一个代码,并想返回sensorData结构数组。
struct SensorData[] process_data(struct SensorData sensorData[]){
sensorData[0].LED_1 = 1+1;
sensorData[0].LED_2 = 2+2;
return sensorData; }
对我来说,它甚至不编译。
答案 0 :(得分:3)
它不会编译,因为C不允许返回数组,但是它将允许您返回指针。
答案 1 :(得分:2)
如果在将数组复制到堆栈上时死定,以便可以将其作为返回值复制回去,则可以使用结构执行类似的操作,但效率极低,而且似乎毫无意义。
struct {
struct SensorData[100];
} sensorArray;
struct SensorArray process_data(struct SensorData sensorData[]) {
sensorArray array;
array.sensorData[0].LED_1 = 1+1;
array.sensorData[0].LED_2 = 2+2;
return array;
}
main() {
sensorArray copy;
copy = process_data(copy.sensorData);
}
答案 2 :(得分:1)
首先,您已经声明了一个未指定的数组类型(因为括号之间没有指定元素数量)作为函数的返回值。这适用于参数(因为编译器将数组引用转换为指针,并且实际的声明确实为struct SensorData *
。这可以使用必须完全指定的参数来完成,但不能使用返回值来完成。< / p>
第二,您不能返回数组。数组标识符本身并不用C命名数组,而仅仅是对第一个元素的引用(指针)。因此,无法像使用struct
那样返回数组,在这种情况下,使用变量名时,您将引用整个变量。
从这个意义上讲,您可以这样做:
struct SensorData {
double values[100]; /* you have to be complete here */
};
然后:
struct SensorData myFunction(struct SensorData data1) {
struct SensorData value_to_return;
...
return value_to_return;
}
但是在执行此操作之前,您必须仔细考虑一下,因为您正在通过参数data1
中的值传递整个结构,因此,每次调用{{ 1}}来存储要传递的变量的副本(记住所有变量都由值调用),并且必须保留空间(通常在线程堆栈上)用于返回值,该空间将由函数填充,然后复制回最终目的地。您将受到严重的效率损失。
在两个myFunction
对象之间进行分配时,如果您说了话,则会同时分配两个变量
struct
及以后
struct SensorData a, b;
是正确的... a = b;
变量的所有字段都用变量a
中的相同字段更新。但这不是数组。
b
甚至是相同的类型(如上所示)
struct SensorData a[100], b[100];
因为a = b; /* this is incorrect */
不是可分配的对象(在C语言中为左值)...它只是指定为指向第一个数组元素的指针的数组的地址。
问题在于,您可以执行所需的操作,只需将数组包装在结构中,然后就可以像处理变量在单位中一样管理变量。
a
那么你可以说
struct SensorDataWrapper {
struct SensorData array[100];
} a, b;
,两个结构都将从a = b;
复制到b
,不会有任何问题。您可以按值传递它们(不推荐),并可以将它们作为函数的返回值返回(也不推荐)
C中的类型是静态的,这意味着编译器严格在编译时定义它们。这使得无法开发在运行时更改的类型,因此您必须使用动态结构。将指针以及指针与数组之间的兼容性传递给函数是将可变长度数组传递给函数的唯一方法,并且当您将参数声明为具有未指定元素数的数组指针时,声明了另一种对象(实际上是指针,而不是数组)