繁体   English   中英

警告:带有值的“返回”,在函数中返回void return next; ex19.c:95:10:错误:无效值不应该被忽略,因为它应该被忽略

[英]warning: ‘return’ with a value, in function returning void return next; ex19.c:95:10: error: void value not ignored as it ought to be

我正在艰难地学习《学习代码》,并坚持练习19 http://c.learncodethehardway.org/book/ex19.html 我不顾一切,复制并粘贴了代码,但是仍然出现错误:

cc -Wall    -g    ex19.c object.o   -o ex19

ex19.c: In function ‘Room_move’:

ex19.c:65:5: warning: ‘return’ with a value, in function returning void
     return next;

     ^
ex19.c: In function ‘Map_move’:

ex19.c:95:10: error: void value not ignored as it ought to be
     next = location->_(move)(location, direction);

          ^
ex19.c: In function ‘Room_attack’:

ex19.c:145:5: warning: initialization from incompatible pointer type
     .move = Map_move,

     ^
ex19.c:145:5: warning: (near initialization for ‘MapProto.move’)

ex19.c:199:5: warning: ‘main’ is normally a non-static function [-Wmain]
 int main(int argc, char *argv[])

     ^
ex19.c:214:1: error: expected declaration or statement at end of input
 }
 ^
ex19.c:214:1: error: expected declaration or statement at end of input

ex19.c:214:1: warning: control reaches end of non-void function [-Wreturn-type]
 }

这就是我得到的:

void Room_move(void *self, Direction direction)
{
    Room *room = self;
    Room *next = NULL;

    if(direction == NORTH && room->north) {
        printf("You go north, into:\n");
        next = room->north;
    } else if(direction == SOUTH && room->south) {
        printf("You go south, into:\n");
        next = room->south;
    } else if(direction == EAST && room->east) {
        printf("You go east, into:\n");
        next = room->east;
    } else if(direction == WEST && room->west) {
        printf("You go west, into:\n");
        next = room->west;
    } else {
        printf("You can't go that direction.");
        next = NULL;
    }

    if(next) {
        next->_(describe)(next);
    }

    return next;
}

void *Map_move(void *self, Direction direction)
{
    Map *map = self;
    Room *location = map->location;
    Room *next = NULL;

    next = location->_(move)(location, direction);

    if(next) {
        map->location = next;
    }

    return next;
}

int main(int argc, char *argv[])
{
    // simple way to setup the randomness
    srand(time(NULL));

    // make our map to work with
    Map *game = NEW(Map, "The Hall of the Minotaur.");

    printf("You enter the ");
    game->location->_(describe)(game->location);

    while(process_input(game)) {
    }

    return 0;
}

这行:

void Room_move(void *self, Direction direction)

应该:

void *Room_move(void *self, Direction direction)

在您链接的页面上就是这种情况,因此在复制/粘贴代码时您一团糟。

在指定Room_move()函数的返回类型时,您会丢失一个指针变量。 您需要使用

void* Room_move(void *self, Direction direction)

而不是void Room_move(void *self, Direction direction)

void* Room_move()将返回类型设为void * ,但void Room_move()本质上意味着返回void 副作用:

  1. 警告:“返回”一个值,函数返回void

  2. 错误:空值不应该被忽略

所以,你可以看到,一个voidvoid*一样的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM