2010-04-07 2 views
3

Я схожу с ума.Функция должна возвращать float, но она перепуталась!

У меня есть функция, которая должна возвращать число с плавающей запятой:

- (float) getHue:(UIColor *)original 
{ 
    NSLog(@"getHue"); 
    const CGFloat *componentColors = CGColorGetComponents(original.CGColor); 

    float red = componentColors[0]; 
    float green = componentColors[1]; 
    float blue = componentColors[2]; 

    float h = 0.0f; 
    float maxChannel = fmax(red, fmax(green, blue)); 
    float minChannel = fmin(red, fmin(green, blue)); 
    if (maxChannel == minChannel) 
     h = 0.0f; 
    else if (maxChannel == red) 
     h = 0.166667f * (green - blue)/(maxChannel - minChannel) + 0.000000f; 
    else if (maxChannel == green) 
     h = 0.166667f * (blue - red)/(maxChannel - minChannel) + 0.333333f; 
    else if (maxChannel == blue) 
     h = 0.166667f * (red - green)/(maxChannel - minChannel) + 0.666667f; 
    else 
     h = 0.0f; 

    if (h < 0.0f) 
     h += 1.0f; 

    NSLog(@"getHue results: %f", h); 

    return h; 
} 

NSLog будет отслеживать его правильно (т.е.: 0,005), но фактическое возвращаемое значение функции равно нулю.

Я пробовал получать эту ценность по-разному, и она никогда не работает.

float originalHue = [self getHue:original]; 

приводит к ошибке здания, как это говорит: «несовместимые типы в инициализации»

float *originalHue = [self getHue:original]; 

результаты в нулевой доходности.

Я пробовал другие способы, но он никогда не получает правильное значение.

Любые мысли?

Приветствия ребята, Андре

ответ

5

Вы объявили свой метод в интерфейсе своего класса? Если да, то на случай аварии указывалось другое возвращаемое значение (например, id)?

Если он не объявлен в вашем интерфейсе, компилятор будет обрабатывать возвращаемое значение как id, поэтому вам нужно будет либо объявить его в интерфейсе, либо передать возвращаемое значение в float.

+0

ЭТО БЫЛО! Геэз ... это заняло навсегда. Извините за мой вопрос n00bish, но я новичок в Objective-C. Итак, чтобы убедиться, что я понимаю логику: каждый раз, когда у меня есть функция, которая возвращает что-то, я должен объявить ее в интерфейсе? – Andre

+0

Приятная ясновидящая отладка, и я тоже кое-что узнал. –

+0

hahaha good catch :) cheez ... – Manjunath

3

Я использовал свой код, но не нашли каких-либо проблем. Он отлично работает для меня. Просто очистите свое приложение один раз. Выше код будет работать нормально до h = 0,0005, если его значение превышает 0,0005, то есть 0,00005 или более, тогда вы получите бесконечное значение. Поэтому, пожалуйста, проверьте его и выполните необходимые изменения, например, используя double/long.

+0

Я сделал это. Тот же результат:/ Попробуйте использовать: float * originalHue = [self getHue: original]; NSLog (@ "originalHue =% f", originalHue); Не возвращает ли он 0.000, хотя функция правильно регистрирует результат? – Andre

+0

иногда необходимо удалить каталог сборки и перезапустить XCode – f3r3nc

+0

Выше код будет работать нормально до h = 0.0005, если его значение больше 0.0005, то есть 0.00005 или более, то вы получите бесконечное значение. Поэтому, пожалуйста, проверьте его и выполните необходимые изменения, например, используя double/long. – Manjunath

0

Ваш код отлично подходит для меня использовать это, чтобы назвать это работает:

UIColor *aColor = [UIColor colorWithRed:0.3 green:0.1 blue:0.5 alpha:1.0]; 
float theHue = [self getHue:aColor]; 
NSLog(@"Float: %f", theHue); 

Возвращает:

2010-04-07 11:49:33.242 Floating[8888:207] getHue 
2010-04-07 11:49:33.243 Floating[8888:207] getHue results: 0.750000 
2010-04-07 11:49:33.243 Floating[8888:207] Float: 0.750000 
0

Это просто случилось со мной. Но, как оказалось, я ссылался на метод экземпляра из метода класса, который вы не должны делать.

В основном то, что я имел ошибочно сделано было:

+(int) someMethod { 
    // stuff 
    [self otherMethod]; 
} 


-(int) otherMethod { 
    // do something 
} 

Так что чек (не в OPS случае, но если у вас есть аналогичные ошибки), если это является проблемой.

Смежные вопросы