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)ポインタは、スプライトクラスにあるようにメンバーに変換するか、SpriteImage構造体にある必要があるように配列に変換する必要があります
3)些細な移植であり、言語と移植するコードの両方を十分に理解していないと、書くのが非常に難しくなります。

于 2011-05-22T03:21:33.840 に答える
0

この SourceForge プロジェクトを C++ から C# に移植しようとしているようです:

そのビューアーは C++ で書かれているだけでなく、 Qt Toolkitにも基づいています。

あなたの質問は、この特定のヘッダー ファイルを C++ から C# に変換することに関するものであり、最善のアプローチは何かということは知っていますが、私の意見では、あなたが C++ に非常に慣れていて、Qt について多くを学ぶつもりがない限り、この移植プロジェクトはあまり良くありません。これは、C++ と C# の両方に慣れたプログラマにとっても大きなプロジェクトです。

ただし、それでもこれを実行したい場合は、単一の大きなSpriteUtility静的クラスを作成し、見つけたすべての無料の C++ 関数をstaticC# メソッドとしてそのクラスに配置することをお勧めします。はい、ネストされたクラスとして表示される C++ 構造体を配置することもできます。インターフェイスはまったく必要ありません。

美しい C# コードである必要はありません。可能な限り損傷を少なくして、逐語的に移植しようとしています。機能するようになったら、リファクタリングして、従来の C# スタイルでよりオブジェクト指向にすることができます。

于 2011-05-22T03:17:19.327 に答える