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;
}
#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;
}
void doSomething(char[] buf, ptr, int len)
{}void main()
{
usigned char[] buf = new char[100];
doSomething(buf[20],10);
}
{
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;
}
}
}眼都看花了,
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
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 }
}
Question 8:更有难度!就那个二维数组和联合体,就够别人喝一壶了!3楼的完全不对!还有Question 5:看似简单,可是涉及C#与C++一个根本区别:指针使用,C++可以将数组参数退化为指针,并且在指针上进行地址操作,C#不行!所以2楼的使用doSomething传递参数buf[20]是错误的!估计你这些问题会难倒好一批人!如果一个能完全搞定所以问题,基本上net的平台调用、互操作到了很高水平!
3L那个,我只知道 用 [StructLayout(LayoutKind.Explicit)]和[FieldOffset(0)]标一样来实现 union
关于C++转C#,很多都不懂看得眼好花
{ } 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);
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; }