2011-11-03 62 views
3

任何一個可以幫助我。我有這個'非託管'的.NET代碼,可以在PC平臺和OSX上使用MonoTouch Device Simulator。但是當我在iPad 2設備上運行代碼時,它會引發異常。我試圖讓代碼很簡單,以顯示問題。MonoTouch的和不安全的浮點

var buffer = new byte[ 8 ]; // Space for 2 float32. 
float value = 123f;          

fixed (byte* ptr = &buffer[1]) 
{ 
    var fp = (float*)ptr; 
    *fp = value; 
} 

在我的設備,它工作時在&緩衝器[]索引是0,4 - 四字節對齊作爲FLOAT32,但沒有在所有其他。

我很想知道,是它在MonoTouch的不安全實現中的錯誤或者是我,想念.NET和不安全代碼的一些信息。

我已經做了一個變通,當我在浮動句柄時讀取/寫入4字節緩衝區,然後將數據複製到數組中的正確位置,但仍然可以很好地知道,如果我錯過了解有關.NET/iPad設備浮點處理的內容,或者它是一個錯誤。 int64類型沒有問題。

我們使用,因爲TCP通信至PLC裝置的不安全陣列處理,是我們使用用於增益可以通過更高的數據的數據的UINT8/UINT16和傳送塊的陣列。

如果有人有時間,這裏是測試功能,嘗試重現:

BugTest(8); // Returns 「S0,S1,S2,S3,S4,S5,S6,S7,」 On my pc and mac with iPad simulator. 
BugTest(8); // Returns 「S0,F1,F2,F3,S4,F5,F6,F7,」 On my iPad device. 


unsafe string BugTest(int numberOfIndexesTest) 
{ 
    var testResult = new StringBuilder(); 
    var buffer = new byte[ numberOfIndexesTest + sizeof(float)];  
    float value = 123f;          

    for(var index=0; index<numberOfIndexesTest;index++) 
    { 
     try 
     { 
      fixed (byte* ptr = &buffer[index]) 
      { 
       var fp = (float*)ptr; 
       *fp = value; 

       testResult.AppendLine(string.Format("S{0},", index)); 
      } 
     } 
     catch(Exception e) 
     { 
      testResult.AppendLine(string.Format("F{0},", index)); 
     } 
    } 

    return testResult.ToString(); 
} 

非常感謝,

最好的問候, 卡斯帕沃勒森

回答

4

這是不是一個MonoTouch的問題,因爲你在C,C++,ObjectiveC中會遇到同樣的問題...

用於iOS設備的ARM處理器需要float在4個字節邊界上對齊。該架構不具備這一要求 - 這就是爲什麼它的工作原理在模擬器上,OSX,窗口...

UPDATE:ARM structured alignment FAQ

+0

謝謝您的回答。很高興知道什麼課程是例外。 –

+0

沒問題。一旦解決了,你應該將問題標記爲已回答(綠色標記,你可以點擊),以便其他人搜索stackoverflow可以看到有答案可用。如果你只喜歡答案(但不認爲它是完整的),那麼你可以'投票'(向上箭頭)。當然,你可以同時做(投票和標記爲答案)。有疑問請看常見問題解答 - 歡迎訪問stackoverflow.com – poupou