Xcode 5.0.1 на Mavericks: Как да се отърва от това предупреждение?

Имам част от кода, който създава маска, използвайки алфа канала на изображение. Преди да надстроя до Mavericks, работеше страхотно и никога не получих нито едно предупреждение или грешка в конзолата за отстраняване на грешки на Xcode. След надграждането получавам това предупреждение:

Неявно преобразуване от тип изброяване „enum CGImageAlphaInfo“ към различен тип изброяване „CGBitmapInfo“ (известен още като „enum CGBitmapInfo“)

Редът, маркиран като проблемен:

CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, kCGImageAlphaOnly);

Ето какво се казва в документацията за последния аргумент (известен още като kCGImageAlphaOnly):

bitmapInfo

Константи, които указват дали растерното изображение трябва да съдържа алфа канал, относителното местоположение на алфа канала в пиксел и информация за това дали пикселните компоненти са стойности с плаваща запетая или цели числа. Константите за указване на информацията за алфа канала са декларирани с типа CGImageAlphaInfo, но могат безопасно да бъдат предадени на този параметър. Можете също да подадете другите константи, свързани с типа CGBitmapInfo.

Странно, но в документацията (Алфа информация за изображения), typedef на Apple не показва опцията, която използвам. Въпреки това, в списъка с термини, който следва, това е така! Ето какво пише:

kCGImageAlphaOnly
Няма цветни данни, само алфа канал. Предлага се в OS X v10.3 и по-нова версия. Деклариран в CGImage.h.

Като се има предвид, че искам да създам алфа маска, не се интересувам от никакви цветови данни, така че аргументът, който използвам, е единственият, който има смисъл. Не съм сигурен какво иска да направя. Независимо от това, методът работи и всичко е наред, когато приложението работи. С това казано, предупрежденията са наистина досадни. Има ли специална CLANG директива, която да го заглуши? Всяка помощ ще бъде оценена. наздраве


person Ben Stock    schedule 28.10.2013    source източник
comment
възможен дубликат на Как да създам контекст само на алфа растерно изображение   -  person rmaddy    schedule 28.10.2013


Отговори (1)


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

CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, (CGBitmapInfo)kCGImageAlphaOnly);

Само защото дадена функция е имплементирана да позволява стойности от множество типове за даден параметър (както е отбелязано в документацията), не означава, че тя може да бъде дефинирана така, че компилаторът да не се оплаква от нея. C не ви позволява да дефинирате параметър като приемащ множество типове, трябва да изберете един. В този случай CGBitmapContextCreate се дефинира като:

CGContextRef CGBitmapContextCreate (
  void *data,
  size_t width,
  size_t height,
  size_t bitsPerComponent,
  size_t bytesPerRow,
  CGColorSpaceRef colorspace,
  CGBitmapInfo bitmapInfo
);

Обърнете внимание на типа CGBitmapInfo най-долу. Това означава, че дори ако стойностите на CGImageAlphaInfo са технически законни, те пак ще трябва да бъдат преобразувани, за да преминат през проверката на типа.

person jemmons    schedule 28.10.2013
comment
Дори не се сетих да го направя. Не съм много умен. Благодаря ти човече. Някаква идея защо не се оплакваше преди Mavericks? Аз съм нов в играта Xcode, така че предполагам, че всичките ми настройки остават същите, както преди Mavericks. нали :-) Предполагам, че компилаторът просто засилва своята игра за преобразуване, а? Така или иначе, благодаря за бързото решение. - person Ben Stock; 28.10.2013
comment
@BenStock Въпросът няма нищо общо с Mavericks. Това е проблем с компилатора. Хората са виждали този проблем с по-ранни версии на Xcode. Каква версия на Xcode използвахте, преди да надстроите до Mavericks? - person rmaddy; 28.10.2013
comment
Да, това не е нещо от Маверикс. Този вид проверка винаги е била налична при използване на LLVM/CLANG (въпреки че не съм сигурен дали е включена по подразбиране или не). Ако не сте виждали това преди и сега виждате, вероятно току-що сте преминали към LLVM/CLANG или опцията Implicit Enum Conversions във вашите настройки за компилация току-що е била включена по някаква причина. - person jemmons; 28.10.2013
comment
@jemmons: Това си помислих. С всяка актуализация ви очаква нова изненада! Благодаря все пак за помощта. Ако някога пусна приложението си, ще бъдете изброени под Badasses в прозореца About. :-) - person Ben Stock; 29.10.2013
comment
@rmaddy: Използвах версията, която имаше подобен на iOS стил и тестващи ботове, така че предполагам … Xcode 5.0.0? Сега е почти същото, но забелязах, че инструментът за преглед на документация е леко променен. Странно. - person Ben Stock; 29.10.2013