- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为用C++实现的tictactoe的AI工作,目前我的进展正在进行中。在我的代码中,我有一个看起来像这样的结构。
struct Board {
int config[3][3];
Board ** nextboards;
};
我将nextboards设置为双指针,因为我想动态地将一个木板分配给未知数目的木板。使用指针数组将使我的存储不动态。为了增加可能的 Action ,我做了一个功能。
void addPossibleMoves(Board *** board, bool xplayer) {
Board * newboard = (Board *)malloc(sizeof(Board));
Board * another = (Board *)malloc(sizeof(Board));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
newboard -> config[i][j] = compare[i][j];
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
another -> config[i][j] = compare[i][j];
}
}
Board ***temp = (Board ***)realloc(board, 2*sizeof(Board));
temp = board;
**board = newboard;
printBoard( **board);
}
在此函数中,我通过引用传入双指针以操纵内部数据。我的目标是重新分配两倍大小的
**board
并插入两个节点以测试其是否有效。但是,当代码运行realloc函数时,它将暂停并返回不为零的值。有人可以告诉我我在做什么错。
int main() {
bool xplayer = true;
Board * startboard = (Board *)malloc(sizeof(Board));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
startboard -> config[i][j] = compare[i][j];
}
}
startboard -> nextboards = (Board **)malloc(sizeof(Board));
addPossibleMoves( & startboard -> nextboards, xplayer);
printBoard( *(startboard -> nextboards));
}
我目前正在使用devc++作为我的助手。
最佳答案
我按照我认为的样子重写了您的代码。我完全保留了您应该执行什么代码的逻辑。我还保留了您处理内存的低级malloc
/ realloc
/ free
方法。我的代码仍然具有此三重指针***
,向您展示如何使用它。同样,在使用free
分配之后,您以后也忘记了malloc
内存,您应该始终释放分配的那些指针!
在真正的C++代码中,您应该使用new
/ delete
/ delete[]
代替malloc / free。我认为,即使使用new
/ delete
也不是一个好习惯,最好使用已经为您完成所有内存管理的那些结构,例如std::vector,请参见我的第二个解决方案示例,而不是保持简单的指针和手动删除它们,最好使用std::shared_ptr这样的智能指针。
下面的第一个代码基本上是您的代码,但有所改进。
Try it online!
#include <cstdlib>
#include <cstdio>
struct Board {
int config[3][3];
Board ** nextboards;
};
void freeNextBoards(Board ** nextboards) {
Board ** cur = nextboards;
while (*cur) {
freeNextBoards((*cur)->nextboards);
++cur;
}
nextboards[0] = 0;
}
void freeBoard(Board * board) {
freeNextBoards(board->nextboards);
}
void resizeNextBoards(Board *** pnextboards, int cnt) {
*pnextboards = (Board **)realloc(*pnextboards, cnt * sizeof(Board*));
}
Board * createBoard() {
Board * board = (Board *)malloc(sizeof(Board));
board->nextboards = (Board **)malloc(1 * sizeof(Board*));
board->nextboards[0] = 0;
return board;
}
void printRepStr(char const * s, int cnt = 1) {
for (int j = 0; j < cnt; ++j)
printf("%s", s);
}
void printBoard(Board * board, int indent = 0) {
for (int i = 0; i < 3; ++i) {
printRepStr(" ", indent);
for (int j = 0; j < 3; ++j)
printf("%02d ", board->config[i][j]);
printf("\n");
}
printRepStr(" ", indent);
printRepStr("-", 3 * 3 - 1);
printf("\n");
Board ** cur = board->nextboards;
while (*cur) {
printBoard(*cur, indent + 4);
++cur;
}
}
void addPossibleMoves(Board *** pnextboards, bool xplayer) {
Board * newboard = createBoard();
Board * another = createBoard();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
newboard->config[i][j] = 2 * (i + j); // compare[i][j];
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
another->config[i][j] = 3 * (i + j); // compare[i][j];
}
}
freeNextBoards(*pnextboards);
resizeNextBoards(pnextboards, 3);
(*pnextboards)[0] = newboard;
(*pnextboards)[1] = another;
(*pnextboards)[2] = 0;
}
int main() {
bool xplayer = true;
Board * startboard = createBoard();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
startboard->config[i][j] = 1 * (i + j); // compare[i][j];
}
}
addPossibleMoves(&startboard->nextboards, xplayer);
addPossibleMoves(&startboard->nextboards[0]->nextboards, xplayer);
printBoard(startboard);
freeBoard(startboard);
return 0;
}
输出:
00 01 02
01 02 03
02 03 04
--------
00 02 04
02 04 06
04 06 08
--------
00 02 04
02 04 06
04 06 08
--------
00 03 06
03 06 09
06 09 12
--------
00 03 06
03 06 09
06 09 12
--------
第二个代码下面是第一个代码的改进版本,现在代替了无处不在的指针,我使用
std::vector
来自动管理内存,对于
config
的普通2D数组,我使用
std::array,将文本输出到控制台,我使用了
std::cout,还用于捕获异常我使用了
try
/
catch
和
std::exception。
malloc
/
realloc
/
free
进行任何工作,因为您始终可以忘记分配后释放某些内容,因此所有操作都是在 vector 代码内自动完成的。
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <array>
#include <stdexcept>
#include <iostream>
#include <iomanip>
using namespace std;
struct Board {
array<array<int, 3>, 3> config = {};
vector<Board> nextboards;
};
void printRepStr(char const * s, size_t cnt = 1) {
for (size_t j = 0; j < cnt; ++j)
cout << s;
}
void printBoard(Board const & board, size_t indent = 0) {
for (size_t i = 0; i < board.config.size(); ++i) {
printRepStr(" ", indent);
for (int j = 0; j < board.config[i].size(); ++j)
cout << setfill(' ') << setw(2) << board.config[i][j] << " ";
cout << endl;
}
printRepStr(" ", indent);
printRepStr("-", board.config[0].size() * 3 - 1);
cout << endl;
for (auto const & cur: board.nextboards)
printBoard(cur, indent + 4);
}
void addPossibleMoves(vector<Board> & pnextboards, bool xplayer) {
Board newboard, another;
for (size_t i = 0; i < newboard.config.size(); ++i)
for (int j = 0; j < newboard.config[i].size(); ++j)
newboard.config[i][j] = 2 * (i + j); // compare[i][j];
for (size_t i = 0; i < another.config.size(); ++i)
for (int j = 0; j < another.config[i].size(); ++j)
another.config[i][j] = 3 * (i + j); // compare[i][j];
pnextboards.resize(2);
pnextboards[0] = newboard;
pnextboards[1] = another;
}
int main() {
try {
bool xplayer = true;
Board startboard;
for (size_t i = 0; i < startboard.config.size(); ++i)
for (size_t j = 0; j < startboard.config[i].size(); ++j)
startboard.config[i][j] = 1 * (i + j); // compare[i][j];
addPossibleMoves(startboard.nextboards, xplayer);
addPossibleMoves(startboard.nextboards[0].nextboards, xplayer);
printBoard(startboard);
return 0;
} catch (exception const & ex) {
cout << "Exception: " << ex.what() << endl;
} catch (...) {
cout << "Unknown Exception!" << endl;
}
}
关于c++ - 如何重新分配三重指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64691254/
我有一个应用程序,它会抛出 GKSession 并在各种条件下(连接超时、 session 失败等)创建一个新的 GKSession。不过,我遇到了内存泄漏问题,并且有时会在重新连接几次循环后崩溃。
比如我在宿主代码中有一个浮点指针 float *p 是否可以确定他指向的内存类型(设备/主机)? 最佳答案 在 UVA system 中, 运行时 API 函数 cudaPointerGetAttri
我已将项目转换为 .Net 4.0 并且以下代码不起作用: typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Instance
当我声明 char ch = 'ab' 时,ch 只包含 'b',为什么它不存储 'a'? #include int main() { char ch = 'ab'; printf("%c"
我对 Disk Sector 和 Block 有疑问。扇区是一个单位,通常为 512 字节或 1k、2k、4k 等取决于硬件。文件系统 block 大小是一组扇区大小。 假设我正在存储一个 5KB 的
假设我有 8 个人和5000 个苹果。 我想将所有苹果分发给所有 8 个人,这样我就没有苹果了。 但每个人都应该得到不同数量 将它们全部分发出去的最佳方式是什么? 我是这样开始的: let peopl
我正在构建的网站顶部有一个搜索栏。与 Trello 或 Gmail 类似,我希望当用户按下“/”键时,他们的焦点就会转到该搜索框。 我的 JavaScript 看起来像这样: document.onk
我有一小段代码: if (PZ_APP.dom.isAnyDomElement($textInputs)){ $textInputs.on("focus", function(){
我观察到以下行为。 接受了两个属性变量。 @property (nonatomic, retain) NSString *stringOne; @property (nonatomic, assign
我正在解决这样的问题 - 实现一个计算由以下内容组成的表达式的函数以下操作数:“(”、“)”、“+”、“-”、“*”、“/”。中的每个数字表达式可能很大(与由字符串表示的一样大)1000 位)。 “/
我有一组主机和一组任务。 每个主机都有 cpu、mem 和任务容量,每个任务都有 cpu、mem 要求。 每个主机都属于一个延迟类别,并且可以与具有特定延迟值的其他主机通信。 每个任务可能需要以等于或
该程序的作用:从文件中读取一个包含 nrRows 行和 nrColomns 列的矩阵(二维数组)。矩阵的所有元素都是 [0,100) 之间的整数。程序必须重新排列矩阵内的所有元素,使每个元素等于其所在
世界!我有个问题。今天我尝试创建一个代码,它可以找到加泰罗尼亚语号码。但是在我的程序中可以是长数字。我找到了分子和分母。但我不能分割长数字!此外,只有标准库必须在此程序中使用。请帮帮我。这是我的代码
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
这个问题在这里已经有了答案: Difference between self.ivar and ivar? (4 个答案) 关闭 9 年前。
我如何将 v[i] 分配给一系列整数(v 的类型是 vector )而无需最初填充 最佳答案 你的意思是将 std::vector 初始化为一系列整数? int i[] = {1, 2, 3, 4,
我想寻求分配方面的帮助....我把这个作业带到了学校......我必须编写程序来加载一个 G 矩阵和第二个 G 矩阵,并搜索第二个 G 矩阵以获取存在数第一个 G 矩阵的......但是,当我尝试运行
我必须管理资源。它基本上是一个唯一的编号,用于标识交换机中的第 2 层连接。可以有 16k 个这样的连接,因此每次用户希望配置连接时,他/她都需要分配一个唯一索引。同样,当用户希望删除连接时,资源(号
是否有任何通用的命名约定来区分已分配和未分配的字符串?我正在寻找的是希望类似于 us/s 来自 Making Wrong Code Look Wrong ,但我宁愿使用常见的东西也不愿自己动手。 最佳
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。 感谢您的帮助。 我的程序只分配文件的第一个字... 我知道问题出在函数 i
我是一名优秀的程序员,十分优秀!