我实际上正在将一些C ++代码(我知道的很少,并且从未真正使用过)转换为C#。通常在C#中我不会发现自己做这样的事情,因为它看起来有点奇怪,但是随着C ++中代码的设置方式,我发现很难不这样做。不可否认,我对编程本身并不是很有经验,但是由于我一直在做的这段时间,我已经能够很好地掌握这些概念。
无论如何,这是C ++代码。它也在头文件中。
#ifndef _SPRITE_H_
#define _SPRITE_H_
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifndef NULL
#define NULL ((void *) 0)
#endif
typedef struct {
unsigned char *data;
int len;
int width;
int height;
} SpriteImage;
typedef struct {
unsigned char b;
unsigned char g;
unsigned char r;
unsigned char unused;
} SpritePalette;
typedef struct {
char *filename;
unsigned int nimages;
SpriteImage *images;
unsigned int palette_size;
SpritePalette *palette;
} Sprite;
typedef enum {
/* Developer errors */
SE_BADARGS,
/* sprite_new() errors */
SE_CANTOPEN,
SE_INVALID,
/* sprite_to_bmp(), sprite_to_bmp_file() and sprite_to_rgb() errors */
SE_INDEX,
/* sprite_to_bmp_file() errors */
SE_CANTWRITE
} SpriteError;
//Funcion para hacer uso de reverse_palette desde el exterior
SpritePalette * get_pal(SpritePalette *palette,int palette_len);
/* Open sprite file */
Sprite *sprite_open (const char *fname, SpriteError *error);
Sprite *sprite_open_from_data (const unsigned char *data, unsigned int size, SpriteError *error);
/* Change palette of sprite*/
void change_palete(Sprite *sprite, const char *fname, SpriteError *error);
/* Converts a sprite to bitmap file in memory */
void *sprite_to_bmp (Sprite *sprite, int i, int *size, SpriteError *error);
/* Like sprite_to_bmp(), but saves the result to a file */
int sprite_to_bmp_file (Sprite *sprite, int i, const char *writeToFile, SpriteError *error);
/* Converts a sprite to raw RGB data. The rowstride/pitch is 3*width. */
void *sprite_to_rgb (Sprite *sprite, int i, int *size, SpriteError *error);
/* Frees a Sprite* pointer */
void sprite_free (Sprite *sprite);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _SPRITE_H_ */
顺便问一下,有没有人知道“#”参考的交易是什么?
我不知道这些是指什么。
这是C#:
interface Sprite
{
public class SpriteImage
{
private byte *data;
private int length;
private int width;
private int height;
}
public class SpritePalette
{
byte b;
byte g;
byte r;
byte unused;
}
public class Sprite
{
string fileName;
uint nImages;
uint palette_size;
SpriteImage image;
SpritePalette palette;
}
public enum SpriteErrors
{
None, //--default value
BadArguments, //--dev errors
/*--errors derived from any instance/call of the NewSprite() method */
CantOpen,
Invalid,
/*SpriteToBMP(), SpriteToBMPFile(), and SpriteToRGB() errors*/
Index,
CantWrite //--SpriteToBMPFile() errors
}
public interface ISprite
{
SpritePalette GetPalette(SpritePalette palette, int paletteLength);
Sprite SpriteOpen(string firstName, SpriteErrors* error);
Sprite SpriteOpenFromData(byte* data, uint size, SpriteErrors* error);
}
我相信你可以在这里连接点。请记住,这显然不是我的代码,所以我对它并不是很了解。如果有人需要更多材料,但我很乐意在必要时提供。
答案 0 :(得分:1)
几点:
1)你的类型不应该在界面内
2)指针应该在sprite类中转换为成员,或者在SpriteImage结构中应该转换为数组
3)除非它是一个微不足道的端口,否则在没有很好地理解两种语言和要移植的代码的情况下编写它将非常困难
答案 1 :(得分:0)
您似乎正在尝试将此SourceForge项目从C ++移植到C#:
该查看器不仅用C ++编写,而且还基于Qt Toolkit。
我知道你的问题是将这个特定的头文件从C ++翻译成C#并且最好的方法是什么,但我的观点是,除非你对C ++非常熟悉并且愿意学习很多关于Qt的知识,否则你的机会很多这个移植项目的成功并不是很好。这是一个大项目,即使是在C ++和C#中都经验丰富的程序员。
但是,如果你仍然想要做这件事,那么你应该采用的方法是创建一个大的SpriteUtility
静态类,并将你找到的所有免费C ++函数放入该类{{1 C#方法。是的,您还可以将您看到的C ++结构作为嵌套类。您不需要任何接口。
它不需要是漂亮的C#代码;你试图逐字移植它,尽可能减少对它的伤害。一旦它工作,你可以重构它,使其更加面向传统的C#风格。