none
C# struct 宣告問題 RRS feed

  • 問題

  •  
    各位先進,
        
        我在宣告 structure 的時候,出現了下列的錯誤訊息。請問又如何解決呢?

    Thanks.

    Daniel



    錯誤 1 程式控制權回到呼叫端前,必須指定 'DanLib.VecLib.TPoint.FY' 欄位的值 F:\SourceCode\Libarary\DanielLibCS\Unit\VecLib\VecTypeDefine.cs 126 10 DanLib.VecLib

    宣告如下

    [StructLayout(LayoutKind.Explicit)]
     public struct TPoint // 可用 integer 或 float 參數
     {
      [MarshalAs(UnmanagedType.I4)]
      [FieldOffset(0)]
      public int X; // 4 byte
      [MarshalAs(UnmanagedType.I4)]
      [FieldOffset(4)]
      public int Y; // 4 byte

      [MarshalAs(UnmanagedType.R4)]
      [FieldOffset(0)]
      public float FX; // 4 byte
      [MarshalAs(UnmanagedType.R4)]
      [FieldOffset(4)]
      public float FY; // 4 byte

      public TPoint(int x, int y)
      {
       this.X = x;
       this.Y = y;
      }

      public TPoint(float x, float y)
      {
       this.FX = x;
       this.FY = y;
      }
     }

    2009年2月5日 上午 03:06

解答

  • 已解決。只要是宣告的變數名稱,不論是否共用欄位,都必須 初始化。

    另外一個問題: 我宣告一個 struc 如下,compile 沒有問題,但是利用 MarshalAs.SizeOf() 取得大小時,卻出現 

    因為型別於位移 '152' 處包含不正確對齊或被非物件欄位覆蓋的物件欄位,無法從組件 'DanLib.VecLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 載入型別 'DanLib.VecLib.TVecSymbol'。

    的錯誤,看起來好像是 [FieldOffset(152)] 位置不能宣告成 String 或 ArrayList,請問要如何解決呢?


    Thanks,

    Daniel




    [StructLayout(LayoutKind.Explicit, Pack = 1, CharSet = System.Runtime.InteropServices.CharSet.Ansi)]
     public struct TVecSymbol // 以 浮點數運算
     {
      #region 共用參數 ------------------------------------------------------------------------------ 
      
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] //將 Name 定義為有 64個 陣列元素 的 String
      [FieldOffset(0)]
      public String Name;
      [FieldOffset(64)]
      public TVecSymbolType SymbTp; // 1 byte
      [FieldOffset(65)]
      public TIslandHole IslandHole; // 1 byte, 如果是 hiHole, 則表示下方是透空的
      [FieldOffset(66)]
      public float LineWidth; //4 byte
      [FieldOffset(70)]
      public TFRect MinMax; // 16 byte
      [FieldOffset(86)]
      public float Degree;  // 4byte
      [FieldOffset(90)]
      public Cardinal ShareCount; // 4 byte, 總共被多少個 TShapeA 共用
      
      //非圖形幾何定義參數 ----------------------
      [FieldOffset(94)]
      public TShapeStates States; // 1 byte
      [FieldOffset(95)] TFillRec FillRec; // 預留 40 byte
      [FieldOffset(135)]
      public IntPtr pExtension; // 4byte, 指向額外的資料結構 如 屬性、網路.....等等日後加上的額外資料結構
      [FieldOffset(139)]
      public IntPtr pDummy; // 4byte, 用來做臨時的資料運算暫存之用,不可用來指向,或放置重要的資料,因為隨時會被 洗掉
      
      //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] // 表示有 32 個元素
      //[FieldOffset(144)] 
      //public TFPoint[] Points; // 32 * 8 byte, Array 一定要以 4 的倍數當作 FieldOffset 的值,否則會出現錯誤
      
      #endregion


      #region 共用欄位參數(從 offset 152 開始 )----------------------------------------------------------------------------

      //case TVecSymbolType of
      //stText: ---------------------------------------------
      [MarshalAs(UnmanagedType.LPStr)]
      [FieldOffset(152)]
      public String pFontName; // 4 byte
      [MarshalAs(UnmanagedType.LPStr)]
      [FieldOffset(156)]
      public String pText;  // 4 byte
      [FieldOffset(160)]
      public float txHeight;  // 4 byte, 實際座標高度
      [FieldOffset(164)]
      TFPoint txAnchorXY; // 8 byte txAnchor 在 左下角, 實際座標

      
      //stSqrLine,stExtendSqrLine, stRndLine:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint lineSXY; // 8 byte
      [FieldOffset(160)]
      public TFPoint lineEXY; // 8 byte

      //stBzCurve:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint bcXY1;  // 8 byte
      [FieldOffset(160)]
      public TFPoint bcXY2;  // 8 byte
      [FieldOffset(168)]
      public TFPoint bcCP1;  // 8 byte
      [FieldOffset(176)]
      public TFPoint bcCP2;  // 8 byte

      //stBSpline:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint bsXY1;  // 8 byte
      [FieldOffset(160)]
      public TFPoint bsXY2;  // 8 byte
      [FieldOffset(168)]
      public TFPoint bsCP;  // 8 byte

      //stArc:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint arcStart; // 8 byte
      [FieldOffset(160)]
      public TFPoint arcEnd;  // 8 byte
      [FieldOffset(168)]
      public TFPoint arcCenter; // 8 byte
      [FieldOffset(176)]
      public TRealCoordOrient arcOrient;  // 1 byte arcOrient 為螢幕座標系統
      
      //stRect,stRndRect,stDiamond:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint rectCenter; // 8 byte
      [FieldOffset(160)]
      public float rectRadX;  // 4 byte
      [FieldOffset(164)]
      public float rectRadY;  // 4 byte
      [FieldOffset(168)]
      public float rectCornerRad; // 4 byte
      
      //stNSidePolygon, stNSideStar:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint npCenter; // 8 byte
      [FieldOffset(160)]
      public float npRad;  // 4 byte
      [FieldOffset(164)]
      public float npInnRad;  // 4 byte
      [FieldOffset(168)]
      public ushort npSideNum; // 2 byte
      
      //stSqrDonut,stRndDonut:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint donutCenter;// 8 byte
      [FieldOffset(160)]
      public float donutOutRad;  // 4 byte
      [FieldOffset(164)]
      public float donutInnRad;  // 4 byte
      
      //stEllipse, stOval:--------------------------------------------
      [FieldOffset(152)]
      public TFPoint ellipseCenter; // 8 byte
      [FieldOffset(160)]
      public float ellipseRadX;  // 4 byte
      [FieldOffset(164)]
      public float ellipseRadY;  // 4 byte
      
      //stPolyLine, stPolygon,stFreeHand,stBSPolyline, stBSPolygon:-// TList of pPoint----------------------------------
      [FieldOffset(152)]
      public ArrayList PointList; // 4 byte

      
      //stBezierPolyLine, stBezierPolygon: //TList of pBezierPoint ---------------------------
      [FieldOffset(152)]
      public ArrayList BzPointList; // 4 byte


      // // 一種由 point, arc, bzCurve 組成的 Polygon, 如 Odb++ 的 surface 結構, TList of pVecSymbol ------------------------------------------------------
      // stSurfacePolygon, 
      // stIslandHoleSurface, // 一種由各種封閉形狀正負疊合成透空 Surface, (Rect, RndRect, SqrDonut, RndDonut, Ellipse, Oval,
      // polygon, Bezier Polygon, SurfacePolygon) ------
      // stSymbolGroup:
      [FieldOffset(152)]
      public ArrayList SymbolGrpList;  // 各種 Shape 的群組,   UnifyIslandHoleFillRec:統一所有 Island 的 Fill 模式

      #endregion

    }

    • 已標示為解答 Lolota Lee 2009年2月11日 上午 01:49
    2009年2月6日 上午 09:56