-1

好的,我终于找到了问题。它在 C 函数(CarbonTuner2)而不是 objC 方法中。我在函数内部创建了一个与文件大小相同的数组,所以如果文件大小很大,它会创建一个非常大的数组,我的猜测是,当我从那里调用另一个函数时,局部变量被放在堆栈上创建了 EXC_BAD_ACCESS。我当时所做的不是使用变量来声明数组的大小,而是直接输入数字。然后代码甚至没有编译。它知道。错误类似于:数组大小太大。我想连续工作 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);
}
4

4 回答 4

3

Objective C 直接建立在 C 之上,而 C 基础可以并且确实有效。

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

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

周围还有其他例子。

传递变量时需要注意一些;将 C 变量用于 C 和标准库调用;不要随意混合 C 数据类型和 Objective C 数据类型。您通常需要在这里进行转换。

如果不是这种情况,请考虑发布所涉及的代码以及您收到的错误。

由于 Hellman 先生的回应,恕我直言,当我没有包含头文件时,我遇到了错误;我更喜欢包含标题。但是,我也倾向于将编译器诊断提高几个档次。

于 2009-07-02T00:08:02.283 回答
3

您的崩溃与 C 和 ObjC 之间的不兼容无关。正如之前的海报所说,您不需要包含 math.h。

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

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

例如,这会导致 BAD_ACCESS: double t = cos(*(double *)NULL);

于 2009-07-02T06:44:19.897 回答
0

对于它的价值,我没有在我的 Cocoa 应用程序中包含 math.h,但使用数学函数(在 C 中)没有问题。

例如,我使用 atan() 并且不会出现编译器错误或运行时错误。

你可以在不包括 math.h 的情况下试试这个吗?

于 2009-07-01T23:26:37.437 回答
0

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

err = AudioFileReadPackets (fileID, false, &bytesReturned, NULL,0, &packets,(Byte *)rawAudio);

因此,此时,您将一个大小为零的缓冲区传递给 AudioFileReadPackets,它会立即溢出堆,破坏谁知道其他变量的值......

fRawAudio = malloc(gFileByteCount/(BITS/8)*sizeof(fRawAudio));

这是另一个小错误 - 你想要 sizeof(*fRawAudio) 在这里,因为你试图分配一个浮点数组,而不是一个浮点指针数组。幸运的是,这些实体的大小相同,所以没关系。

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

于 2009-07-02T20:30:24.913 回答