У меня есть метод loading
:
-(void)loading:(MKTileOverlayPath)path ... {
...
В рамках этого метода я пытаюсь вычислить что-то
NSInteger *a = pow(2, path.z) - path.y - 1;
Я получаю ошибку:
Инициализация NSInteger * (он же long *) выражением несовместимого типа double
Почему это двойной? path.z и path.y, как указано в документация MKTileOverlayPath, целое число. А также pow(2, path.z)
не может привести к float
или же double
ни когда есть только integers
… Это почему?
Математически это не приведет к нецелочисленному значению, но это не контракт на pow()
функция. В соответствии с http://www.cplusplus.com/reference/cmath/pow/, параметры неявно приводятся к значениям типа double, а возвращаемое значение функции всегда равно double.
У вас есть две ошибки:
Стандарт С pow()
производит double
и это параметры также double
— ваши целочисленные аргументы неявно приведены для вас. Нет версии для целочисленных типов. Лучшее решение не использовать приведения для получения целочисленного значения, которое вводит возможность ошибок до характера математики с плавающей точкой, но просто написать свою собственную целочисленную степенную функцию. Вы можете скопировать один в этот ответ — просто реализовать это с помощью целочисленного типа (int
, long
и т.д.) вам требуется.
Вы перепутали тип переменной, типы объектов ссылочные типы и объявлены как указатели, например NSString *
; простые числовые типы типы значений и не указатели, например NSInteger
,