Функция должна возвращать float, но она запуталась! - PullRequest
3 голосов
/ 07 апреля 2010

Я схожу с ума здесь.

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

- (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), но фактическое возвращаемое значение функции равно NULL.

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

float originalHue = [self getHue:original];

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

float *originalHue = [self getHue:original];

возвращает нулевое значение.

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

Есть мысли?

Ура, ребята, Andre

Ответы [ 4 ]

5 голосов
/ 07 апреля 2010

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

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

3 голосов
/ 07 апреля 2010

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

0 голосов
/ 30 марта 2012

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

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

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


-(int) otherMethod {
    // do something
}

Так что проверьте (не в случае OP, но если у вас есть похожая ошибка), если это проблема.

0 голосов
/ 07 апреля 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...