0

64 ビット モードで実行しようとしたときに発生する正確なエラーは、Format specifies type 'int' but the argument has type 'long'.

%dに変更することでこのエラーを修正できます%ldが、アプリを 32 ビット (通常) モードで実行すると、次のようなエラーが表示されます。Format specifies type 'long' but the argument has type 'int'

64 ビットと 32 ビットの両方をどのように説明できますか? 作成する if(条件) はありますか?

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
    // Handle the selection

    if(pickerView.tag == 1){
        start = row+1;
        [startButton setTitle:[NSString stringWithFormat:@"%d. %@", row+1, [stops objectForKey:[NSString stringWithFormat:@"%d", row+1]]] forState:UIControlStateNormal];
    }else if (pickerView.tag == 2){
        stop = row+1;
        [endButton setTitle:[NSString stringWithFormat:@"%d. %@", row+1, [stops objectForKey:[NSString stringWithFormat:@"%d", row+1]]] forState:UIControlStateNormal];
    }
}
4

3 に答える 3

0

を右クリックNSIntegerし、[定義に移動] をクリックすると、それがどのようになっているのかを正確に確認し、それを#defineスケルトンとして使用して、同様#defineの for %d/%ldを設定して に一致させることができますNSInteger


#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

これが仕組みNSIntegerです。同様のことができます:

#if __LP64__
#define FS_NSInt ld
#else
#define FS_NSInt d
#endif

次にFS_NSInt、 s のフォーマット指定子として使用しますNSInteger%(まだその前にa を置きます)

于 2013-11-06T00:36:07.587 に答える
0

NSIntegerorNSUIntegerをフォーマット引数として使用しないでください。代わりにそれらをキャストします(たとえば、次のようにlong long

[NSString stringWithFormat:@"%lld", (long long)row+1]
于 2013-11-06T00:36:35.723 に答える
0

アップルのドキュメントから:

型指定子:

通常、32 ビット コードでは %d 指定子を使用して > printf、NSAssert、NSLog などの関数や stringWithFormat: などのメソッドで int 値をフォーマットします。しかし、64 ビット アーキテクチャでは long と同じサイズである NSInteger では、%ld 指定子を使用する必要があります。64 ビットのような 32 ビットをビルドしない限り、これらの指定子は 32 ビット モードでコンパイラの警告を生成します。この問題を回避するために、必要に応じて値を long または unsigned long にキャストできます。例えば:

NSInteger i = 34;
printf("%ld\n", (long)i);

これを回避する 1 つの方法は、stdint.h の型を使用することです。
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t

于 2013-11-06T00:50:01.543 に答える