将 C++ 向量输入到 C 函数中
Input C++ Vector into C function
我有一个 std::vector<float>
包含声音数据。在不复制其数据的情况下,我想将此向量用作 Sonic 库的 sonicChangeFloatSpeed 函数的输入。此方法需要 float*
作为第一个参数并改变输入数组。完成后,第一个参数中的指针将指向结果数据。
data
gives me access to the internal array of a C++ vector and with 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);
但是当我 运行 这个程序时,我在这个位置得到了带有 SIGABRT
的错误 double free or corruption (!prev)
。这种方法有什么问题,如何更恰当地解决这个问题?
正如我提到的,我根本不使用 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);
我有一个 std::vector<float>
包含声音数据。在不复制其数据的情况下,我想将此向量用作 Sonic 库的 sonicChangeFloatSpeed 函数的输入。此方法需要 float*
作为第一个参数并改变输入数组。完成后,第一个参数中的指针将指向结果数据。
data
gives me access to the internal array of a C++ vector and with 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);
但是当我 运行 这个程序时,我在这个位置得到了带有 SIGABRT
的错误 double free or corruption (!prev)
。这种方法有什么问题,如何更恰当地解决这个问题?
正如我提到的,我根本不使用 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);