2009-09-16 153 views
-3

結合兩種功能,我只是想用別人的代碼的東西。幫助在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()函數中。

我想這樣做,但我得到了很多錯誤。

,別的人可以告訴我怎麼做呢?

+1

_Why_做你想做的事嗎?這個不成立。不過,請參閱我的答案(http://stackoverflow.com/questions/1430907/1431762#1431762),以瞭解如何實現這一點。 – sbi 2009-09-16 08:49:36

+0

你看不到[因此它],因爲它是[SEP](http://en.wikipedia.org/wiki/Somebody_Else's_Problem)。 – 2011-04-29 22:57:42

回答

3

如果你只需要改變線路

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

到:

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

其次是什麼,現在​​從開{到包括關閉}的全身,我相信它應該只是工作。如果沒有,請編輯您的問題以添加此編輯所獲得的完整,完整的代碼以及您獲得的完整,完整的錯誤消息。

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

} 

結果將是更清潔,更易於維護和重複使用。

+3

+1因爲乾淨的代碼是軟件開發中最重要的事情之一(也是經常被忽略的事情之一) – 2009-09-16 04:35:37

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; 
     } 
1

好,因爲標籤說C++(即使代碼似乎是純C),該解決方案將是把該功能之前inline修改:

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

然而,即使在思考這個十分鐘後,我仍然無法爲希望這是一個正當的理由。