我碰到了一个奇怪的错误。(至少对我来说)我试图在我应用的FFT和音频滤波器中使用浮点数组。但是float数组最后会给出不同的数据。
我定义了一个全局指针。我指向一个浮点数组。但是当我尝试在方法范围之外的某个地方使用指针时,441000数据的最后100-150数据大多数为0或其他一些非常大的数字。当我在范围之外的某个地方使用时,我不明白数据如何变化 在范围内我循环并且每个数据都是正确的但是当我尝试在我创建数组的方法范围之外循环时,它在最后给出不同的数据。
@interface ViewController ()
{
float *filteredData;
int theFileLengthInFrames;
}
@end
@implementation ViewController
..
..
-(void)FilterData:(float * ) rawData
{
int count = theFileLengthInFrames;
float filteredRawData[count];
for (int i = 0; i<count; i++)
{
filteredRawData[i] = rawData[i];
printf("%d_%f ",i,filteredRawData[i]);
//I check here to see the data . In here it is normal
}
filteredData = filteredRawData;
}
-(void) CalculateFFT
{
int numSamples = theFileLengthInFrames;
for (int i = 0; i<numSamples; i++)
{
printf("%d_%f ",i,filteredData[i]);
//when I check here to see the data , the last around 100 data are 0.00000 or some big number such as 250399682724883753288597504.000000
}
}
需要帮助谢谢
答案 0 :(得分:2)
您的FilterData:
方法将实例变量filteredData
指向本地数组filteredRawData
。由于filteredRawData
已在堆栈上分配,因此在FilterData:
返回时它将变为无效。然后filteredData
是一个悬空指针,使用它会导致未定义的行为。
解决方案:为filteredData
分配持久存储空间。我会这样做:
@implementation ViewController {
NSMutableData *filteredDataStorage;
float *filteredData;
}
-(void)FilterData:(float * ) rawData {
int count = theFileLengthInFrames;
filteredDataStorage = [NSMutableData dataWithLength:count * sizeof *rawData];
filteredData = (float *)filteredDataStorage.mutableBytes;
for (int i = 0; i<count; i++) {
filteredRaw[i] = rawData[i];
printf("%d_%f ",i,filteredRawData[i]);
//I check here to see the data . In here it is normal
}
}
使用NSMutableData
作为持久存储空间,当您再次致电FilterData:
或取消分配ViewController
时,ARC会负责取消分配。
答案 1 :(得分:2)
filteredData - 浮点指针是一个ivar,它的作用域是你的对象实例。
filteredRawData在方法范围定义。它是位于堆栈上的数组。当filteredRawData超出范围时,内存不再有效。从中读取最多是未定义的,可能会导致访问冲突。您可能希望使用malloc为您的数据动态分配内存,或者为您定义一个全局缓冲区。