2010-12-03 8 views
1

私はいくつかの天文学の計算を行うための関数群を持つヘッダを構築していますが、この2つの関数を除いて、Debugging terminated.メッセージNSLogステートメントは正しい答えでコンソールに印刷しますが、クラッシュします。何か案は?これらの2つのObjective-C関数はメッセージなしでクラッシュします

float calcTimeJulianCent(float julianDate) { 
NSLog(@" -calcTimeJulianCent"); 
float tCentury = (julianDate - 2451545.0)/36525.0; 
NSLog(@" -calculation complete, tCentury = %1.4f", tCentury); 
return tCentury; 
} 

float calcJDFromJulianCent(float tCentury) { 
NSLog(@" -calcJDFromJulianCent"); 
float julianDate = tCentury * 36525.0 + 2451545.0; 
NSLog(@" -calculation complete, tCentury = %1.4f", julianDate); 
return julianDate; 
} 

そして、ここでの関数を呼び出す方法です:

- (IBAction)doMath { 
NSLog(@"-%@:%s called", [self class], _cmd); 

    // other calls that work 

float julianCentury = calcTimeJulianCent(julianDay); 
NSLog(@" -calcTimeJulianCent called: %@", julianCentury); 

float backToJulianDate = calcJDFromJulianCent(0.1092); 
NSLog(@" -calcJDFromJulianCent called: %@", backToJulianDate); 

    // more calls that work 
} 

EDIT:回答 - 愚かな間違い。関数はfloatsを返し、文字列用のNSLogでは%@を使用しました。あなたは、Xcodeがそれを突破する以上のことをすることができると思います。

+2

デバッガでそれをステップ実行した場合、どのような行クラッシュがで起こるのでしょうか? –

+0

あなたはどのプラットフォームにいますか? GDBを使う? 「デバッグが終了しました」または「デバッガが停止しました」と表示されますか?返品ステータスは印刷されていますか?エラーがこれらの機能の外にあるコードにある可能性がありますか?あなたの機能はまったく復帰しますか? –

+0

これは興味深いことです。私は、これらの関数を呼び出すメソッドにブレークポイントを設定し、それからステップを実行しました。私がそれをするまで、私はすべてのデバッグ情報を得ていませんでした。これで、関数が返ってからクラッシュすることがわかりました。呼び出しがどのように見えるかを表示するための質問の更新... – Steve

答えて

2

あなたの編集を見ました。その理由は、NSLogオブジェクト(つまりメモリの場所)へのポインタを見つけようとしているからです。つまり、%@という形式指定子が見つかったときです。明らかに、浮動小数点数は有効なメモリアドレスではないため、プログラムがクラッシュします。 NSLogは文字列と引数の可変リストを取るため、Xcodeはそれを修正しません。しかし、Cでは、varargsの型を指定することはできません。したがって、一般的な場合には、どんな型の引数をとるかはわかりません。NSLogであるべきです。

(gccはあなたがprintfを呼び出すときにチェックするいくつかのフォーマット指定子を提供しないが、同じことがNSLogで発生しません。)

+0

洞察に感謝します!問題を解決するのはうれしいですが、なぜそれが解決されたのかを知ることはさらに良いでしょう! – Steve

関連する問題