我所做的事情在預處理器上非常沉重。 MinGW需要一分鐘或2分鐘來編譯它,但它確實通過了單元測試; Eclipse正在掙扎,並彈出一個Java堆低,或最終溢出。我的問題是有辦法讓預處理器更容易嗎?我應該只增加我的Java堆嗎?還是有更好的方法在編譯時嵌套C宏,CRC計算,Eclipse Java崩潰
這裏填充一個表,它是:
我創建了一個CRC查找表,並決定在編譯時來填充它(關鍵字:編譯時),和不想硬編碼任何數字。所以我想出了一個宏來計算CRC,只是硬編碼多項式。 (也許稍難讀,但它通過單元測試)
// Define CRC polynomial
#define POLYNOMIAL (0x8005)
#define CRC_1ITERATION(crc) (\
(((crc)&0x7FFF)<<1)^(((crc)&0x8000)?POLYNOMIAL:0) )
然後它傳播到16次...宏16次深的重新調用!
// Iterate the CRC polynomial
#define CRC_2ITERATIONS(crc) CRC_1ITERATION( CRC_1ITERATION(crc))
#define CRC_4ITERATIONS(crc) CRC_2ITERATIONS(CRC_2ITERATIONS(crc))
#define CRC_8ITERATIONS(crc) CRC_4ITERATIONS(CRC_4ITERATIONS(crc))
#define CRC_16ITERATIONS(crc) CRC_8ITERATIONS(CRC_8ITERATIONS(crc))
CRC_16ITERATIONS()
現在的東西我可以調用到它的輸出16次迭代後過渡輸入CRC。我用它來填充我的桌子。其實,我變得更加的嵌套宏來填充表,而是保持簡單的代碼,就足以使Eclipse鬥爭:
// Populate the table (EDIT: corrected spelling)
CRC_16ITERATIONS(0), CRC_16ITERATIONS(1), CRC_16ITERATIONS(2), CRC_16ITERATIONS(3),
CRC_16ITERATIONS(4), CRC_16ITERATIONS(5), CRC_16ITERATIONS(6), CRC_16ITERATIONS(7),
CRC_16ITERATIONS(8), CRC_16ITERATIONS(9), CRC_16ITERATIONS(10), CRC_16ITERATIONS(11),
CRC_16ITERATIONS(12), CRC_16ITERATIONS(13), CRC_16ITERATIONS(14), CRC_16ITERATIONS(15)
它的工作的MinGW包括通過單元測試,但就像我說的,我想我在Java/Eclipse中吹出某種括號或宏擴展堆棧。我希望能將這個擴展到256個入口表,但我懷疑MinGW需要半個小時來編譯它。
太棒了。我完全應該看到這一點。是的,我現在可以做一個有256個入口的表沒有問題。我會更正問題中的拼寫,我不斷重新考慮並重新粘貼,顯然錯過了我添加的複數。謝謝! – Michael 2014-09-16 18:53:35