gpt4 book ai didi

objective-c - float 数组在 objective-c 中的末尾给出了不同的数据

转载 作者:行者123 更新时间:2023-11-30 20:01:53 31 4
gpt4 key购买 nike

我遇到了一个奇怪的错误。(至少对我来说)我试图在我应用的 FFT 和音频过滤器中使用 float 组。但 float 组最后给出了不同的数据。

我定义了一个全局指针。我将一个 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
}

}

需要帮助,谢谢

最佳答案

您的 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作为持久存储,让ARC在您再次调用FilterData:或释放ViewController时负责释放它。

关于objective-c - float 数组在 objective-c 中的末尾给出了不同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26282305/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com