что означают квадратные скобки рядом с десятичным объектом?

#objective-c #core-plot

#objective-c #core-plot

Вопрос:

Я использую core-plot для моего графического компонента моего приложения для iPhone, и я часто использую NSDecimal object.

Одна из строк их кода, которую я видел, выглядит так:

 -(void)plotPoint:(NSDecimal *)plotPoint forPlotAreaViewPoint:(CGPoint)point
{
    NSDecimal x;
    //do some calculations on x
    plotPoint[CPCoordinateX] = x;
}
  

Где CPCoordinateX деинфицируется, как показано ниже:

 typedef enum _CPCoordinate {
    CPCoordinateX = 0,  ///< X axis
    CPCoordinateY = 1,  ///< Y axis
    CPCoordinateZ = 2   ///< Z axis
} CPCoordinate;
  

Линия:

 plotPoint[CPCoordinateX] = x;
  

вот чего я не понимаю, как можно присвоить NSDecimal подобным образом?

В моем коде я пытаюсь вызвать этот метод примерно так:

 NSDecimal dec = CPDecimalFromInteger(0);
[plotSpace plotPoint:amp;dec forPlotAreaViewPoint:point];
NSDecimalNumber *newx = [[NSDecimalNumber alloc] initWithDecimal:dec];

NSDecimal x = dec[CPCoordinateX];
//NSLog(@"converted at: %@", newx);
  

но я получаю ошибки компиляции:

ошибка: подписанное значение не является ни массивом, ни указателем

Кто-нибудь, пожалуйста, может мне это объяснить?

Ответ №1:

plotPoint это указатель, а указатели могут быть проиндексированы как массивы с помощью оператора indexript:

 int array[] = { 1, 2, 3 };
NSLog(@"x=%d, y=%d, z=%d", array[0], array[1], array[2]); 
// prints "x=1, y=2, z=3"
int *pointer = array; // implicit conversion to pointer
NSLog(@"x=%d, y=%d, z=%d", pointer[0], pointer[1], pointer[2]);
// also prints "x=1, y=2, z=3"
  

Вы также можете использовать эти выражения для присваиваний:

 array[0] = 4;
pointer[1] = 5;
  

Но вы можете использовать оператор подстрочного индекса только для массивов или указателей:

 NSDecimal dec = CPDecimalFromInteger(0);
dec[0]; // illegal, dec is a single NSDecimal value, not pointer or array
  

Чтобы фактически передать точку -plotPoint:forPlotArrayViewPoint: , вам нужен массив в стиле C или динамический массив из 2 или 3 NSDecimal секунд (в зависимости от того, какие измерения ожидает метод), например:

 NSDecimal decPoint[] = {
     CPDecimalFromInteger(0),
     CPDecimalFromInteger(0),
     CPDecimalFromInteger(0)
};
[plotSpace plotPoint:decPoint forPlotAreaViewPoint:point];
  

В этом массиве теперь вы также можете использовать оператор подстрочного индекса:

 NSDecimal x = decPoint[CPCoordinateX];
  

Комментарии:

1. итак, как я могу изменить dec переменную на указатель? Когда я передаю его в метод, я использую оператор amp;, но когда я использую его в строке с ошибкой, он по-прежнему не компилируется…

2. @Mark: В вашем коде dec это просто NSDecimal значение, поэтому NSDecimal x = dec; этого было бы достаточно — но -plotPoint:forPlotArrayViewPoint: наверняка ожидается, что точка имеет более одного измерения… Смотрите мое обновление.

3. Большое спасибо, Георг, теперь я все понимаю, однако, я думаю, что это немного неправильно — указывать параметр в методе как a (NSDecimal*) У меня такое чувство, что для ясности это должно быть a NSDecimal[] . Или, возможно, это просто одна из тех вещей, которые люди принимают? Как кто-либо мог узнать, что это массив, если код не был с открытым исходным кодом?

4. @Mark: Если он принимает указатель, он либо ожидает, что он укажет на элементы location >=1 , либо это параметр in-out — что именно это такое, должно быть задокументировано. Я думаю, что указатель здесь понятнее, потому что вам не нужно передавать массив, это также может быть указатель на динамически выделяемую память ( malloc() / calloc() ).

Ответ №2:

Это массив C.

Комментарии:

1. Это не массив, это указатель, для которого используется оператор подстрочного индекса.

2. так что же это, указатель или массив? Как NSDecimal может быть массивом? Разве это не десятичное число?

3. plotPoint является указателем на NSDecimal . dec однако в вашем коде есть только одно десятичное значение, а не указатель или массив