2011-08-30 67 views
2

我是那種在這裏我的深處,但我有下面的代碼(真正的代碼實際上有一個點,當然):SIZEOF與字節正確使用[]

- (NSData*) dataTheseBytes:(Byte[]) bytes { 
    return [NSData dataWithBytes:bytes length:sizeof(bytes)]; 
} 

編譯器警告

的sizeof上數組函數參數將返回 '字節*'(又名 '無符號字符*'),而不是 '字節[]'

如何可以消除的大小這個警告(或者說,我不瞭解我的字節數組)?

此外,爲什麼這個代碼不會發生錯誤?必須與方法簽名有關... ...?

Byte bytes[3] = { byte1, byte2, byte3 }; 
    NSData *retVal = [NSData dataWithBytes:bytes length:sizeof(bytes)]; 
+0

您將指針的大小返回到內存而不是內存本身。你可能需要做一些像'sizeof(* bytes)' – mydogisbox

+1

嘗試使用strlen(bytes) – Nekto

+0

@mydogisbox,這是正確的還是strlen正確?另外,請您將此作爲答案嗎? –

回答

5

當通過C數組爲方法或C函數參數,它「衰變」的指針爲基礎類型(即Byte[]Byte *實際傳遞。)所以被調用方法/函數沒有了解陣列中有多少元素。

您還必須傳遞數組的長度以使被調用的代碼知道您想要的。這就是爲什麼+[NSData dataWithBytes:length:]有第二個參數。

+0

Grynspan,謝謝你的回答,但不幸的是,錯誤的問題被標記爲重複。你能把這個答案放在另一個「重複」的問題上嗎? –

+0

@Yar:你可以標記一個mod來合併,尤其是因爲這是一個錯誤的雙後。 –

+0

@Josh Caswell,謝謝,只是做到了。 –

0

您無法將數組傳遞給函數。你傳遞一個指向調用者數組中第一個元素的指針。

如果你需要一個數組的長度,你需要通過該長度作爲一個單獨的參數傳遞給你的函數,並用它來代替sizeof

2

C數組中沒有嵌入他們的元素計數。

這就是你如何聲明一個具有未指定元素數的方法。這通常不可用:

`- (NSData*) dataTheseBytes:(const Byte*)bytes;` 
// or 
`- (NSData*) dataTheseBytes:(const Byte[])bytes;` 

更嚴格的實現可以指定元素數量。如果你總是使用相同的尺寸,這是可以的。例如:

enum { MONByteBufferElementCount = 23 }; 
... 
`- (NSData*) dataTheseBytes:(const Byte[MONByteBufferElementCount])bytes 
{ 
    return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])]; 
} 

在這種情況下使用objc消息的問題是,編譯器可能無法確定合適的選擇,併產生錯誤或警告,如果您已聲明具有相同名稱的選擇,但使用不同參數或元素計數。因此,它的安全使用交流功能:

`NSData* DataTheseBytes(const Byte bytes[MONByteBufferElementCount]) { 
    return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])]; 
} 

或使用更詳細的名稱:

`- (NSData*) dataWithMONByteBuffer:(const Byte[MONByteBufferElementCount])bytes 
{ 
    return [NSData dataWithBytes:&bytes[0] length:MONByteBufferElementCount * sizeof(bytes[0])]; 
} 
在objc

,這是最常見的傳遞長度作爲參數,類似於NSData構造你呼叫。你的程序的某些部分將能夠確定這個值(無論是NSData,c數組還是其他)。

- (NSData*) dataTheseBytes:(const Byte*)bytes length:(NSUInteger)length 
{ 
    return [NSData dataWithBytes:bytes length:length]; 
} 

它也經常可以看到的元素個數,像這樣:

- (NSData*) dataTheseFloats:(const float*)floats length:(NSUInteger)count 
{ 
    return [NSData dataWithBytes:floats length:count * sizeof(float)]; 
} 

最後,當然有一些極端情況。顯而易見的是空終止的字符串:

- (NSData*) dataWithASCIIString:(const char*)chars 
{ 
    return [NSData dataWithBytes:chars length:strlen(chars)]; 
} 
+0

只是爲了確認,沒有辦法從陣列本身找出長度? –

+1

這是正確的。基本的C數組沒有長度屬性。 – Perception

+0

@Yar有一個例外是正確的:具有固定元素數的數組。重寫答案以演示使用c數組時可用的選項。另一種選擇是創建一個簡單的結構,如'typedef struct t_mon_byte_buffer {Byte * at; size_t count; } t_mon_byte_buffer;' – justin