#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*)
У меня такое чувство, что для ясности это должно быть aNSDecimal[]
. Или, возможно, это просто одна из тех вещей, которые люди принимают? Как кто-либо мог узнать, что это массив, если код не был с открытым исходным кодом?4. @Mark: Если он принимает указатель, он либо ожидает, что он укажет на элементы location
>=1
, либо это параметр in-out — что именно это такое, должно быть задокументировано. Я думаю, что указатель здесь понятнее, потому что вам не нужно передавать массив, это также может быть указатель на динамически выделяемую память (malloc()
/calloc()
).
Ответ №2:
Это массив C.
Комментарии:
1. Это не массив, это указатель, для которого используется оператор подстрочного индекса.
2. так что же это, указатель или массив? Как NSDecimal может быть массивом? Разве это не десятичное число?
3.
plotPoint
является указателем наNSDecimal
.dec
однако в вашем коде есть только одно десятичное значение, а не указатель или массив