在C++中将浮点数组的参数填充为 float*
Populating argument of float array as float* in C++
>我有这样的函数:
bool funcFloats(float* output) {
output = new float[100];
populateArray((float *) &(*firstArray)[0], output); //First array is an std::vector<uint8_t>
for(int i=0; i<100; i++) {
std::cout<<output[i]<<std::endl;
}
}
template <typename A, typename B> void populateArray(A *in, B *out)
{
using namespace std;
for (unsigned y = 0; y < 100; y++)
{
out[y] = in[y];
}
}
我用这个来称呼它:
float array[100];
obj.funcFloats(array);
for(int i=0; i<100; i++) {
std::cout<<array[i]<<std::endl;
}
在 funcFloats 末尾打印的内容是正确的,但在调用函数后打印的内容则不正确。这是为什么呢?
这是因为你在函数内部分配了output
,使得传递到funcFloat
数组完全无用。当funcFloat
退出时,它保持未初始化状态,从而导致输出不正确。
从funcFloat
中删除要output
的分配以解决此问题:
bool funcFloats(float* output) {
output = new float[100]; // <<== Remove this line
populateArray((float *) &(*firstArray)[0], output);
for(int i=0; i<100; i++) {
std::cout<<output[i]<<std::endl;
}
}
虽然这将解决眼前的问题,但代码将保持不C++惯用。您应该尽可能远离"原始"C 样式数组,改用向量。这修复了多个问题,例如您看到的问题,但也修复了数组边界不匹配的可能性(将 1000 个项目写入 100 个项目的数组(、可能的内存泄漏以及无法动态增长数组。
bool funcFloats(float* output) { output = new float[100];
正如在另一个答案中已经指出的,您在上述output
作业中遇到了问题。使用new[]
动态分配float
数组,将指向第一个数组元素的指针分配给output
变量,这样做,作为参数传递的原始output
数组在赋值后丢失。
另请注意,C++没有垃圾回收器,因此当您使用new[]
显式分配内存时,您应该具有使用delete[]
释放该内存的代码。
更好的方法(这将使您的代码更简单(是使用std::vector<float>
而不是原始的 C 样式数组。这个标准的向量容器将自动释放自己的内存(所以你不必注意代码显式地这样做(。而且,如果你想向函数传递一个输入/输出数组参数,你可以传递一个(非常量(引用给std::vector
,例如:
bool funcFloats(std::vector<float> & output) {
...
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 通过跳过可选参数来填充参数包
- 已将 QSet 填充为可选参数
- 在C++中将浮点数组的参数填充为 float*
- 如何使填充数组的函数发送到函数?而不是其参数中的数组
- 部分填充的模板作为模板模板的参数
- 如何遍历可变参数模板以填充 POD 数组
- 使用typedefs自动填充模板参数
- 如何基于构造函数参数填充常量成员数组
- 在可变参数模板中使用填充程序的更简洁方法
- 是fill_n,并填充相同的函数,但具有不同的参数重载
- 我们是否可以创建一个类似scanf的函数,当所有参数都填充时返回true,否则返回false,而不循环遍历所有变量?
- 为零填充宽度和精度与要打印的整型参数相同
- 如何用可变参数模板参数中的 typeid 填充向量