我有点不在这里,但我有以下代码(真正的代码实际上有一点当然):
- (NSData*) dataTheseBytes:(Byte[]) bytes {
return [NSData dataWithBytes:bytes length:sizeof(bytes)];
}
编译器警告是
数组函数参数的sizeof将返回'Byte *'的大小(又名 'unsigned char *')而不是'Byte []'
如何消除此警告(或者更确切地说,我不了解我的字节数组?)
此外,为什么这段代码不会发生错误?必须与方法签名有关...?
Byte bytes[3] = { byte1, byte2, byte3 };
NSData *retVal = [NSData dataWithBytes:bytes length:sizeof(bytes)];
答案 0 :(得分:5)
当您将C数组作为方法或C函数参数传递时,它会“衰减”为指向基础类型的指针(即Byte[]
实际上是作为Byte *
传递的。)所以被调用的方法/ function不知道数组中有多少个元素。
您还必须传递数组的长度,以便被调用的代码知道您想要的内容。这就是+[NSData dataWithBytes:length:]
有第二个论点的原因。
答案 1 :(得分: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消息传递的问题是,如果已声明具有相同名称但使用不同参数或元素计数的选择器,则编译器可能无法确定适当的选择器并产生错误或警告。因此,使用c函数更安全:
`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)];
}
答案 2 :(得分:0)
您无法将数组传递给函数。您正在将指针传递给调用者数组中的第一个元素。
如果您需要该数组的长度,则需要将该长度作为单独的参数传递给您的函数,并使用该长度代替sizeof