0

我实际上正在将一些 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);


    } 

我相信你可以在这里连接点。请记住,这显然不是我的代码,所以我不太了解它。如果有人需要更多材料,但我很乐意在必要时提供。

4

2 回答 2

1

几点:
1)你的类型不应该在接口内
2)指针应该被转换为你在 sprite 类中的成员或你应该在 SpriteImage 结构中拥有的数组
3)除非它一个微不足道的移植,如果不很好地理解两种语言和要移植的代码,将很难编写

于 2011-05-22T03:21:33.840 回答
0

您似乎正在尝试将此 SourceForge 项目从 C++ 移植到 C#:

该查看器不仅是用 C++ 编写的,而且还基于Qt Toolkit

我知道你的问题是关于将这个特定的头文件从 C++ 翻译成 C#,什么是最好的方法,但我的意见是,除非你对 C++ 非常熟悉并且愿意学习很多关于 Qt 的知识,否则你成功的机会在这个移植项目不是很好。即使对于同时使用 C++ 和 C# 的程序员来说,这也是一个大项目。

但是,如果您仍然想做这件事,那么您应该采取的方法是创建一个大型静态类,并将您找到的所有免费 C++ 函数作为C# 方法SpriteUtility放入该类中。static是的,您也可以将您看到的 C++ 结构体作为嵌套类。你不需要任何接口。

它不需要是漂亮的 C# 代码;您正在尝试逐字移植它,尽可能减少对它的损害。一旦它开始工作,您就可以对其进行重构,使其在传统 C# 风格中更加面向对象。

于 2011-05-22T03:17:19.327 回答