none
Structure 陣列指標的問題(For Shared Memory) RRS feed

  • 一般討論

  • (C#)

    我想利用結構陣列以及結構陣列指標來處理資料,

    以下2個範例

    1.第一個範例單純為結構指標,執行沒問題

    2.第二個範例增加“結構陣列,陣列大小為2”,執行會有問題,

      執行時出現錯誤:“固定大小緩衝區型別必須是下列其中一種: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float 或 double”

    註:我有設定專案容許執行Unsafe程式碼

    3.因為我的程式需要利用結構陣列以及結構指標,並且利用SHARE MEMORY處理資料,請各位前輩幫我看看程式的問題,謝謝。

    ----------------------------------------------------

    --範例一:(執行沒問題)

    public partial class Form1 : Form
    {
       
            public struct Book
            {
                public int ISBN;
                public int Title;
                public int Author;
             
            }
           
            private unsafe void button4_Click(object sender, EventArgs e)
            {

                Book _Book = new Book();

                Book* Pointer_Of_Book; //BOOK指標

                Pointer_Of_Book = &_Book;

                Pointer_Of_Book->ISBN = 1;
                Pointer_Of_Book->Title = 2;
                Pointer_Of_Book->Author = 3;

                textBox1.Text = Pointer_Of_Book->ISBN.ToString();
                textBox2.Text = Pointer_Of_Book->Title.ToString();
                textBox3.Text = Pointer_Of_Book->Author.ToString();
              
            }              
       
    }


    --------------------------------------------------------------

    --範例二:

    --(執行時出現錯誤:“固定大小緩衝區型別必須是下列其中一種: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float 或 double”)


    public partial class Form1 : Form
    {
       
            public struct Book
            {
                public int ISBN;
                public int Title;
                public int Author;
             
            }
           
           
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public unsafe struct Book_Array_Structure_2
            {
               [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
                
                //錯誤 固定大小緩衝區型別必須是下列其中一種: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float 或 double
               public fixed Book Book_Array[2];

            }       
           
           
            private unsafe void button5_Click(object sender, EventArgs e)
            {

                Book_Array_Structure_2 My_Book_Array_Structure_2 = new Book_Array_Structure_2();

                Book_Array_Structure_2* Pointer_Book_Array_Structure;
                Pointer_Book_Array_Structure = &My_Book_Array_Structure_2;


                My_Book_Array_Structure_2.Book_Array[0].ISBN = 1;
                My_Book_Array_Structure_2.Book_Array[0].Title = 2;
                My_Book_Array_Structure_2.Book_Array[0].Author = 3;

            }
                                  
    }

     



    2011年6月26日 上午 08:39

所有回覆

  • MSDN 說明有提到:

     

    在 C# 2.0 中,您可以使用 fixed 陳述式,在資料結構中建立固定大小的陣列。這個處理方式在使用現有的程式碼時會非常實用,例如,以其他語言撰寫的程式碼、已存在的 DLL 或 COM 專案。固定的陣列可以使用規則性結構成員所允許的任何屬性 (Attribute) 或修飾詞 (Modifier)。唯一的限制是陣列型別 (Array Type) 必須為boolbyte char shortintlongsbyteushortuintulongfloat 或 double

    public fixed Book Book_Array[2];

    很顯然 Book 並不是 boolbyte char shortintlongsbyteushortuintulongfloat 或 double 

    可以改成 

    public fixed int Book_Array[6];

     


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度
    2011年6月26日 上午 09:26
  •  

    因為我必須使用 結構陣列來處理我的資料,

      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public unsafe struct Book_Array_Structure_2
            {
               [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
                
                //錯誤 固定大小緩衝區型別必須是下列其中一種: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float 或 double
               public fixed Book Book_Array[2];

            }               

    不適合用以下這類的int, char 等實值型別(VALUE-TYPE)的陣列來直接處理

     int Book_Array[6];

    因為我之前在DELPHI開發工具可以宣告結構陣列並取得結構陣列的位址與其指標的設定,

    但在C#中卻無法無法依樣畫葫蘆。

    我在其他文章有看到STRUCTURE應該也是VALUE-TYPE的型別,

    但為何無法使用該結構陣列指標?

    2011年6月26日 下午 03:35
  • 只是為了做Share Memory嗎?

    .Net4之後有MemoryMappedFile類別可以用

    2011年6月26日 下午 03:52
  •  

    .Net framework4的  MemoryMappedFile類別

    可以做到傳統SHARED MEMORY的Kernel32.dll中的類似

    CreateFile, OpenFileMapping, CreateFileMapping, MapViewOfFile等功能

    以達到不同程式之間的互相溝通資料的目的嗎?

     

     

    2011年6月26日 下午 04:42
  • Hi,

    MemoryMappedFile可參閱

    .NET 4.0 New Feature - Memory Mapped File

    http://www.dotblogs.com.tw/larrynung/archive/2010/11/12/19418.aspx


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年6月27日 上午 03:01
  • Hi,

    這邊想請您確定一下~若您不加fixed這個關鍵字的話是會發生甚麼狀況?


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年6月27日 上午 03:51
  •  

    這邊想請您確定一下~若您不加fixed這個關鍵字的話是會發生甚麼狀況?

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6

    =>

    public fixed Book Book_Array[2];

    //這行程式碼會發生以下錯誤:

    錯誤 1 無效的陣列宣告子: 若要宣告 Managed 陣列,陣序規範必須置於變數的識別項之前。若要宣告固定大小緩衝區欄位,請在欄位型別前面使用 fixed 關鍵字。

     

    若不宣告陣列大小,則定義陣列指標也會有問題。

    2011年6月27日 上午 07:22
  • Hi,

    改成下面這樣看看

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

        public struct Book_Array_Structure_2

        {

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]

     

            public Book[] Book_Array;

     

        }    

     

    若後續這方面還有其它問題,可參閱

    http://www.google.com.tw/search?hl=zh-TW&q=marshal+nested+struct&oq=marshal+nested+struct&aq=f&aqi=&aql=undefined&gs_sm=e&gs_upl=88370l91713l0l9l9l1l0l0l0l209l969l4.3.1l8

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年6月27日 下午 02:23
  •  

     public Book[] Book_Array;

     不加 fixed,compile是會發生以下錯誤

    錯誤 1 無效的陣列宣告子: 若要宣告 Managed 陣列,陣序規範必須置於變數的識別項之前。若要宣告固定大小緩衝區欄位,請在欄位型別前面使用 fixed 關鍵字。

     

    =》 GOOGLE了很多文章,在C#中,似乎若要用結構指標,

         則結構中只能用 bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float 或 double
         這點跟DELPHI不同。 

     

         

     

    2011年6月29日 上午 03:19
  • Hi,

    我的寫法跟你本來寫的

    public fixed Book Book_Array[2];

    是不一樣的

    我是試過了編譯OK才回你的

    你的編譯器編譯出來的應該不會跟我的是不一樣的吧

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApplication1
    {
     class Program
     {
      static void Main(string[] args)
      {
      }
     }
    
     public struct Book
     {
      public int ISBN;
      public int Title;
      public int Author;
    
     }
    
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
     public struct Book_Array_Structure_2
     {
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
      public Book[] Book_Array;
     } 
    }
    
    


     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年7月16日 上午 07:46