2009-07-01 2 views
-1

Ок, я, наконец, нашел проблему. Он был внутри функции C (CarbonTuner2), а не objC-методом. Я создавал внутри функции массив того же размера, что и размер файла, поэтому, если размер файла был большим, он создал действительно большой массив, и я предполагаю, что когда я вызывал из него другую функцию, локальные переменные помещались в стек, создал EXC_BAD_ACCESS. То, что я сделал тогда, вместо использования переменной, чтобы объявить размер массива, я прямо поставил номер. Тогда код даже не компилировался. он знал. Ошибка была что-то вроде: Размер массива слишком большой. Я думаю, что работающая 20 + часов подряд не хороша XD. Но я определенно буду смотреть на инструменты, кроме пошагового debuggin, чтобы понять их. Спасибо за вашу помощь. Вот код. Если разделить на 2 gFileByteCount вы не получите сообщение об ошибке больше:Вызов функций изнутри функции (float * VeryBigArray, long SizeofArray) из метода objC завершается с ошибкой с EXC_BAD_ACCESS

// 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); 
} 
+0

Возможно, это просто некоторая языковая несовместимость. Я не знаю, как хорошо взаимодействовать и c играть вместе, –

+0

Можете ли вы опубликовать код, где вы получаете ошибки, и точную ошибку, которую вы получите, пожалуйста? Вы можете определенно использовать sin() и cos() в любом месте - я использую их все время. –

+0

Пожалуйста, разместите код и ошибку, которую вы получаете. Моей первой догадкой было бы, что вы используете #include, а не #import –

ответ

3

Ваша авария не имеет ничего общего с несовместимостью между C и ObjC. И, как говорили предыдущие плакаты, вам не нужно включать math.h.

Запустите свой код под gdb и посмотрите, где произошел сбой, используя обратную трассировку.

Вы уверены, что не отправляете плохие аргументы в математические функции?

E.g. это вызывает BAD_ACCESS: double t = cos (* (double *) NULL);

0

Для чего это стоит, я не включаю math.h в моем какао приложении, но не имеет никаких проблем с использованием математических функций (в C).

Например, я использую atan() и не получаю ошибки компилятора или ошибки времени выполнения.

Можете ли вы попробовать это без включения math.h?

3

Цель C строится непосредственно на C, а C-основы могут и должны работать.

В качестве примера использования math.h и части стандартной библиотеки из внутри модуля Objective C, см:

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

Есть и другие примеры вокруг.

Некоторая осторожность необходима для передачи переменных вокруг; используйте переменные C для вызовов C и стандартной библиотеки; не смешивайте типы данных C и типы данных Objective C неосторожно. Обычно вам требуется конверсия.

Если это не так, пожалуйста, подумайте о размещении входящего кода и ошибках (-ях), которые вы получаете.

И со всем уважением, вызванным ответом г-на Хелмана, я попал в ошибки, когда у меня нет файлов заголовков; Я предпочитаю включать заголовки. Но тогда я, как правило, набираю диагностику компилятора на пару выемок.

+0

Я предполагаю, что мой вопрос будет заключаться в том, почему вообще включить math.h для вызовов sin() или cos(), которые хорошо определены в fp.h и легко могут использоваться в любом приложении Cocoa? Возможно, есть и другие функции, которые нужны оригинальному плакату, но для sin() и cos() я бы просто пошел по умолчанию. –

+0

Да, функции sin и cos действительно работают, несмотря на то, что библиотеки не включены в объектный файл c, но в ac-файле вы получите предупреждения о «неявной функции». Вернуться к тестированию ... и, кстати, моя программа получила ошибка, даже когда я использую что-то глупое как: cos (2.0), а также иногда я не получаю сбоев, когда я не назначу возвращаемое значение. –

+0

Части этого кода выглядят приобретенным из ... http://developer.apple.com/samplecode/PlayAudioFileLite/listing1.html ... хотя куски (например, где установлен gTotalPacketCount), кажется, отсутствует из того, что было опубликовано здесь ... Я хотел бы начать уменьшать код C и Objective C до тех пор, пока ошибка не будет обнаружена или не будет работать через код в отладчике; Сбой кучи и стека (переполнение буфера, неправильные указатели, неинициализированные или неправильные значения) могут проявляться в некоторых интересных направлениях. Это независимо от того, присутствует ли файл заголовка. Или нет. –

0

Во-первых, вы должны добавить свой код на свой вопрос, вместо того чтобы публиковать его как ответ, чтобы люди могли видеть, о чем вы спрашиваете. Во-вторых, здесь у вас есть всевозможные странные проблемы с вашим управлением памятью. GFileByteCount используется для настройки буфера буферов, но он установлен на ноль и, похоже, не может быть перенастроен нигде.

ERR = AudioFileReadPackets (FILEID, ложь, & bytesReturned, NULL, 0, & пакетов, (байт *) rawAudio);

Таким образом, на данный момент, вы передаете нулевого размера буфера для AudioFileReadPackets, который prompty перерасход кучу, развращает значение, кто знает, что другие переменные ...

fRawAudio = таНос (gFileByteCount/(бит/8) * SizeOf (fRawAudio));

Вот еще одна небольшая ошибка. Здесь вы хотите sizeof (* fRawAudio), поскольку вы пытаетесь выделить массив поплавков, а не массив указателей с плавающей запятой. К счастью, эти объекты имеют одинаковый размер, поэтому это не имеет значения.

Возможно, вам следует начать с кода примера, который, как вы знаете, работает (SpeakHere?) И изменить его. Я подозреваю, что есть другие подобные проблемы в коде yoou, но у меня нет времени, чтобы найти их прямо сейчас. По крайней мере, получите буфер rawAudio соответствующим образом и используйте значения, возвращаемые из AudioFileReadPackets соответствующим образом.

+0

Думаю, вам не хватает моей точки. Я обращаюсь к вашей проблеме. Я бы поставил почти любую сумму денег, которую вы перехватываете буфер где-то в своем коде, и это причина вашей проблемы. Поскольку вы не разместили весь код, сообщая вам, что ваши звуковые буферы, скорее всего, неправильный размер в какой-то момент - это все, что вы можете сделать, чтобы помочь вам. –

+0

Хорошо, вот что я собираюсь делать ... теперь, когда я коснусь проблемы, я попытаюсь воссоздать ее с помощью более простого приложения, чтобы показать, что происходит (я мог бы в процессе найти свою ошибку).Знаете ли вы, если что-то особенное происходит со стеком, когда вы вызываете функцию C из функции C из функции obj-C? (проблема возникает, даже не касаясь буфера ... если указанные данные меньше определенной величины, я больше не получаю проблему –

+0

Методы Objective-C на самом деле являются просто функциями C с дополнительным скрытым параметром, который установлен для «я». Поэтому нет причин, по которым вызов вашего кода из метода Objective-C будет иным, чем вызов его из другой функции C. Функция objc_msgSend в Objective-C не создает стек стека, так что это немного странно, но не связано с вашей проблемой. Я думаю, что воссоздание проблемы с меньшим образцом кода - это путь. –

 Смежные вопросы

  • Нет связанных вопросов^_^