Question 4: Using c# re-implement following
#ifdef USING_POSTSCRIPT_NAMES
#define GET_MAC_NAME( x )  ( (char*)ptrnames->macintosh_name( x ) )
#else 
#define GET_MAC_NAME( x )  ( (char*)tt_post_default_names[x] )   static const char* const  tttt_post_default_names[258] =
  {
    ".notdef", ".null", "CR", "space", "exclam",
    "quotedbl", "numbersign", "dollar", "percent", "ampersand",  };
Question 5: Using c# re-implement following
void doSomething(unsigned char* ptr, int len)
{}void main()
{
  usigned char*  buf = new char[100];
  doSomething(buf+20,10);
  
}
Question 6:Using c# re-implement following#define DEFINE_SERVICE( name )            \
  typedef struct MY_Service_ ## name ## Rec_ \
    FT_Service_ ## name ## Rec ;             \
  typedef struct MY_Service_ ## name ## Rec_ \
    const * MY_Service_ ## name ;            \
  struct MY_Service_ ## name ## Rec_  typedef int (*ValueFunc)( const char*  glyph_name );  typedef const char*  (*NameFunc)( int  name_index );  DEFINE_SERVICE( TestService )
  {
    ValueFunc       unicode_value;    NameFunc      macintosh_name;
  };
Question 7:Using c# re-implement following
#define MY_FRAME_START( size )   { 0, 0, size }
#define MY_FRAME_END             { 100, 0, 0 }#define MY_FIELD_SIZE( f ) \
          (unsigned char)sizeof ( ((MY_STRUCTURE*)0)->f )
#define MY_FIELD_OFFSET( f ) \
          (unsigned short)( offsetof( MY_STRUCTURE, f ) )#define MY_FRAME_FIELD( frame_op, field ) \
          {                               \
            frame_op,                     \
            FT_FIELD_SIZE( field ),       \
            FT_FIELD_OFFSET( field )      \
          }#define MY_FRAME_ULONG( f )      MY_FRAME_FIELD( 1, f )
#define MY_FRAME_SHORT( f )      MY_FRAME_FIELD( 2, f )  typedef struct  Frame_Field_
  {
    unsigned char    value;
    unsigned char    size;
    unsigned short  offset;  } MY_Frame_Field;
  
  typedef struct  TestHeader_
  {
    long   Version;
    short   Ascender;
    short   Descender;
    short   Line_Gap;
  } TestHeader;
  
  
    const MY_Frame_Field  test_header_fields[] =
    {
#undef  MY_STRUCTURE
#define MY_STRUCTURE  TestHeader      MY_FRAME_START( 10 ),
        MY_FRAME_ULONG ( Version ),
        MY_FRAME_SHORT ( Ascender ),
        MY_FRAME_SHORT ( Descender ),
        MY_FRAME_SHORT ( Line_Gap ),
      MY_FRAME_END
    };Question 8: Using c# re-implement following
struct st_test_function
{
int m;
int n;
float domain[100][2];
int hasrange; union
{
struct {
unsigned short bps;
int size[100];
float encode[100][2];
float decode[100][2];
int *samples;
} st_00; struct {
float n;
float c0[100];
float c1[100];
} st_01; struct {
int k;
st_test_function **funcs; 
float *bounds; 
float *encode; 
} st_02; } u;
};static void Test_Func(st_test_function* func)
{
  func->u.st_01.c0[0] = 1.1;
  func->u.st_02.k = 10;
}

解决方案 »

  1.   

    Question 5:
    void doSomething(char[] buf, ptr, int len)
    {}void main()
    {
      usigned char[] buf = new char[100];
      doSomething(buf[20],10);
       
    }
      

  2.   

    第8题类似struct st_test_function
        {
            public int m;        public int n;        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100*2)]
            public float[] domain;        public int hasrange;        [StructLayout(LayoutKind.Explicit)]
            struct u
            {
                [FieldOffset(0)]
                struct st_00
                {
                    public ushort bps;                [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100)]
                    public int size;                [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100*2)]
                    public float[] encode;                [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100*2)]
                    public float[] decode;                public int samples;
                }
            }
        }眼都看花了,
      

  3.   

    Question 4
    static string[] tttt_post_default_names = { ".notdef", ".null", "CR", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand" };#if USING_POSTSCRIPT_NAMES
            static string GET_MAC_NAME(int x)
            {
                return ptrnames.macintosh_name(x);
            }
    #else
            static string GET_MAC_NAME(int x)
            {
                return tttt_post_default_names[x];
            }
    #endif
      

  4.   

    给你一个完整的:
    Question 4:
     C#不建议使用宏定义:因为会造成类型不安全,所以你直接使用常量数组:  public readonly string[258] tttt_post_default_names =
      {
      ".notdef", ".null", "CR", "space", "exclam",
      "quotedbl", "numbersign", "dollar", "percent", "ampersand",  };
    Question 5:  void doSomething(byte[] ptr, int len)
    {}void main()
    {
      byte[] buf = new char[100];
      doSomething(buf[],10);
      
    }
    Question 6: 函数指针用委托替代public delegate int ValueFunc(string glyph_name );
    public delegate string NameFunc( int name_index );里面的那个红替换,转换出来怪怪的:
      typedef struct MY_Service_TestServiceRec_ FT_Service_TestServiceRec ; 
      typedef struct MY_Service_TestServiceRec_ const * MY_Service_TestService ; 
      struct MY_Service_TestServiceRec_
      {
    ValueFunc unicode_value;
    NameFunc macintosh_name;
      };让我有点莫名!在C#里,没有typedef ,直接使用原始结构体定义的名称:
    [ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
    public struct MY_Service_TestServiceRec_{
         public ValueFunc unicode_value;
         public NameFunc macintosh_name;
    }Question 7:遇到同6一样问题,红替换出来的东西莫名![ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
    public struct MY_Frame_Field{
      public byte    value;
      public byte    size;
      public ushort offset;
    }[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
    public struct TestHeader{
      public int     Version;
      public short Ascender;
      public short Descender;
      public short Line_Gap;
    }//这个就是莫名的地方
    C++:
      const MY_Frame_Field test_header_fields[] =
      {
        { 0, 0, 10 },
        { 1, FT_FIELD_SIZE( Version ), FT_FIELD_OFFSET( Version ) },
        { 2, FT_FIELD_SIZE( Ascender ), FT_FIELD_OFFSET( Ascender ) },
        { 2, FT_FIELD_SIZE( Descender ), FT_FIELD_OFFSET( Descender ) },
        { 2, FT_FIELD_SIZE( Line_Gap ), FT_FIELD_OFFSET( Line_Gap ) },
        { 100, 0, 0 }
      };
    C#
     public readonly MY_Frame_Field test_header_fields[] =
      {
          { 0, 0, 10 },
          { 1, FT_FIELD_SIZE( Version ), FT_FIELD_OFFSET( Version ) },
          { 2, FT_FIELD_SIZE( Ascender ), FT_FIELD_OFFSET( Ascender ) },
          { 2, FT_FIELD_SIZE( Descender ), FT_FIELD_OFFSET( Descender ) },
         { 2, FT_FIELD_SIZE( Line_Gap ), FT_FIELD_OFFSET( Line_Gap ) },
        { 100, 0, 0 }    
     }
      

  5.   

    靠,你这份不好得啊,会把人搞晕!建议你把分值提高到300!另外,如果完全把所有的问题一次性搞定,建议你捐给别人1000分!前提是保证正确:有测试例子。我不敢奢望,太头晕了!
    Question 8:更有难度!就那个二维数组和联合体,就够别人喝一壶了!3楼的完全不对!还有Question 5:看似简单,可是涉及C#与C++一个根本区别:指针使用,C++可以将数组参数退化为指针,并且在指针上进行地址操作,C#不行!所以2楼的使用doSomething传递参数buf[20]是错误的!估计你这些问题会难倒好一批人!如果一个能完全搞定所以问题,基本上net的平台调用、互操作到了很高水平!
      

  6.   


    3L那个,我只知道 用 [StructLayout(LayoutKind.Explicit)]和[FieldOffset(0)]标一样来实现 union 
    关于C++转C#,很多都不懂看得眼好花
      

  7.   

    Question 5:  改成这样:        void doSomething(IntPtr ptr, int len)
            {        }        void main()
            {
                byte[] bytes = new byte[100];
                IntPtr ptr = Marshal.AllocHGlobal(100);
                Marshal.Copy(bytes, 0, ptr, 100);            IntPtr newPtr = Marshal.ReadIntPtr(ptr, 20);  //这里:指针首地址偏移20
                doSomething(newPtr, 10);
      

  8.   

    Question 8:完整解决:    [StructLayout(LayoutKind.Sequential)]
        public struct st_test_function
        {
            public int m;
            public int n;        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public FloatStru[] domain;        public int hasrange;        public UStru u;    };    [StructLayout(LayoutKind.Sequential)]
        public struct FloatStru
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
            public float[] a;
        };
        [StructLayout(LayoutKind.Explicit)]
        public struct UStru
        {
            [FieldOffset(0)]
            public ST_00 st_00;
            [FieldOffset(0)]
            public ST_01 st_01;
            [FieldOffset(0)]
            public ST_02 st_02;
        };    [StructLayout(LayoutKind.Sequential)]
        public struct ST_00
        {
            public ushort bps;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public int[] size;        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public FloatStru[] encode;        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public FloatStru[] decode;        public System.IntPtr samples;
        };
        [StructLayout(LayoutKind.Sequential)]
        public struct ST_01
        {
            public float n;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public float[] c0;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public float[] c1;
        }    [StructLayout(LayoutKind.Sequential)]
        public struct ST_02
        {
            public int k;
            public IntPtr funcs;
            public IntPtr bounds;
            public IntPtr encode;    }