我想我在那里缺少简单的东西,但我不明白为什么会收到此错误。
我有一个包含原始数据的数组,我想将其转换为双精度。我也有这个数组的大小:
resWavFile0.resampledSingalData // array with data
resWavFile0.length // size of my array
如果我想显示它,那么它可以工作:
for (int i = 0; i < resWavFile0.length; i++)
{
cout << "\n" << *((int*)resWavFile0.resampledSingalData+i) / (double)0x7fffffff;
}
完全没有崩溃,我的所有值都显示为两倍。但是现在我想将这些值保存在单独的数组中,所以我创建:
double* singnalToProcess0;
而且由于resWavFile0.length可能会更改,因此我需要动态分配数组:
singnalToProcess0 = (double*) malloc(resWavFile0.length * sizeof(double));
另外,我可以将每个内存块的值设置为0:
memset(singnalToProcess0, 0, resWavFile0.length * sizeof(double));
但是现在我想将我的双打插入其中:
for (int i = 0; i < resWavFile0.length; i++)
{
*(singnalToProcess0 + i) = *((int*)resWavFile0.resampledSingalData+i) / (double)0x7fffffff;
}
例如,我的resWavFile0.length值为149077,但我在i = 75074处得到“ 0xC0000005:访问冲突读取位置0x01f6d000)。如果我尝试扩展malloc中数组的大小,例如这样:
singnalToProcess0 = (double*) malloc( 30* resWavFile0.length * sizeof(double));
我仍然在75074处遇到相同的错误。如果我使用其他示例(例如,较短或更长时间),则该错误始终会在迭代中期附近崩溃。静态分配也不起作用:
double* singnalToProcess0 = new double[149077];
也在中间附近崩溃-在i = 75074时...
完整代码:
//// transfer to double
singnalToProcess0 = (double*) malloc(resWavFile0.length * sizeof(double));
memset(singnalToProcess0, 0, resWavFile0.length * sizeof(double));
for (int i = 0; i < resWavFile0.length; i++) {
*(singnalToProcess0 + i) = *((int*)resWavFile0.resampledSingalData+i) / (double)0x7fffffff;
}
我究竟做错了什么?
编辑:
ResampledWavFile结构:
typedef struct ResampledWavFile
{
short* resampledSingalData;
int length;
} ResampledWavFile;
Edit2现在可以工作了:
for (int i = 0; i < resWavFile0.length; i++)
{
singnalToProcess0[i] = resWavFile0.resampledSignalData[i] / (double)0x7fffffff;
}
Edit3:我弄错了,这也是可能的:
singnalToProcess0 = new double[resWavFile0.length];
最佳答案
您可能已经注意到崩溃的索引非常接近数组的一半。这不是巧合,因为您遇到的问题是由于将短裤数组(通常为2个字节长)转换为整数数组(通常为4个字节长)而导致的。像这样重写您的代码,它将起作用:
for (int i = 0; i < resWavFile0.length; i++) {
*(singnalToProcess0 + i) = *((short*)resWavFile0.resampledSingalData+i) / (double)0x7fffffff;
}
或完全删除铸件(删除
(short*)
),因为实际上并不需要。另外,您在注释中提到,不能使用
new
,因为您的数据具有动态大小。这也是不准确的,您可以在C ++中始终使用new
代替malloc
,通常应该这样做。