2011-12-31 14 views
1

基本的には、私の問題は、int型とchar型の文字列変換の符号付きcharです。Signed Char to Int

オープンソースのココアブルートゥースアプリケーションでこのコードを見つけ、それを自分自身に適用しようとしています。

基本的には、変数「RSSI」から符号付きchar出力を取得し、それをintと文字列に変換し、ログに出力する文字列とそれ以上の計算を行うintに変換します。しかし、私が試しても、変換されているようには見えず、署名されたcharをそのままログに出力しようとするとEXEC_BAD_ACCESSを得るだけです。

署名されたcharの典型的な値は、 "-57" \ 307 '"となり、プロセスから直接引用されてからNSLogが保持します。コードは次のとおりです。

- (BOOL)isInRange { 
    BluetoothHCIRSSIValue RSSI = 127; /* Valid Range: -127 to +20 */ 

    if (device) { 
     if (![device isConnected]) { 
      [device openConnection]; 
     } 
     if ([device isConnected]) { 
      RSSI = [device rawRSSI]; 
      [device closeConnection]; 
      NSLog(RSSI); 
     } 
    } 
    return (RSSI >= -60 && RSSI <= 20); 
} 

ありがとうございます。

答えて

4

NSLog()は、最初の引数としてNSStringフォーマット文字列を受け取り、その後、フォーマット文字列内のフォーマット指定子のための変数の(オプション)可変長リスト:

NSLog(@"RSSI: %c", RSSI);

あなたが持っているもの現在(NSLog(RSSI);)は間違っています。それはあなたがこれらのような警告をコンパイラ与えなければなりません:あなたは常に注意を払うが、それらを無視しないで、警告をコンパイラにする必要があり

warning: passing argument 1 of 'NSLog' makes pointer from integer without a cast 
warning: format not a string literal and no format arguments 

。特に、警告が参照する行と同じ行でプログラムがクラッシュした場合は、間違いをしたという赤い旗が表示されます。

NSLog()は、printf()と非常によく似ています。 2つの主な違いは、NSLogの書式文字列がObjective-C文字列リテラル(@"string")であり、標準C文字列("string")ではないこと、オブジェクトの書式指定子が%@であることです。 %@は、印刷するオブジェクトの-descriptionメソッドを呼び出して返された文字列に置き換えられます。

+0

パーフェクト。ありがとう – Josh