首页 > 解决方案 > 将 C++ 向量输入到 C 函数中

问题描述

我有一个std::vector<float>包含声音数据。在不复制其数据的情况下,我想将此向量用作Sonic 库的sonicChangeFloatSpeed函数的输入。此方法需要一个float*作为第一个参数并改变输入数组。完成后,第一个参数中的指针将指向结果数据。

data让我可以访问 C++ 向量的内部数组,使用assign,我可以替换向量的内容。因此,我尝试了以下方法:

float* ptr = vec.data();
int num_samples = sonicChangeFloatSpeed(ptr, vec.size(), 1., 1.5, 1., 1., 0, 41000, 1);
vec.assign(ptr, ptr + num_samples);

但是当我运行这个程序时,我在这个位置得到double free or corruption (!prev)了错误。SIGABRT这种方法的问题是什么?如何更恰当地解决这个问题?

标签: c++stdvector

解决方案


正如我所提到的,我完全不使用sonicChangeFloatSpeed,而是使用其中的代码来解决这个问题。在将流中的结果读入之前vec,我会vec.resize(numSamples)

sonicStream stream = sonicCreateStream(16000, 1);
sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetVolume(stream, volume);
sonicSetRate(stream, rate);

auto length = static_cast<int>(vec.size());
sonicWriteFloatToStream(stream, vec.data(), length);
sonicFlushStream(stream);
int numSamples = sonicSamplesAvailable(stream);
vec.resize(numSamples);
sonicReadFloatFromStream(stream, vec.data(), length);

sonicDestroyStream(stream);

推荐阅读