【发布时间】:2013-09-26 06:45:05
【问题描述】:
使用 -O3 -Wall -c -fmessage-length=0 -std=c99 使用 MinGW 编译
嗯,这就是我认为的问题所在......这是细分:
我有一个我使用构建的链接列表
typedef struct Coordinate{
int x;
int y;
struct Coordinate *next;
} Coordinate;
我在 6x6 棋盘(矩阵)上添加“有效动作”(在黑白棋/黑白棋游戏中)。我检查一个动作是否有效的逻辑工作得很好——它在列表中添加了让我陷入麻烦的东西。
出于显而易见的原因,我想避免将重复值添加到列表中。但是,我尝试编写的每个函数(看起来应该可以工作)只会使应用程序崩溃,从而在漫长的一天中产生段错误。
所以这是我尝试编写的一个函数:
int inList(Coordinate *list, int x, int y) {
if (list == NULL) return 0;
while (list != NULL) {
if (list->x == x && list->y == y) return 1;
else list = list->next;
}
return 0;
}
并称它为:
Coordinate *validMoves = createNewCoordinate(-1, -1); // Just so that there is *something*
if (!inList(validMoves, 1, 1)) {
validMoves->next = createNewCoordinate(1, 1);
validMoves = validMoves->next;
}
据我所知,这应该可以完美运行。我已经在网上查找了示例,到目前为止,我在这个特定程序中对指针的所有真正令人费解的使用都没有遇到任何问题。
无论如何,真正的问题是,如果我不阻止重复项进入同一个列表(通过指针连接),那么我会得到一个无限循环(我想这是由于两个元素被认为是 equal 造成的,因为它们的非指针类型是相等的)。
我已经在 pastebin 上发布了代码的所有三个部分以供完整参考(不用担心,开源,伙计!): othello.c othello_engine.c othello_engine.h
我尝试过调试,但我不是很擅长,我真的没有看到任何值得一提的东西。谁能解释可能发生的事情和/或举例说明如何避免链表中的重复? (我试过很多方法让我的大脑受伤)
编辑:我确实知道,当我稍后遍历列表时(在游戏中多次有效“回合”之后),由于以下输出,我让自己陷入了循环引用:
{1, 4} {3, 4} {1, 4} {3, 4} {1, 4} {3, 4}
我不知道theList = theList->next = theList(伪正确)是如何进入那里的,也许我们在矩阵中......
【问题讨论】:
-
“我已经尝试过调试,但我并不擅长” -- 现在是时候提升你的水平了 -- 你不会走得太远如果你不能调试你的代码,请找程序员。
-
是的,我知道。我讨厌抱怨,但现在是凌晨 3 点,我从早上 6 点起就醒了,我需要在 3 小时后再次醒来。在过去的 5 个小时里,我也一直在盯着这段代码,并且在这个特定问题上停留了大约一个小时。这就是我说我真的尝试过的地方,现在我希望真正懂这门语言的人帮助我理解为什么我的系统失败了^^当然,我前几天才开始使用C,所以请剪掉我一些松弛;P
-
你知道数据的范围还是可以是任何东西?
-
它必须在
0 <= value < size的约束范围内,其中size是偶数6 <= size <= 10。不过,这些实际上只是任意值(嗯,0 并不是那么随意)。但是,对于这种特殊情况,这些值受其他语句的约束之前inList()被调用和/或Coordinates 被创建。 -
检查你的
createNewCoordinate()实现,它 malloc 的内存并设置 x 和 y,但从不将next设置为 NULL。因此,您将其保留为 indeterminate 指针。当您使用它时,您正在调用未定义的行为,可能会离开列表的末尾并进入未定义的行为。将new->next = NULL;添加到该函数。
标签: c pointers linked-list duplicates infinite-loop