我有一个浮动矢量
vector<float>nFloats;
我想将它传递给以下函数:
/* This is a non-stream oriented interface to just change the speed of a sound sample */
int sonicChangeFloatSpeed(
float *samples,
int numSamples,
float speed,
float pitch,
float rate,
float volume,
int useChordPitch,
int sampleRate,
int numChannels)
{
sonicStream stream = sonicCreateStream(sampleRate, numChannels);
sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetRate(stream, rate);
sonicSetVolume(stream, volume);
sonicSetChordPitch(stream, useChordPitch);
sonicWriteFloatToStream(stream, samples, numSamples);
sonicFlushStream(stream);
numSamples = sonicSamplesAvailable(stream);
sonicReadFloatFromStream(stream, samples, numSamples);
sonicDestroyStream(stream);
return numSamples;
}
有人可以告诉我如何正确地做到这一点吗?
我的尝试
1) int iRet = sonicChangeFloatSpeed(&nFloats[0], *num, 1, 0.5, 1, 1, 1, 48000, 1);
2) int iRet = sonicChangeFloatSpeed(nFloats[0], *num, 1, 0.5, 1, 1, 1, 48000, 1);
3) int iRet = sonicChangeFloatSpeed(*nFloats, *num, 1, 0.5, 1, 1, 1, 48000, 1);
所有人都不能工作。
我确定已经提出过这样的问题,但我找不到任何确切的副本。
有人可以帮忙吗?
谢谢。
答案 0 :(得分:4)
我认为您的第一个版本应该可以使用,因为向量会为其元素使用连续的存储位置。
int iRet = sonicChangeFloatSpeed(&nFloats[0], nFloats.size(), 1, 0.5, 1, 1, 1, 48000, 1);
在c ++ 11中,您可以使用
float* p = nFloats.data();
int iRet = sonicChangeFloatSpeed(p, nFloats.size(), 1, 0.5, 1, 1, 1, 48000, 1);
答案 1 :(得分:0)
据我所知,您的方法存在问题。
你的功能似乎做了两件事:
1)将一些浮点数写入流
2)从流中读取一些浮点数
在这两种情况下,您都希望浮点数位于vector
。
对于数字1,可以使用vector
,但对于数字2,这是非常有问题的。
您不能将指针传递给向量所持有的数据,然后更改元素数量。原始矢量将保持其原始大小。如果您尝试从流中读取的浮动数超过向量当前持有的浮动数,则行为未定义。