更改返回 float *color 的函数中的 alpha 分量

Change alpha component in a function returning a float *color

我有一个返回 (float *) 颜色的函数。 它有效,直到我尝试更改一种颜色的 alpha 分量,现在几乎所有颜色都有 alpha 问题,即使颜色没有通过测试“if (alpha)”。

例如:
浮动 * colorTest = getColor(0); // 不要再给我好结果了,一旦之前调用了任何 getColor(1)。

float * getColor(float alpha) {
    float * col;

    if (val == 1)
        col = colorWhite; // colorWhite is a float *
    else if (val == 2)
        col = colorRed;
    else if (etc..)
        col = colEtc;

    if (alpha) {
        col[3] = alpha; // this doesn't works
    }

    return col;
}

我也试过通过col指针改变alpha值,结果一样:

if (alpha) {
    float *a;
    a = (float *)(&col + 3);
    *a = alpha;
}

有什么建议吗?

编辑

成功了,感谢 hyde 告诉我我正在更改我的全局颜色。 (我习惯于错误地将 float * 视为数组) 所以,我只是将结果复制到第二个变量中,然后修改这个新颜色。

float * getColor(float alpha) {
    float * col;
    float * tmp;

    if (val == 1)
        tmp = colorWhite; // colorWhite is a float *
    else if (val == 2)
        tmp = colorRed;
    else if (etc..)
        tmp = colEtc;

    memcpy(col, tmp, sizeof(float)*4);

    if (alpha) {
        col[3] = alpha; // this now works without issue
    }

    return col;
}
if (alpha) {
    col[3] = alpha; // this doesn't works
}

此处 col 指向您的一种全局颜色。然后你改变它。

因为颜色很小(我假设是 4 个浮点数),所以只传递值而忘记指针。通过定义 struct

来做到这一点
struct color {
    float component[4];
    // Or if you prefer: float r, g, b, a;
};

特别是在 64 位系统上,指针可能是这个结构的一半大小,并且有指针解引用开销,所以 performance-wise 基本相同。指针总是比值更混乱。

一旦你有了带有结构值的工作代码,那么你可以考虑使用指针来优化,例如。 const struct color *param 作为函数参数。但是,这确实是一个非常小的优化,有 4 个浮点数。如果该结构在 2 个寄存器中传递,则强制它在内存中以便您可以在 1 个寄存器中传递指针甚至可能是一种悲观。


此外,您通常不想意外更改像这些全局颜色这样的全局数据,因此将它们设为常量。