2015-08-29 34 views
0

在64位Mac/OSX環境中編譯和彙編fpc(Free Pascal編譯器)時,如何解決並修復致命的Data element too large錯誤?編譯+使用fpc進行彙編+(在OSX上)時出現「數據元素太大」錯誤

看來,錯誤的原因可能是array[0..MaxInt]調用(請參閱下面的更多細節),但如果是這樣,我不知道如何解決或解決它。

詳情:使用fpc 3.0.0-RC1從ftp://freepascal.stack.nl/pub/fpc/beta/3.0.0-rc1/i386-macosx/安裝(從pc-3.0.0rc1.intel-macosx.dmg圖像)從https://github.com/whatwg/wattsi運行build.sh腳本時,我收到錯誤。 (注:README.md file says I need to use 3.0.0-rc1 specifially - 我猜,v2.6.4,最新的穩定?)。

構建運行良好,直到在編譯https://github.com/whatwg/wattsi/blob/master/src/html/htmlparser.pas源代碼之後,它在嘗試組裝該源代碼時出現Data element too large錯誤。

具體來說,它會記錄下:htmlparser.pas(336,42) Error: Data element too large。和線333到htmlparser.pas文件看起來像這樣的336:

type 
    TBlob = Pointer; 
    PBlobArray = ^TBlobArray; 
    TBlobArray = array[0..MaxInt] of TBlob; 

...所以我懷疑Data element too large錯誤是由它運行到某種類型的系統限制造成的,由於array[0..MaxInt]

我排除故障的程度嘗試到目前爲止,在https://github.com/whatwg/wattsi/blob/master/src/lib/compile.sh文件被由編譯來源,有一個與ulimit -v 800000,我想也可能會被過度限制內存資源,所以我刪除該行並重新線-ran構建腳本,但我仍然在完全相同的位置得到了Data element too large錯誤。

我在Free Pascal所有的n00b,所以在這一點上,我完全被這個錯誤難住。

回答

1

最近的FPC做了一個編譯時間範圍檢查。這個範圍檢查確定編譯時間該類型是太大了,即使它從來沒有實際分配(總是使用指針,舊的Delphi版本不能過度索引指針,所以這個構造被使用)

這是一個已知的限制技術,嚴格來說原始來源是越野車。

由於該類型可能從未被分配,因此只需重新調整所述生物物種以適合,例如,

TBlobArray = array[0..MaxInt div sizeof(tblob)] of TBlob; 

(也許減去一些因素可以肯定的,我不知道是否2GB-2是真正的限制,IIRC老DELPHIS有下限)

甚至乾脆

TBlobArray = array[0..0] of TBlob; 

並禁用運行時檢查您訪問它的位置。高的上限是一個人爲的構造不運行到運行時檢查

0

嘗試在src/build.shDEFINES線從

DEFINES="-dUSEROPES -dLINES -dPARSEERROR"

DEFINES="-dUSEROPES -dLINES -dPARSEERROR -Px86_64"

其實這是一個新鮮的音符加入到回購起源改變README.md

+1

謝謝,我意識到自述的變化 - 我實際上是添加它的人:-)我只是沒有時間去我自己在這裏發佈解釋作爲答案,但現在將嘗試做出這種解釋。 – sideshowbarker