Objective c 从objC方法内部调用函数(float*VeryBigArray,long-SizeofArray)失败,EXC\u BAD\u访问失败

Objective c 从objC方法内部调用函数(float*VeryBigArray,long-SizeofArray)失败,EXC\u BAD\u访问失败,objective-c,cocoa,exc-bad-access,math.h,Objective C,Cocoa,Exc Bad Access,Math.h,好的,我终于找到问题了。它位于C函数(CarbonTuner2)内部,而不是objC方法。我在函数内部创建了一个与文件大小相同的数组,因此如果文件大小很大,它会创建一个非常大的数组。我猜想,当我从那里调用另一个函数时,局部变量被放在堆栈上,从而创建了EXC_BAD_访问。然后我所做的不是使用变量来声明数组的大小,而是直接输入数字。然后代码甚至没有编译。它知道。错误是:数组大小太大。我想连续工作20多个小时不是一个好的XD,但我肯定会研究工具,而不是一步一步地调试来找出这些工具。谢谢你的帮助。这是

好的,我终于找到问题了。它位于C函数(CarbonTuner2)内部,而不是objC方法。我在函数内部创建了一个与文件大小相同的数组,因此如果文件大小很大,它会创建一个非常大的数组。我猜想,当我从那里调用另一个函数时,局部变量被放在堆栈上,从而创建了EXC_BAD_访问。然后我所做的不是使用变量来声明数组的大小,而是直接输入数字。然后代码甚至没有编译。它知道。错误是:数组大小太大。我想连续工作20多个小时不是一个好的XD,但我肯定会研究工具,而不是一步一步地调试来找出这些工具。谢谢你的帮助。这是代码。如果将gFileByteCount除以2,则不会再出现错误:

//  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);
}
//ConverterController.h
#进口
#导入“Converter.h”
@接口转换器控制器:NSObject{
UInt64 gFileByteCount;
}
-(iAction)进程文件:(id)发送方;
void CarbonTuner2(长numSampsToProcess、长fftFrameSize、长osamp);
@结束
//转换器控制器
#包括“ConverterController.h”
@实现转换器控制器
-(iAction)进程文件:(id)发送方{
UInt32 packets=gTotalPacketCount;//分配内存缓冲区以保存从磁盘读取的数据。
gFileByteCount=250000;
长长度=(长)gFileByteCount;
碳素调谐器2(长度,(长)8192/2,(长)4*2);
}
@结束
void CarbonTuner2(长numSampsToProcess、长fftFrameSize、长osamp)
{
长numFrames=numSampsToProcess/fftFrameSize*osamp;
浮动G2DFTworksp[numFrames+2][2*fftFrameSize];
double hello=sin(2.345);
}

值得一提的是,我的Cocoa应用程序中没有包含math.h,但使用数学函数(在C中)没有问题

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


你能在不包含math.h的情况下尝试一下吗?

目标C直接构建在C上,C的基础可以并且可以工作

有关在Objective C模块中使用math.h和部分标准库的示例,请参见:

还有其他例子

在传递变量时需要谨慎;将C变量用于C和标准库调用;不要不小心将C数据类型与目标C数据类型混用。您通常需要在这里进行转换

如果不是这样的话,请考虑张贴所涉及的代码,以及正在接收的错误。


由于Hellman先生的回答,我在没有包含头文件的情况下犯了错误;我更喜欢包含标题。但是,我也倾向于将编译器诊断提高几个级别。

您的崩溃与C和ObjC之间的不兼容无关。 正如之前的海报所说,你不需要包括数学

在gdb下运行代码,并使用backtrace查看崩溃发生的位置

你确定没有向数学函数发送错误的参数吗

例如,这会导致不良访问:
双t=cos(*(双*)空)

首先,您应该将代码添加到问题中,而不是将其作为答案发布,这样人们就可以看到您的问题。其次,这里的内存管理有各种奇怪的问题——gFileByteCount用于调整一组缓冲区的大小,但它被设置为零,并且似乎在任何地方都不会被重新设置

err=AudioFileReadPackets(文件ID, false,返回字节(&B),NULL,0, &数据包(字节*)

因此,在这一点上,您将一个零大小的缓冲区传递给AudioFileReadPackets,它会迅速溢出堆,破坏其他变量的值

弗拉瓦迪奥= malloc(gFileByteCount/(bit/8)*sizeof(fRawAudio))

这是另一个小错误-您需要sizeof(*fRawAudio),因为您试图分配一个浮点数组,而不是浮点指针数组。幸运的是,这些实体大小相同,所以这并不重要


您可能应该从一些您知道有效的示例代码(SpeakHere?)开始,并对其进行修改。我怀疑在你发布的代码中还有其他类似的问题,但我现在没有时间找到它们。至少要使rawAudio缓冲区大小适当,并适当使用AudioFileReadPackets返回的值。

可能只是语言不兼容。我不知道objc和c在一起玩得有多好,你能把代码贴在哪里出错,以及你得到的确切错误吗?你肯定可以在任何地方使用sin()和cos(),我一直都在使用它们。请发布代码和你遇到的错误。我的第一个预感是,你正在使用“包含而非重要”C中的所有东西在Objective-C中起作用——没有例外。将math.h包含进来而不是导入它是非常好的。唯一的区别是#import不会多次导入某些内容,但所有C标准库头都有预处理器保护,即使在使用#include时也能达到相同的效果。我想我的问题是,为什么要在调用sin()或cos()时包含math.h哪些在fp.h中定义良好,并且易于在任何Cocoa应用程序中使用?也许原始海报还需要其他函数,但对于sin()和cos(),我只使用默认值。是的,sin和cos函数似乎可以工作,即使目标c文件中没有包含库,但在c文件中,您将得到“使用隐式函数”警告…回到测试…顺便说一句,即使我使用了一些愚蠢的东西,比如:cos(2.0),我的程序也会出现错误,而且有时如果我不分配返回值,我也不会崩溃。这段代码的一部分看起来是从。。。虽然在这里发布的内容中似乎缺少一些内容(比如设置gTotalPacketCount的位置)。。。我希望开始降低成本