Использование sizeof правильно с Byte [] - PullRequest
2 голосов
/ 30 августа 2011

Я немного не в себе, но у меня есть следующий код (реальный код на самом деле имеет смысл):

- (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)];

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Когда вы передаете массив C в качестве метода или аргумента функции C, он «распадается» на указатель на базовый тип (т. Е. Byte[] фактически передается как Byte *.) Таким образом, вызываемый метод / функция не имеет Представьте, сколько элементов присутствует в массиве.

Вы также должны передать длину массива, чтобы вызываемый код знал, чего вы хотите. Вот почему у +[NSData dataWithBytes:length:] есть второй аргумент.

2 голосов
/ 31 августа 2011

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)];
}
0 голосов
/ 31 августа 2011

Вы не можете передавать массивы в функцию. Вы передаете указатель на первый элемент в массиве вызывающей стороны.

Если вам нужна длина этого массива, вам нужно передать эту длину в качестве отдельного аргумента вашей функции и использовать ее вместо sizeof

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...