2014-09-25 101 views
1

如下圖所示,我的C++代碼中有兩個庫,它們使用不同的索引語法,一個以0開頭,另一個以1開頭。 C++代碼非常複雜,這種差異對我來說非常麻煩。我想知道是否有人遇到過這種麻煩,如果有這個竅門。我不知道,例如有沒有一種方法可以使它們具有相同的索引語法!!C++索引語法:兩個庫使用不同的索引語法:基於0和基於1的索引

enter image description here

enter image description here

我sloved的問題是這樣的:

#define KFULL(row,col) kFull(row+1,col+1) 
    AG_Matrix kFull(4,4,5.0); 
    std::cout<<kFull(1,1)<<'\n';//prints 5 
    std::cout<<kFull(0,0)<<'\n';//prints garbage value 
    std::cout<<KFULL(0,0)<<'\n';//prints 5 
    int i=int(0);int j=int(0); 
    std::cout<<KFULL(i,j)<<'\n';//prints 5 

所以每次我宣佈AG_Matrix類的對象的時候,我也定義一個宏爲對象注意基於0和1的索引問題。這個解決方案是由其中一個簡單工作的人之一建議的。

+2

這有什麼好做的語法。它是圖書館開發者的選擇,實際上你可以做的事情並不多。除了包裝他們自己,讓他們一致行爲與0或1爲基礎的索引。 – Borgleader 2014-09-25 18:06:36

+0

@Borgleader謝謝。你是對的。 – user3405291 2014-09-25 18:19:46

+0

真正的解決方案是儘可能地從代碼中移除使用基於1的矩陣類。 – 2014-09-25 20:38:43

回答

1

壞黑客

#define KFULL(row, column) KFull(row + 1, column + 1) 

KFULL(0, 0) = 4.0 
+1

你能補充一些解釋嗎?只有代碼的答案不是那麼有用。 – 2014-09-25 18:48:10

+1

我們定義了一個可以增加索引的宏。預處理後的行KFULL(0,0)看起來像KFull(0 + 1,0 + 1)。附:對不起我的英語,我正在學習。 – Kastaneda 2014-09-25 19:04:05

+0

@Kastaneda我測試了你的建議,它工作! (行,列)kFull(行+ 1,列+1) AG_Matrix kFull(4,4,5.0); \t std :: cout << kFull(1,1)<<'\ n'; //打印5 \t std :: cout << kFull(0,0)<<'\ n'; //打印垃圾值 \t std :: cout << KFULL(0,0)<<'\ n'; //打印5 \t int i = int(0); int j = int(0); (i,j)<<'\ n'; //打印5 ' – user3405291 2014-09-25 19:25:57

1

最好將AG_Matrix的代碼修改爲您想要的樣子。這在生成的代碼中具有最低的開銷。

解決方法是從AG_Matrix導出並重新實現operator()(int,int)。然後,您將使用派生類而不是AG_Matrix,並且在傳遞給期望AG_Matrix的其他代碼時,它可以用來代替AG_Matrix

+0

謝謝。 'AG_Matrix'類是在DLL中實現的,我沒有源代碼。我想知道我是否仍然可以爲'AG_Matrix'類實現派生類。 – user3405291 2014-09-25 18:33:02

+1

@ user3853917當然。它在何處實施並不重要。無論如何,如果這個矩陣類是好的,它的大部分實現都在頭文件中 - 當然索引操作是(只要看看頭文件)。 – 2014-09-26 03:45:25