【问题标题】:Implementing code for the following functions in gameBoard在gameBoard中实现以下功能的代码
【发布时间】:2021-07-01 18:33:36
【问题描述】:
gameBoard *InitBoard(char *space, int nos,void (*toStringGameboard)(void *S), int (* getNumberOfSpaces) (void * S),char * (* getTypeOfSpace)(void * S))
    {
        gameBoard *gb= (gameBoard *) malloc(sizeof(gameBoard));
        strcpy(gb->typeOfSpace, space);
        //implement the function pointers
        return gb;
    }

    char * getTypeOfSpace(void  *board) {
        return ???;
    }
    
    int getNumberOfSpaces(void * board) {
        return ???;
    }

    void toStringGameboard(void * S){
    //print out something informative and cute
        return;
    }

我对 void 指针很困惑。到目前为止,对于第一种方法,这就是我所拥有的。 本质上,因为我不明白发生了什么, 我刚刚重复了函数的参数以尝试初始化它们。 这是正确的,如果不是,我从这里去哪里?

gameBoard *InitBoard(char *space, int nos,void (*toStringGameboard)(void *S), 
          int (* getNumberOfSpaces) (void * S),char * (* getTypeOfSpace)(void * S))
{
    gameBoard *gb= (gameBoard *) malloc(sizeof(gameBoard));
    strcpy(gb->typeOfSpace, space);
    void(*toStringGameboard)(void *S);
    int(*NumberOfSpaces)(void *S);
    char(*getTypeOfSpace)(void *S);
    return gb;
}

对于第二种方法,我想我可以使用写在 gameBoard.h 中的 char typeOfSpace[20],但我不完全确定如何去做:

typedef struct gameBoard {
    char typeOfSpace[20];   //"WIN", "BACK", "FORWARD", "SAFE"
    int numberOfSpaces; //if the type of space is "BACK", "FORWARD", then this is the number of spaces to move
        int (* getNumberOfSpaces) (void * S);
    void (* toStringGameboard)(void * S);
    char * (* getTypeOfSpace)(void * S);
}gameBoard;

gameBoard *InitBoard(char *typeOfSpace, int nos,
                    void (*toStringGameboard)(void *S), 
                    int (* getNumberOfSpaces) (void * S),
                    char * (* getTypeOfSpace)(void * S));

char * getTypeOfSpace(void  *board);
int getNumberOfSpaces(void *board);
void toStringGameboard(void *board);

不知道如何做后两个,任何帮助都会很棒!

【问题讨论】:

    标签: c arraylist void-pointers


    【解决方案1】:

    InitBoard 中,您显然应该初始化gb 的字段。

    gameBoard *InitBoard(
       char *space,
       int nos,
       void (*toStringGameboard)(void *S),
       int (*getNumberOfSpaces) (void *S),
       char *(*getTypeOfSpace)(void *S)
    ) {
       gameBoard *gb = malloc(sizeof(gameBoard));
       strcpy(gb->typeOfSpace, space);
       gb->numberOfSpaces    = ???;
       gb->getNumberOfSpaces = ???;
       gb->toStringGameboard = ???;
       gb->getTypeOfSpace    = ???;
       return gb;
    }
    

    原来所有必要的值都作为参数提供。

    gameBoard *InitBoard(
       char *space,
       int nos,
       void (*toStringGameboard)(void *S),
       int (*getNumberOfSpaces) (void *S),
       char *(*getTypeOfSpace)(void *S)
    ) {
       gameBoard *gb = malloc(sizeof(gameBoard));
       strcpy(gb->typeOfSpace, space);
       gb->numberOfSpaces    = nos;
       gb->getNumberOfSpaces = getNumberOfSpaces;
       gb->toStringGameboard = toStringGameboard;
       gb->getTypeOfSpace    = getTypeOfSpace;
       return gb;
    }
    

    调用getTypeOfSpace(等)的意图肯定如下:

    gb->getTypeOfSpace(gb)
    

    因此,其他人的board 参数实际上将是gameBoard*

    char *getTypeOfSpace(void *board) {
       gameBoard *gb = board;
       return ???;
    }
    

    【讨论】:

    • 谢谢!这就说得通了。我有一个后续问题。有一个类似的函数: Player InitPlayers(char *name, void ( setPosition)(void * S, int pos), void (toStringPlayers)(void *S), int (*getPosition) (void *S),char * ( getName)(void *S)){ Player *player = (Player *) malloc(sizeof(Player));strcpy(player->name, name); //设置函数指针返回播放器; }
    • 哇,格式非常糟糕,但我想知道第二个参数是否需要一个 player->positionInBoard = pos。我试过了,但它最终不起作用我不需要一个用于 positionInBoard 吗?我不确定它如何与具有不同参数格式的 setPosition 一起使用。
    • 我不知道Player是什么
    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2011-07-22
    • 2017-10-26
    • 2023-04-07
    • 2016-02-22
    • 2022-01-19
    相关资源
    最近更新 更多