2011-05-22 96 views
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); 


    } 

我敢肯定,你可以在這裏連接點。請記住,這不是我的代碼,顯然,所以我對此不甚瞭解。如果任何人需要更多的材料,但我很樂意提供它,如果有必要。

+5

那麼......究竟是什麼問題? – Ryan 2011-05-22 02:15:16

+0

#是[預處理器指令](http://msdn.microsoft.com/zh-cn/library/3sxhs2ty(v = vs80).aspx)的一部分,它們在編譯前應用。 – jonsca 2011-05-22 02:23:09

+1

您是否將所有內容翻譯爲C#或者您打算從C#調用/處理C代碼?對於互操作你需要編組你的結構來保持相同的內存佈局。如果你打算使用純C#,你可以簡化更多。 – hsmiths 2011-05-22 02:39:43

回答

0

你似乎從C++到C#是試圖端口這個SourceForge項目:

那觀衆不僅是用C++編寫,但也是基於Qt Toolkit

我知道你的問題是關於這個將特定的頭文件從C++轉換爲C#以及什麼是最好的方法,但我的觀點是,除非你對C++很滿意並且願意學習很多關於Qt的知識,否則你這個移植項目的成功機會不是很好。這是一個大項目,即使是在C++和C#中都經歷過的程序員。然而,如果你仍然想要做這件事,那麼你應該採取的方法是創建一個大的靜態類,並將所有可以找到的免費C++函數放入該類中,作爲C#方法的static。是的,你也可以把你看到的C++結構作爲嵌套類。你不需要任何接口。

它不需要漂亮的C#代碼;你正試圖逐字逐句儘可能少的損害。一旦它正在工作,您可以重構它,使其在傳統的C#風格中更加面向對象。

+0

你是對的,先生。我覺得這是學習如何真正做到最好的方法,你知道嗎?程序,我的意思是。無論如何,我很欣賞這個建議。我會用頭部來投籃。你認爲我需要任何更多的頭文件的接口嗎?我想我在這裏用一般公式來思考。 – zeboidlund 2011-05-22 03:19:17

+0

TBQH這裏有太多的地方,因爲這是一個很好的學習項目,你至少應該在頭幾年的時間內集中精力於一種語言。 – Yaur 2011-05-22 03:32:01

+0

當然,但這是事情:我需要學習如何做到這一點。而通過學習,我的意思是儘可能快地學習。我理解這些東西每天都在起作用,並且盡我所能地推動自己。對某些人來說這聽起來很荒謬,但我相信我能做到。我只需要知道幾件事。我的意思是,有什麼人可以告訴我關於這種特殊的轉換,從兩種語言之間的實質性差異來看,當我將其轉換時,我可以牢記這一點。 – zeboidlund 2011-05-22 03:49:35

1

幾個百分點:
1)有你的類型不應該是一個接口
2)指針,要麼轉換爲承包商,客人裏面,你在精靈類的hve或陣列,你應該有在SpriteImage結構
3)除非它是一個微不足道的端口,如果不能很好地理解兩種語言和要移植的代碼,那麼編寫將會非常困難