2013年8月31日 星期六

修正UnrealScript不能使用out bool array的問題

在UnrealScript中不允許使用宣告使用out bool參數的函式,例如:
function TestOutBool(out bool Bool);
編譯器會回報"Booleans may not be out parameters"。

這是因為布林變數實作上其實只是個bitfield,在編譯時同一個類別的布林屬性會湊在一起,儘量減少總共需要的大小。然而如果把上述宣告為原生函式,要產生C++標頭檔時,會遇到無法在C++中表示reference to bitfield的問題。雖然可以為這種情況作特殊處理,不過其實只要改為宣告為out byte就可以解決了。

然而宣告使用out array<bool>參數的函式會遇到編譯器回報同樣的錯誤:
function TestOutBoolArray(out array<bool> Array);
這其實是編譯器的誤判,在語法剖析後token會轉為對應的UProperty來保存相關的屬性資訊,然而在轉換後布林陣列的token會失去陣列資訊而變成跟布林的token一樣。剛好out參數的檢查是在這之後執行,所以才造成這個問題。

其實只要在檢查時順便確認轉換後的UProperty是不是UArrayProperty就可以避免這個情形了:
                else if( Property.Type==CPT_Bool && (Property.PropertyFlags & CPF_OutParm) 
                 && !Prop->IsA(UArrayProperty::StaticClass()) )
                {
                    ScriptErrorf(SCEL_Restricted,  TEXT("Booleans may not be out parameters") );
                }

沒有留言:

張貼留言