我想我在那里缺少简单的东西,但我不明白为什么会收到此错误。

我有一个包含原始数据的数组,我想将其转换为双精度。我也有这个数组的大小:

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,通常应该这样做。

09-10 05:18
查看更多