来自于函数调用函数从内objC方法失败EXC_BAD_ACCESS(浮动* VeryBigArray,长SizeofArray)

StackOverflow https://stackoverflow.com/questions/1071521

确定我终于发现了问题。这是C函数(CarbonTuner2)不是objC方法内。我创建函数内同样大小的文件大小的数组,所以如果文件大小是大它创造了一个非常大的阵列和我的猜测是,当我打电话从那里另一个函数,局部变量放在堆栈上创建EXC_BAD_ACCESS。我所做的,然后是不是使用变量来申报我直接把编号的数组的大小。然后代码didnt甚至编译。它知道。 wassomething喜欢的错误:数组大小太大。我猜工作20小时以上连续心不是很好的XD但我definitly会看起来比成一步步debuggin推测这些的出其他工具。谢谢你的帮助。下面是代码。如果除以2 gFileByteCount你没有得到的错误了:

//  ConverterController.h

# import <Cocoa/Cocoa.h>
# import "Converter.h"

@interface ConverterController : NSObject {

    UInt64 gFileByteCount ;
}

-(IBAction)ProcessFile:(id)sender;
void CarbonTuner2(long numSampsToProcess, long fftFrameSize, long osamp);

@end

//  ConverterController.m
# include "ConverterController.h"

@implementation ConverterController

-(IBAction)ProcessFile:(id)sender{

    UInt32 packets = gTotalPacketCount;//alloc a buffer of memory to hold the data read from disk.

    gFileByteCount=250000;
    long LENGTH=(long)gFileByteCount;
    CarbonTuner2(LENGTH,(long)8192/2, (long)4*2);
}
@end

void CarbonTuner2(long numSampsToProcess, long fftFrameSize, long osamp)
{
    long numFrames = numSampsToProcess / fftFrameSize * osamp;
    float g2DFFTworksp[numFrames+2][2 * fftFrameSize];
    double hello=sin(2.345);
}
有帮助吗?

解决方案

您崩溃无关C和ObjC之间不兼容。 正如以前的海报说,你并不需要包括math.h中。

运行gdb下代码,并看到在崩溃发生通过使用回溯。

您确定你不是发送坏参数的数学函数?

E.g。这将导致BAD_ACCESS:     双T = COS(*(双*)NULL);

其他提示

目标C是直接建立在C,以及C基础可以和做的工作。

有关使用文件math.h和标准库的部分从目标C模块内的一个例子,请参见:

http://en.wikibooks.org/wiki/Objective-C_Programming/syntax

有其他示例周围。

一些护理需要围绕周围传递变量;使用C和标准库调用的C变量;不要一不小心混合C数据类型和Objective C的数据类型。通常你会想在这里转换。

如果不是的话,那么请考虑在发布涉及的代码和错误()你正在接受。

和所有方面由于赫尔曼先生的回应,我已经打了错误,当我没有不包含头文件;我宁愿包括头。但后来,我倾向于拨打编译器诊断了几个档次了。

有关它的价值,我不包括在我的可可应用程序文件math.h,但有使用数学函数(C语言)没有问题。

例如,我使用ATAN(),但没有得到编译器错误,或运行时错误。

你可以试试这个,而不包括math.h中呢?

首先,你应该你的代码添加到你的问题,而不是发布它作为一个答案,所以人们可以看到你问什么。其次,你有各种各样的与你的内存管理这里怪异问题 - gFileByteCount用于尺寸一堆缓冲区,但它设置为零,并没有出现得到重新设置任何地方

  

ERR = AudioFileReadPackets(FILEID,   假的,与bytesReturned,NULL,0,   &的数据包,(字节*)原始音频);

所以,在这一点上,你传递一个零大小的缓冲区AudioFileReadPackets,这prompty超支堆,破坏谁知道价值是什么其他变量...

  

fRawAudio =   的malloc(gFileByteCount /(比特/ 8)*的sizeof(fRawAudio));

下面是另一个小错误 - 你想要的sizeof(* fRawAudio)在这里,因为你要分配的float数组,而不是浮动指针数组。幸运的是,这些实体具有相同的尺寸,因此它并不重要。

您或许应该,你知道作品的一些示例代码开始(SpeakHere?),并对其进行修改。我怀疑有在yoou发布的代码其他类似的问题,但我没有时间去寻找他们现在。至少得到缓冲原始音频适当大小的,并使用从AudioFileReadPackets返回的值适当。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top