所以我有一个程序,该程序可以帮助我按邻接矩阵在图形中查找循环。除了输出,我已经做了一切。
实现
因此,在单击示例按钮时,从蒙版的编辑控件中,取一个最大为99的数字以构成某些数组的大小。然后,我创建2d数组** arr,以零填充它,然后通过for填充正常编辑控件中编写的文本信息。完成此步骤后,我用该数组中的边填充向量,并对该图进行DFS处理。
现在要解决问题
就像我说的,我有2d数组。用零填充的整个过程:
int **arr;
arr = new int* [x];
for (int i = 0; i < x; i++)
{
arr[i] = new int[x];
}
for (int i = 0; i < x; i++)
{
for (int j = 0; j < x; j++)
{
arr[i][j] = 0;
}
}
在下一个过程中(从编辑控件中获取邻接矩阵)出现警告#1:
int i = 0, j;
int lpos = 0;
for (CString line = s.Tokenize(_T("\r\n"), lpos); lpos > 0; line = s.Tokenize(_T("\r\n"), lpos))
{
j = 0;
int cpos = 0;
for (CString cell = line.Tokenize(_T(" "), cpos); cpos > 0; cell = line.Tokenize(_T(" "), cpos))
{
int num;
num = _wtoi(cell);
arr[i][j] = num;
j++;
}
i++;
}
Warning C6386 Buffer overrun while writing to 'arr[i]': the writable size is 'x*4' bytes, but '8' bytes might be written.
在输出之前,我还放入了另一个向量循环,并且它还发出警告#2:
for (int i = 1; i <= edges; i++) {
if (mark[i] != 0) {
int k = mark[i];
cycles[k].push_back(i);
}
}
Warning C6385 Reading invalid data from 'mark': the readable size is 'x*4' bytes, but '8' bytes may be read.
问题是,当我测试输出(邻接矩阵7x7,全部填充为1)时,它捕获到这2个部分的异常,这是警告。例外是:Exception thrown at 0x00007FF6DD63AD7A in CTabControl.exe: 0xC0000005: Access violation writing location 0x00000000FDFDFDFD.
我尝试过的事情
现在,我尝试使用make_unique指针作为标记上的*
指针的替代形式,该指针以前是这样声明的:int *mark = new int[x];
(更改为auto mark = make_unique<int[]>(x);
)。更改后,出现一个新错误:
E0413 no suitable conversion function from "std::unique_ptr<int [], std::default_delete<int []>>" to "int *" exists
它指出了该函数,其中我使用了标记数组:dfs_cycle(1, 0, color, mark, par, cyclenumber);
函数声明如下:
void dfs_cycle(int u, int p, int color[], int mark[], int par[], int& cyclenumber)
{
// ........
}
该如何解决?
编辑
我认为我已经找到了问题,但现在我找不到解决方案。因此,当从邻接矩阵所在的文本框中读取文本时,我将用标记化文本的内容填充数组。这是我的操作方式:
int i = 0, j; int lpos = 0;
for (CString line = s.Tokenize(_T("\r\n"), lpos); lpos > 0; line = s.Tokenize(_T("\r\n"), lpos)){
j = 0;
int cpos = 0;
for (CString cell = line.Tokenize(_T(" "), cpos); cpos > 0; cell = line.Tokenize(_T(" "), cpos))
{
int num;
num = _wtoi(cell);
arr[i][j] = num;
j++;
}
i++;
}
当我尝试将arr设为2d向量时,我偶然发现“超出范围”错误。因此,这意味着我必须以某种方式标记我的文本并将其放入数组中。我还不知道怎么办。