2009-05-06 4 views
0

私はランダムな整数の平均絶対偏差を計算するツール(ちょうど学習プロジェクトとして)を完成させました。Cocoa/Obj-Cプロジェクトで外部関数を宣言する

"findMeanAbsoluteDeviation()"という関数に計算を移動しました。NSMumberArrayのNSNumberオブジェクトを受け取り、計算を実行します。いずれかの方法。だから私は他のコードと同じ ".m"ファイルで宣言すると、これはすべてうまく動作します。

#import <Foundation/Foundation.h> 

float findMeanAbsoluteDeviation(NSMutableArray * array); 

int main (int argc, const char * argv[]) { 
    ...generate random integers, execute function... 
    meanAbsoluteDeviation = findMeanAbsoluteDeviation(numArray); 
} 

float findMeanAbsoluteDeviation(NSMutableArray * array) { 
    ...mean absolute deviation maths... 

}

、それが正常に動作します。今、私は外部ファイルに関数を移動したいと思います。 "mad"という名前のNSObjectのサブクラス を作成しました。私は怒っ「mad.m」に関数を移動し、私は読んで、その後

-(float)findMeanAbsoluteDeviation:(NSMutableArray *)array { 
    ...code... 
} 

のように、私の「mad.h」ファイルに見えるように宣言を再フォーマットされました。

@interface mad : NSObject { 

} 

    - (float)findMeanAbsoluteDeviation:(NSMutableArray *)array; 

@end 

すべてが素晴らしいようです。右?私がしなければならないすべては私の「main.m」ファイルの先頭に...

#import "mad.m" 

を追加し、私は通常どおり機能を使用しています。まあ、それは正しくコンパイルされていないようです。

ld: duplicate symbol .objc_class_name_mad in ------standardDeviation.build/Debug/standardDeviation.build/Objects-normal/i386/mad.o and ------standardDeviation.build/Debug/standardDeviation.build/Objects-normal/i386/standardDeviation.o 

は "------" の長さのため

Command /Developer/usr/bin/gcc-4.0 failed with error code 1 

のための任意のアイデアを省略していますか?ご協力いただきありがとうございます!

答えて

3

あなたが#import "mad.h"ではなく#import "mad.m"でないと、クラスの実装が2回評価されるため、表示されるエラーが発生します。

数文体のポイント:

  • あなたは何のために、オブジェクトのインスタンス変数を使用していない場合は、あなたは通常、クラスメソッド(+)ではないインスタンスメソッドを書きます( - )。
  • Objective-CヘッダーファイルのC関数のプロトタイプを宣言するのに問題はありません。いくつかの例については、NSGeometry.hを参照してください。
  • 関数またはメソッドで配列を変更しない場合は、可変配列パラメータを使用しないでください。
  • クラス、メソッド、および関数に標準のCocoa命名規則を使用することを検討してください。例えば

@interface MEMeanAbsoluteDeviation : NSObject { 
} 
+ (float)meanAbsoluteDeviation:(NSArray *)array; 

または単に:

+0

float MEMeanAbsoluteDeviation(NSArray *array); 
[OK]をクリックします。私はスタックオーバーフローを愛しています。どうもありがとうございます。私は "#import"ステートメントを変更しました。 次に、クラスメソッドで(http://www.otierney.net/objective-c.html)を読んで、+と - の違いは何か分かりました。どうもありがとうございます。私は永遠に感謝しています:) 私の関数がNSArrayを受け入れるならば、それはNSArrayのサブクラスなのでNSMutableArrayを渡すことができますか?NSAray * copyArray = [NSArray initWithArray:myMutableArray]; ?私はかなり前者であると確信しています。 –

+0

はい、メソッドや関数が特定のクラスのオブジェクトを受け取った場合、サブクラスのオブジェクトも取得できます。変更可能なオブジェクト(配列、辞書など)を不変のものからその逆にする必要がある場合、使用するメソッドは "-copy"(mutable => immutable)と "-mutableCopy"(不変=>変更可能)。 –

関連する問題