C语言不会,有一些题请大家帮忙转为C#

leixueqiyi 2011-10-13 04:06:27
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;
}

...全文
280 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
leixueqiyi 2011-10-17
  • 打赏
  • 举报
回复
其实是别人问我,但是我不会C
我先拿去看看你,如果可以,过两天来结贴,分不够再加
风骑士之怒 2011-10-14
  • 打赏
  • 举报
回复
有几个地方也不太清楚,你参考下好了
风骑士之怒 2011-10-14
  • 打赏
  • 举报
回复
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
马少华 2011-10-14
  • 打赏
  • 举报
回复
建议你对上面的功能进行c++二次简化封装,再转化为c#
zhouzhenhuaqaz 2011-10-14
  • 打赏
  • 举报
回复
这 茫然了。。 帮你顶一下
sdl2005lyx 2011-10-14
  • 打赏
  • 举报
回复
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);
风骑士之怒 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sdl2005lyx 的回复:]
给你一个完整的:
Question 4:
C#不建议使用宏定义:因为会造成类型不安全,所以你直接使用常量数组:

C# code


public readonly string[258] tttt_post_default_names =
{
".notdef", ".null", "CR", "space", "exclam",
"quotedbl", "……
[/Quote]
学习
风骑士之怒 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wknight_it 的回复:]
引用 9 楼 sdl2005lyx 的回复:
靠,你这份不好得啊,会把人搞晕!建议你把分值提高到300!另外,如果完全把所有的问题一次性搞定,建议你捐给别人1000分!前提是保证正确:有测试例子。我不敢奢望,太头晕了!
Question 8:更有难度!就那个二维数组和联合体,就够别人喝一壶了!3楼的完全不对!

还有Question 5:看似简单,可是涉及C#与C++一个根本区别:指针使用……
[/Quote]
应该说,平时这方面没什么需求,一直没去研究过
风骑士之怒 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sdl2005lyx 的回复:]
靠,你这份不好得啊,会把人搞晕!建议你把分值提高到300!另外,如果完全把所有的问题一次性搞定,建议你捐给别人1000分!前提是保证正确:有测试例子。我不敢奢望,太头晕了!
Question 8:更有难度!就那个二维数组和联合体,就够别人喝一壶了!3楼的完全不对!

还有Question 5:看似简单,可是涉及C#与C++一个根本区别:指针使用,C++可以将数组参数退化为指针,并且在指针上进……
[/Quote]

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

看得眼好花

sdl2005lyx 2011-10-14
  • 打赏
  • 举报
回复
靠,你这份不好得啊,会把人搞晕!建议你把分值提高到300!另外,如果完全把所有的问题一次性搞定,建议你捐给别人1000分!前提是保证正确:有测试例子。我不敢奢望,太头晕了!
Question 8:更有难度!就那个二维数组和联合体,就够别人喝一壶了!3楼的完全不对!

还有Question 5:看似简单,可是涉及C#与C++一个根本区别:指针使用,C++可以将数组参数退化为指针,并且在指针上进行地址操作,C#不行!所以2楼的使用doSomething传递参数buf[20]是错误的!

估计你这些问题会难倒好一批人!如果一个能完全搞定所以问题,基本上net的平台调用、互操作到了很高水平!
sdl2005lyx 2011-10-14
  • 打赏
  • 举报
回复
给你一个完整的:
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 }


sdl2005lyx 2011-10-14
  • 打赏
  • 举报
回复
注意:对二维数组和联合体的处理!
sdl2005lyx 2011-10-14
  • 打赏
  • 举报
回复
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;

}
ycproc 2011-10-14
  • 打赏
  • 举报
回复
好长时间木有C了
leixueqiyi 2011-10-13
  • 打赏
  • 举报
回复
最好每个题解答,分不够再加
风骑士之怒 2011-10-13
  • 打赏
  • 举报
回复
第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;
}
}
}

眼都看花了,
堕之羽翼 2011-10-13
  • 打赏
  • 举报
回复
Question 5:


void doSomething(char[] buf, ptr, int len)
{

}

void main()
{
usigned char[] buf = new char[100];
doSomething(buf[20],10);

}


636f6c696e 2011-10-13
  • 打赏
  • 举报
回复
路过帮顶下~

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧