我必須整合來自tetgen(網格生成器)的代碼,這顯然是經常使用的代碼。但是,我必須使用舊版本(1.4.3而不是1.5),這給我一個'寫入訪問衝突'。 相關的功能是在這裏:爲什麼會將指針從double ***轉換爲double **以寫入訪問衝突?
void tetgenmesh::dummyinit(int tetwords, int shwords)
{
unsigned long alignptr;
// Set up 'dummytet', the 'tetrahedron' that occupies "outer space".
dummytetbase = (tetrahedron *) new char[tetwords * sizeof(tetrahedron)
+ tetrahedrons->alignbytes];
// Align 'dummytet' on a 'tetrahedrons->alignbytes'-byte boundary.
alignptr = (unsigned long) dummytetbase;
dummytet = (tetrahedron *)
(alignptr + (unsigned long) tetrahedrons->alignbytes
- (alignptr % (unsigned long) tetrahedrons->alignbytes));
// Initialize the four adjoining tetrahedra to be "outer space". These
// will eventually be changed by various bonding operations, but their
// values don't really matter, as long as they can legally be
// dereferenced.
dummytet[0] = (tetrahedron) dummytet;
dummytet[1] = (tetrahedron) dummytet;
dummytet[2] = (tetrahedron) dummytet;
dummytet[3] = (tetrahedron) dummytet;
...
...
...
}
「dummytetbase」和「dummytet」都是雙***球,四面體是雙**指針。
示例值包括:
'tetwords' 是:12.
'(無符號長整數)tetrahedrons-> alignbytes':8.
「tetwords *的sizeof(四面體)+ tetrahedrons- > alignbytes'是:104
'(alignptr%(無符號長整數)tetrahedrons-> alignbytes)' 是:0.
代碼編譯很好,但是當指針CAS從'dummytet'到'dummytet [0]'應該完成,我得到這個'寫訪問衝突'。
因此,dummytet獲得dummytetbase + 8的地址。而且dummytet [x]獲得所有相同的地址,但這會導致寫入違規。
任何想法爲什麼發生這種情況? 謝謝!
這是tetgen的原始代碼。我沒有改變一個單詞... – sciloop
我用'uint32_t'替換了'unsigned long',但是寫入訪問衝突仍然存在... – sciloop
很難真正地說出未經調試的情況。也許試圖找出誰來維護圖書館的電子郵件。 – AndyG