帮助在c ++中组合两个函数

时间:2009-09-16 04:15:16

标签: c++

我只是想用别人的代码尝试一下。

我有两个功能:

int Triangle(Render *render, int numParts, Token *nameList, Pointer *valueList) 
    int i;
    for (i=0; i<numParts; i++)
    {
        switch (nameList[i])
        {
        case GZ_NULL_TOKEN:
            break;

        case GZ_POSITION:
            return putTrianglePosition(render, (Coord *)valueList[i]);
            break;
        }
    }

    return SUCCESS;
}

int putTrianglePosition(Render *render, Coord vertexList[3]) /*vertexList[3][3:xyz]*/
{
    Coord *pv[3];
    int i,j;

    // sort verts by inc. y and inc. x
    pv[0] = &vertexList[0];
    pv[1] = &vertexList[1];
    pv[2] = &vertexList[2];
    for (i=0; i<2; i++)
        for (j=i+1; j<3; j++)
        {
            if ((*pv[i])[1]>(*pv[j])[1] || 
                (*pv[i])[1]==(*pv[j])[1] && (*pv[i])[0]>(*pv[j])[0]) {
                Coord *tmp;
                tmp = pv[i];
                pv[i] = pv[j];
                pv[j] = tmp;
            }
        }
    ;

    // all y the same?
    if ((*pv[0])[1] == (*pv[2])[1]) {
        drawHorizonLine(render, *pv[0], *pv[2]);
        return SUCCESS;  
    }

    // assign middle point
    Coord mid; 
    mid[1] = (*pv[1])[1];   // y
    float ratio = ((*pv[1])[1] - (*pv[0])[1]) / ((*pv[2])[1] - (*pv[0])[1]);
    mid[0] = (*pv[0])[0] + ratio * ((*pv[2])[0] - (*pv[0])[0]); // x
    mid[2] = (*pv[0])[2] + ratio * ((*pv[2])[2] - (*pv[0])[2]); // z

    if (mid[0]<=(*pv[1])[0]) {  // compare X
        drawTrapzoid(render, *pv[0], mid, *pv[0], *pv[1]); // upper tri
        drawTrapzoid(render, mid, *pv[2], *pv[1], *pv[2]); // lower tri
    }else{
        drawTrapzoid(render, *pv[0], *pv[1], *pv[0], mid); // upper tri
        drawTrapzoid(render, *pv[1], *pv[2], mid, *pv[2]); // lower tri
    }

    return SUCCESS;
}

我不想要两个功能。我想将putTrianglePosition()函数复制到Triangle()函数中。

我尝试过这样做,但是我遇到了很多错误。

其他人可以告诉我该怎么做吗?

4 个答案:

答案 0 :(得分:9)

你不应该把功能放在一起,你应该将它们分开。在任何可以命名的地方放置一个新功能 - 尽量让它们尽可能小。如果你想要一个能完成所有这些工作的函数,那就有一个调用其他函数的函数。

int foobar() {

    int a;
    int b;

    /* do a whole bunch of stuff with a */

    /* do a whole bunch of stuff with b */

    return  a + b;

}

这是你想要做的事情。相反,这样做:

int foo(){

    int a;

    /* do a bunch of stuff with a */

    return a;

}

int bar() {

    int b;

    /* do a bunch of stuff with b */

    return b;

}

int foobar() {

    return foo() + bar();

}

结果将更清晰,更易于维护和重复使用。

答案 1 :(得分:3)

如果您只是更改行

            return putTrianglePosition(render, (Coord *)valueList[i]);

成:

Coord* vertexList = (Coord*) valueList[i];

接下来是从开场putTrianglePosition到结束{的现在}的全部内容,我相信它应该可行。如果没有,请编辑您的问题,以添加此编辑所获得的完整,完整的代码以及您获得的完整错误消息。

答案 2 :(得分:1)

我强烈建议您使用函数,因为它允许更好地分离逻辑并允许您重用逻辑。但是如果您想以这种方式使用它,请检查以下功能:

 int Triangle(Render *render, int numParts, Token *nameList, Pointer *valueList) 
        {
            int iOuter;
            for (iOuter=0; iOuter<numParts; iOuter++)
            {
                switch (nameList[iOuter])
                {
                case GZ_NULL_TOKEN:
                        break;

                case GZ_POSITION:
                        {

                            Coord* vertexList = (Coord*) valueList[i];
                             Coord *pv[3];
                            int i,j;

                            // sort verts by inc. y and inc. x
                            pv[0] = &vertexList[0];
                            pv[1] = &vertexList[1];
                            pv[2] = &vertexList[2];
                            for (i=0; i<2; i++)
                                for (j=i+1; j<3; j++)
                                {
                                        if ((*pv[i])[1]>(*pv[j])[1] || 
                                                (*pv[i])[1]==(*pv[j])[1] && (*pv[i])[0]>(*pv[j])[0]) {
                                                Coord *tmp;
                                                tmp = pv[i];
                                                pv[i] = pv[j];
                                                pv[j] = tmp;
                                        }
                                }
                            ;

                            // all y the same?
                            if ((*pv[0])[1] == (*pv[2])[1]) {
                                drawHorizonLine(render, *pv[0], *pv[2]);
                                return SUCCESS;  
                            }

                            // assign middle point
                            Coord mid; 
                            mid[1] = (*pv[1])[1];       // y
                            float ratio = ((*pv[1])[1] - (*pv[0])[1]) / ((*pv[2])[1] - (*pv[0])[1]);
                            mid[0] = (*pv[0])[0] + ratio * ((*pv[2])[0] - (*pv[0])[0]); // x
                            mid[2] = (*pv[0])[2] + ratio * ((*pv[2])[2] - (*pv[0])[2]); // z

                            if (mid[0]<=(*pv[1])[0]) {  // compare X
                                drawTrapzoid(render, *pv[0], mid, *pv[0], *pv[1]); // upper tri
                                drawTrapzoid(render, mid, *pv[2], *pv[1], *pv[2]); // lower tri
                            }else{
                                drawTrapzoid(render, *pv[0], *pv[1], *pv[0], mid); // upper tri
                                drawTrapzoid(render, *pv[1], *pv[2], mid, *pv[2]); // lower tri
                            }

                            return SUCCESS;

                        }

                        break;
                }
            }

            return SUCCESS;
        }

答案 3 :(得分:1)

好吧,既然标签上写的是C ++(即使代码似乎是纯粹的C),解决办法就是在函数前加上inline修饰符:

inline int putTrianglePosition(Render *render, Coord vertexList[3])
{
  ...
}

然而,即使在考虑了这十分钟之后,我仍然没有理由想要这个。