(フロート* VeryBigArray、長いSizeofArray)関数内からにObjC方法はEXC_BAD_ACCESSで失敗の中から関数を呼び出します
-
21-08-2019 - |
質問
[OK]を私は最終的に問題を発見しました。これは、C関数(CarbonTuner2)ではないにObjCメソッド内でした。ファイルサイズは、それは本当に大きな配列を大きな作成され、私の推測では、私はそこから別の関数を呼び出したときに、ローカル変数はスタックに置かれたことがあるので、もし私が関数内のファイルサイズと同じサイズの配列を作成しましたEXC_BAD_ACCESSを作成しました。私はその後、やったことは代わりに私が直接番号を入れて、配列のサイズを宣言するために変数を使用するのです。その後、コードはコンパイルさえdidntの。それは知っていました。エラーが好きwassomething:配列のサイズが大きすぎます。私は、行イマイチ良いXDで20 +労働時間しかし、私はこれらのものを把握するためにステップバイステップ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の下で、あなたのコードを実行し、クラッシュがバックトレースを使用することによって起こる場所を参照してください。
あなたは数学関数に悪い引数を送信していないか?
例えば。これはBAD_ACCESSが発生します。 ダブルT = COS(*(ダブル*)NULL);
他のヒント
のObjective CはCの上に直接構築され、およびCの基盤は、作業を行うことができます。
のObjective Cモジュール内からのmath.hと標準ライブラリの一部の使用例については、
http://en.wikibooks.org/wiki/Objective-C_Programming/syntax の
他の例が周りあります。
いくつかの注意が周りに変数を渡すの周りに必要とされています。 Cおよび標準ライブラリ呼び出しのためのC変数を使用します。 incautiously Cのデータ型とObjective Cのデータ型を混在させないでください。あなたは通常、ここでの変換をお勧めします。
それ以外の場合は、、その後、関係コード、およびエラー(s)はあなたが受けているの掲載をご検討ください。
私は、ヘッダファイルが含まれていないとき、そしてによる氏ヘルマンの応答へのすべてに関しては、私はエラーがヒットしました。私は、ヘッダファイルをインクルードすることを好みます。しかし、その後、私はあまりにも、ノッチのカップルを、コンパイラの診断をダイヤルアップする傾向がある。
何が価値があるのは、私は私のCocoaアプリでのmath.hが含まれていませんが、(Cで)数学関数を使用して問題はありません。
は、例えば、私はコンパイルエラーを取得、または時間エラーを実行していないATAN()を使用します。
あなたは全くのmath.hを含むせずにこれを試すことができますか?
まず、あなたは、むしろ答えとして、それを掲示するよりも、あなたの質問にあなたのコードを追加する必要があります。第二に、あなたがここにあなたのメモリ管理との奇妙な問題のすべての種類を持っている - 。gFileByteCountサイズのバッファの束に使用されているが、それはゼロに設定されています、と再設定どこに行くためには表示されません。
ERR = AudioFileReadPackets(ファイルID、 、0、偽、&bytesReturned、NULL &パケット(バイト*)rawAudio);
だから、この時点で、あなたが知っているの価値を破壊、promptyヒープオーバーランAudioFileReadPacketsにゼロサイズのバッファを渡すどのような他の変数...
fRawAudio = malloc関数(gFileByteCount /(ビット/ 8)*はsizeof(fRawAudio));
ここでは別の、マイナーなエラーです - あなたはfloatの配列ではなく、フロートポインタの配列を割り当てるしようとしているので、あなたは、ここではsizeof(* fRawAudio)します。幸いなことに、これらのエンティティは、同じサイズであるので、それは問題ではありません。
あなたはおそらく、あなたが作品を知っているいくつかのサンプルコード(SpeakHere?)で始まり、そしてそれを変更する必要があります。私はyoouが投稿コード内の他の同様の問題がある疑いがあるが、私は今、それらを見つけるための時間がありません。少なくともrawAudioバッファが適切なサイズを取得し、適切AudioFileReadPacketsから返された値を使用します。