函数应该返回浮点数,但它搞砸了!

时间:2010-04-07 10:27:57

标签: iphone objective-c xcode

我在这里疯了。

我有一个应该返回浮点数的函数:

- (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];

导致空值返回。

我尝试过其他方法,但它实际上从未真正获得价值。

有什么想法吗?

干杯队员, 安德烈

4 个答案:

答案 0 :(得分:5)

您是否已在班级界面中声明了您的方法?如果是这样,您是否每次发生事故都表明有不同的返回值(例如id)?

如果未在您的接口中声明它,编译器会将返回值视为id,因此您需要在接口中声明它或将返回值强制转换为float。 / p>

答案 1 :(得分:3)

我使用了您的代码但没有发现任何问题。它对我来说很好。只需清理一次你的应用程序。上面的代码将工作正常,直到 h = 0.0005如果超出值0.0005那是0.00005或更多,那么你将获得无限值。因此,请检查它并进行必要的更改,例如使用double / long。

答案 2 :(得分: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

答案 3 :(得分:0)

这恰好发生在我身上。但事实证明,我在类方法中引用了一个你不应该做的实例方法。

基本上我错误做的是:

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


-(int) otherMethod {
    // do something
}

所以请检查(不是在OP的情况下,但如果你有类似的错误),如果这是问题。