2015-02-11 3 views
0

Итак, у меня есть следующий код и строка, которая является const double colorMasking [6], сейчас она двойная, но если я чист и строю ее, то говорят, что типы несовместимых указателей, проходящие double, должны быть float. Затем, однако, если я изменю его на float, ошибка исчезнет, ​​но затем, как только я очистку и построю снова, он говорит, что типы несовместимых указателей, проходящие с плавающей точкой, должны быть двойными. Точная противоположность тому, что я только что сделал. Любая идея, что здесь происходит?Несовместимые типы указателей, проходящих независимо от типа?

-(UIImage *)changeWhiteColorTransparent: (UIImage *)image 
{ 
    CGImageRef rawImageRef=image.CGImage; 

    const double colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

    UIGraphicsBeginImageContext(image.size); 
    CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); 
    { 
     //if in iphone 
     CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); 
     CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); 
    } 

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    CGImageRelease(maskedImageRef); 
    UIGraphicsEndImageContext(); 
    return result; 
} 
+1

Глупый вопрос: в какой строке помечено это сообщение об ошибке. –

+0

Работает ли это, если 'colorMasking' является' CGFloat' вместо 'double'? – NobodyNada

+0

@HotLicks Я думаю, что это 'CGImageRef maskedImageRef = CGImageCreateWithMaskingColors (rawImageRef, colorMasking);', поскольку это единственный раз, когда он передает 'colorMasking'. – NobodyNada

ответ

2

Изменить

const double colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

к

const CGFloat colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

CGImageCreateWithMaskingColors ожидает CGFloat, который typedef-е изд, чтобы float на 32-битных системах, и double на 64-битной. При компиляции с использованием float:

  1. Компилятор компилирует 32-битный двоичный и видит ваш float массив, который является тем, что функция ожидает.
  2. Компилятор компилирует 64-битный двоичный файл и видит ваш массив float, но функция ожидает массив double.

Противоположное происходит, когда вы используете double вместо float.

Вот это определение CGFloat (в CoreGraphics/CGBase.h):

#if defined(__LP64__) && __LP64__ 
# define CGFLOAT_TYPE double 
# define CGFLOAT_IS_DOUBLE 1 
# define CGFLOAT_MIN DBL_MIN 
# define CGFLOAT_MAX DBL_MAX 
#else 
# define CGFLOAT_TYPE float 
# define CGFLOAT_IS_DOUBLE 0 
# define CGFLOAT_MIN FLT_MIN 
# define CGFLOAT_MAX FLT_MAX 
#endif 

typedef CGFLOAT_TYPE CGFloat; 
1

Документы обеспечивают: CGImageRef CGImageCreateWithMaskingColors (CGImageRef image, const CGFloat components[]); так colorMasking должен быть типа CGFloat.