将此C结构转换为C#

时间:2016-05-29 11:59:10

标签: c# c struct

我正在将C游戏:https://github.com/minirop/Super-Mario-Remake翻译成C#以获得乐趣并改进我的C#编程。我在C语言编程方面没有经验,遇到过一个我不知道如何在C#中实现的结构。

    typedef struct _state_t {
    void (*init)(struct _state_t * s);
    void (*update)(struct _state_t * s, Uint32 elapsedTime);
    void (*handleEvent)(struct _state_t * s);
    void (*draw)(struct _state_t * s, SDL_Surface * surface);
    void (*clean)(struct _state_t * s);
    void * data;
} state_t;

到目前为止我尝试的是:

public class state_t
{
    public void init(state_t S)
    {
        state_t s;

        s = S;
    }

    public void update(state_t S, UInt32 ElapsedTime)
    {
        state_t s;
        UInt32 elapsedTime;

        s = S;
        elapsedTime = ElapsedTime;
    }

    public void handleEvent(state_t S)
    {
        state_t s;
        s = S;
    }

    public void draw(state_t S, SDL.SDL_Surface Surface)
    {
        state_t s;
        SDL.SDL_Surface surface;

        s = S;
        surface = Surface;
    }
    public void clean(state_t S)
    {
        state_t s;

        s = S;
    }

    public void data()
    {

    }
}

但我不认为这是对的。我收到了一个错误:

        state_t MS_get()
        {
           state_t state = new state_t();
           state.init = MS_init; // Error 2 Cannot assign to 'init' because it is a 'method group'

        }  ...

2 个答案:

答案 0 :(得分:0)

您已将init定义为方法,因此您需要调用它;不要分配它。这样的事情应该有效:

state.init(MS_init);

但是,我在那个方法中看到你只是将状态保存在init()方法中声明的变量中,这将无法实现。

答案 1 :(得分:0)

这个C结构首先是由C ++或C#面向对象的类构成的。面向对象的原则被强加到这个结构上。

等效的C#结构将是

public class state_t
{
    Unit32 m_elapsedTime;
    SDL_Surface * m_surface;
    void *m_data;

    public void init()
    {
       // Initialise all variables of class
    }

    public void update(UInt32 ElapsedTime)
    {
        m_elapsedTime = ElapsedTime;
    }

    public void handleEvent()
    {
       // Code for Handle Event
    }

    public void draw(SDL_Surface Surface)
    {
       // Code for Draw
       m_surface = Surface;  // maybe, need to check datatype.
    }
    public void clean()
    {
       // Code for Cleaning
    }

    public void data()
    {
       // Code for filling *data variable
    }
}

您可能需要添加一些私有变量,尤其是关于m_datam_surface的内存分配大小,但这将取决于对原始代码的进一步检查。