2015-03-13 77 views
1

我正在通过学​​习代码困难的方式预订并停留在练习19 http://c.learncodethehardway.org/book/ex19.html。我绝望了,复制和粘贴代码,但仍然我得到错误:警告:'返回'一个值,在函数返回void返回下一个; ex19.c:95:10:错误:无效值不会被忽略,因为它应该是

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; 
} 
+0

当然练习1到18有一些关于如何返回工作 – 2015-03-13 07:39:06

回答

3

这条线:

void Room_move(void *self, Direction direction) 

应该是:

void *Room_move(void *self, Direction direction) 

这种情况您链接的页面,所以在复制/粘贴代码时混乱了。

+0

从复制和粘贴代码中得到错误后,可能在本网站进行研究,我将void * Room_move(void * self,Direction direction)更改为void Room_move (void * self,方向方向),现在我用来取得的错误被另一个取代 – codeing 2015-03-13 18:51:01

1

您在指定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. warning: ‘return’ with a value, in function returning void

  2. error: void value not ignored as it ought to be

所以,你可以看到,一个voidvoid*相同。

相关问题