- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我陷入了这个编译错误,我想知道如何调试代码。我的程序基本上有以下文件:
生成文件:
CFLAGS = -Wall -g
src = ex19.c
all: $(src)
cc $(CFLAGS) -o ex19 $(src)
ex19: object.o
clean:
rm -f ex19
对象.h:
#ifndef _object_h
#define _object_h
typedef enum{
NORTH, SOUTH, EAST, WEST
} Direction;
typedef struct {
char *description;
int (*init)(void *self);
void (*describe)(void *self);
void (*destroy)(void *self);
void *(*move)(void *self, Direction direction);
int (*attack)(void *self, int damage);
} Object;
int Object_init(void *self);
void Object_destroy(void *self);
void Object_describe(void *self);
void *Object_move(void *self, Direction direction);
int Object_attack(void *self, int damage);
void *Object_new(size_t size, Object proto, char *description);
#define NEW(T, N) Object_new(sizeof(T), T##Proto, N)
#define _(N) proto.N
#endif
对象.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "object.h"
#include <assert.h>
void Object_destroy(void *self) {
Object *obj = self;
if(obj) {
if(obj->description) free(obj->decription);
free(obj);
}
}
void Object_describe(void *self) {
Object *obj = self;
printf("%s.\n", obj->description);
}
int Object_init(void *self){
// do nothing really
return 1;
}
void *Object_move(void *sefl, Direction direction){
printf("You can't go that direction.\n");
return NULL;
}
int Object_attack(void *self, int damage){
printf("You can't attack that.\n");
return 0;
}
void *Object_new(size_t size, Object proto, char *description){
// setup the default functions in case they aren't set
if(!proto.init) proto.init = Object_init;
if(!proto.describe) proto.describe = Object_describe;
if(!proto.destroy) proto.destroy = Object_destroy;
if(!proto.attack) proto.attack = Object_attack;
if(!proto.move) proto.move = Object_move;
// this seems weird, but we can make a struct of one size,
// then point a different pointer at it to "cast" it
Object *el = calloc(1, size);
*el = proto;
// copy the description over
el->description = strdup(description);
// initialize it with whatever init we were given
if(!el->init(el)){
// looks like it didn't initialize properly
el->destroy(el);
return NULL;
}
else {
//all done, we made an object of any type
return el;
}
}
ex19.h:
#ifndef __ex19_h
#define __ex19_h
#include "object.h"
struct Monster {
Object proto;
int hit_points;
};
typedef struct Monster Monster;
int Monster_attack(void *self, int damage);
int Monster_init(void *self);
struct Room{
Object proto;
Monster *bad_guy;
struct Room *north;
struct Room *south;
struct Room *east;
struct Room *west;
};
typedef struct Room Room;
void *Room_move(void *self, Direction direction);
int Room_attack(void *self, int damage);
int Room_init(void *self);
struct Map{
Object proto;
Room *start;
Room *location;
};
typedef struct Map Map;
void *Map_move(void *self, Direction direction);
int Map_attack(void *self, int damage);
int Map_init(void *self);
#endif
ex19.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include "ex19.h"
int Monster_attack(void *self, int damage){
Monster *monster = self;
printf("You attack %s!\n", monster->_(description));
monster->hit_points -= damage;
if(monster->hit_points > 0) {
printf("It is still alive.\n");
return 0;
}
else{
printf("It is dead!\n");
return 1;
}
}
int Monster_init(void *self){
Monster *monster = self;
monster->hit_points = 10;
return 1;
}
Object MonsterProto = {
.init = Monster_init,
.attack = Monster_attack
};
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;
}
int Room_attack(void *self, int damage){
Room *room = self;
Monster *monster = room->bad_guy;
if(monster){
monster->_(attack)(monster, damage);
return 1;
}
else{
printf("You flail in the air at nothing. Idiot.\n");
return 0;
}
}
Object RoomProto = {
.move = Room_move,
.attack = Room_attack
};
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 Map_attack(void *self, int damage){
Map* map = self;
Room *location = map->location;
return location->_(attack)(location, damage);
}
int Map_init(void *self){
Map *map = self;
//make some rooms for a small map
Room *hall = NEW(Room, "The great hall");
Room *throne = NEW(Room, "The throne room");
Room *arena = NEW(Room, "The arena, with the minotaur");
Room *kitchen = NEW(Room, "Kitchen, you have the knife now");
// put the bad guy in the arena
arena->bad_guy = NEW(Monster, "The evil minotaur");
// setup the map rooms
hall->north = throne;
throne->west = arena;
throne->east = kitchen;
throne->south = hall;
arena->east = throne;
kitchen->west = throne;
//start the map and the character off in the hall
map->start = hall;
map->location = hall;
return 1;
}
Object MapProto = {
.init = Map_init,
.move = Map_move,
.attack = Map_attack
};
int process_input(Map *game){
printf("\n> ");
char ch = getchar();
getchar(); // eat enter;
int damage = rand() % 4;
switch(ch){
case -1:
printf("Giving up? You such.\n");
return 0;
break;
case 'n':
game->_(move)(game, NORTH);
break;
case 's':
game->_(move)(game, SOUTH);
break;
case 'e':
game->_(move)(game, EAST);
break;
case 'w':
game->_(move)(game, WEST);
break;
case 'a':
game->_(attack)(game, damage);
break;
case 'l':
printf("You can go:\n");
if(game->location->north) printf("NORTH\n");
if(game->location->south) printf("SOUTH\n");
if(game->location->east) printf("EAST\n");
if(game->location->west) printf("WEST\n");
break;
default:
printf("What?: %d\n", ch);
}
return 1;
}
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;
}
编译错误:
cc -Wall -g -o ex19 ex19.c/tmp/cccuR81O.o:在函数 Map_init' 中:
Object_new'ex19/ex19.c:106: 对
ex19/ex19.c:105: undefined reference Object_new' 的 undefined reference
Object_new'ex19/ex19.c:108:对
ex19/ex19.c:107: undefined reference Object_new' 的 undefined reference
Object_new'ex19/ex19.c:180:更多对“Object_new”的 undefined reference 如下collect2:错误:ld 返回 1 退出状态make: *** [全部] 错误 1
ex19/ex19.c:111: undefined reference
更新 1:有问题的线路
105 Room *hall = NEW(Room, "The great hall");
106 Room *throne = NEW(Room, "The throne room");
107 Room *arena = NEW(Room, "The arena, with the minotaur");
108 Room *kitchen = NEW(Room, "Kitchen, you have the knife now");
111 arena->bad_guy = NEW(Monster, "The evil minotaur");
最佳答案
需要更新 makefile 以将 object.o
链接到可执行文件。目前您的链接行是:
cc $(CFLAGS) -o ex19 $(src)
如果执行make
(或make all
),则命令将扩展为:
cc -Wall -g -o ex19 ex19.c
它尝试仅使用ex19.c
生成可执行文件。
构建目标 ex19
永远不会被调用,因为 all
没有将其作为依赖项。但即使它确实如此,或者您手动编写 make ex19
,仍然只会生成 object.o
,您在任何链接 ex19 的地方都没有任何命令。 o
与 object.o
一起生成可执行文件。
您应该将 src = ex19.c
更改为 src = ex19.c object.c
,因为它们都是源文件。您可以删除 ex19: object.o
行,因为它在这里是多余的。这个 makefile 将在一行中编译和链接所有源文件,这很好。
如果您想更改 makefile 以对每个 .c
文件使用编译器的单独调用(因此链接器需要第三次调用),那么您需要进行一些更改,最好根据现有的 makefile 来建模。
关于c - 如何删除代码中 undefined reference ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608115/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!