- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用压缩的稀疏行数据结构用 C 编写了广度优先搜索的代码。该代码似乎对于一个图表运行良好,但对于另一个图表文件返回错误。它适用于 this file但会抛出 this file 的错误作为 C 编程新手,我找不到问题的原因,希望得到任何帮助
我尝试检查 while 循环的条件。当代码挂起并返回错误时,循环的条件为真。我使用 mingw 编译器在 CodeBlocks 16.01 上运行此代码。
#include <stdio.h>
#include <stdlib.h>
// Declaring a struct type to hold
int main(){
int n, m, counter, current, x, src, dst;
n=0, m=0, counter = 0, current =0, src = 0, dst = 0;
FILE *fp; //create a pointer to the file directory
fp = fopen("filename.graph","r"); //set the directory pointer to the path of the text file containing graph data
if ((fp == NULL)){ perror("Error, no such file exists \n"); exit(1);}
//If file not found, print error message and exit the program
else
{
fscanf(fp,"%d %d", &n,&m); //read first line of text file to get number of vertices and edges in graph
struct CSRgraph //Create CSR data structure
{
int heads[m]; //Stores heads of edges
int offsets[n+1]; //Stores information on the number of edges leaving each node
};
struct CSRgraph g; //Create an instance of the CSR graph data structure
g.offsets[0] = 0; //Set the initial offset value to 0
g.offsets[n] = m; //Set the offset value of 'phantom' node to the number of edges in graph
for(x=0;x<m;x++) //iterate over all lines containing edge information in text file
//Read file and create CSR data structure from information in text file
{
fscanf(fp,"%d %d",&src,&dst); //read source and head information from file
g.heads[x] = dst; //assign head information to the next available slot in data structure
if (src < n+1) //Check that node is valid
{
if (src == current) //check that current edge originates from same source as previous edge
{
counter++; //increment counter for the number of edges that originate from current source
}
else //Current edge does not originate from previous source. New source node encountered
{
g.offsets[src] = counter + g.offsets[src -1]; //Update offset value for previous source
counter = 1; //restart edge origin counter
current = src ; //set current to current source
}
}
}
fclose(fp); //Close file after use
int Discovered[n],Queue[n+1],Explored[n], *front_ptr,*end_ptr,*exp_ptr;
front_ptr = Queue; //Initialize the front pointer to the Queue array
end_ptr = Queue; //Initialize the end pointer to the Queue array
exp_ptr = Explored; //Initialize the explored pointer to the Explored array
for (x=0;x<n;x++)
{
Discovered[x] = 0; //An array to track discovered nodes. Not necessarily explored, but nodes that have showed up previously
}
// Advance the pointers in the direction you want
*end_ptr = 0; //setting the first element in the queue as the node 0
end_ptr++; //advancing the end pointer to the next available array spot
Discovered[0] = 1;
while (front_ptr != end_ptr)
{ //Queue is empty if front pointer is the same as end pointer
int p,curr;
curr = *front_ptr; //grab the front of the queue and set it as current node
front_ptr++; //equivalent to removing from element and pushing the next node in line to the front
*exp_ptr = curr; //set current node to explored
exp_ptr++; //advance the explored pointer one step
for (p = g.offsets[curr]; p < g.offsets[curr+1]; p++)
//iterate over all neighbors of current node
{
if (Discovered[g.heads[p]] == 0)
//if node is not already discovered, set it to discovered, add it to queue and advanced the end pointer of queue one step
{
Discovered[g.heads[p]] = 1;
*end_ptr = g.heads[p];
end_ptr++;
}
}
}
}
return 0;
}
最佳答案
您对int heads[m];
的使用作为 int 的 VLA m = 108744
(以及您分配的 2950
整数的其他 4 个 VLA)可能会导致 StackOverflow...(这将取决于编译器、操作系统和内存模型)。要解决此问题,请更改 CSRgraph
让成员(member)heads
和offsets
是指针,然后根据从文件第一行读取的数字动态分配存储,例如
typedef struct { /* typdef for convenience */
int *heads,
*offsets;
} CSRgraph_t;
int main (int argc, char **argv) {
CSRgraph_t g; /* declare instance of struct */
...
/* allocate/validate g.heads & g.offsets */
if (!(g.heads = malloc (m * sizeof *g.heads))) {
perror ("malloc-g.heads");
return 1;
}
/* calloc used to zero g.offsets */
if (!(g.offsets = calloc ((n + 1), sizeof *g.offsets))) {
perror ("malloc-g.offsets");
return 1;
}
g.offsets[0] = 0;
g.offsets[n] = m;
...
(注意: calloc
用于 offsets
将其初始化为全零,以便稍后比较 p < g.offsets[curr+1]
)
总而言之,你可以这样做:
#include <stdio.h>
#include <stdlib.h>
typedef struct { /* typdef for convenience */
int *heads,
*offsets;
} CSRgraph_t;
int main (int argc, char **argv) {
CSRgraph_t g; /* declare instance of struct */
int n, m, counter, current;
n = m = counter = current = 0;
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
if (fscanf (fp, "%d %d", &n, &m) != 2) { /* validate EVERY read */
fputs ("error: invalid format n, m.\n", stderr);
return 1;
}
/* allocate/validate g.heads & g.offsets */
if (!(g.heads = malloc (m * sizeof *g.heads))) {
perror ("malloc-g.heads");
return 1;
}
/* calloc used to zero g.offsets */
if (!(g.offsets = calloc ((n + 1), sizeof *g.offsets))) {
perror ("malloc-g.offsets");
return 1;
}
g.offsets[0] = 0;
g.offsets[n] = m;
for (int x = 0; x < m; x++) {
int src; /* src is only needed within scope of loop */
if (fscanf (fp, "%d %d", &src, &g.heads[x]) != 2) {
fprintf (stderr, "error: invalid format - line %d.\n", x);
}
if (src < n+1) {
if (src == current)
counter++;
}
else {
g.offsets[src] = counter + g.offsets[src -1];
counter = 1; /* restart edge origin counter */
current = src; /* set current to current source */
}
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
int Discovered[n], Queue[n+1], Explored[n],
*front_ptr, *end_ptr, *exp_ptr;
front_ptr = Queue; /* front pointer to the Queue array */
end_ptr = Queue; /* end pointer to the Queue array */
exp_ptr = Explored; /* explored pointer to the Explored array */
for (int x = 0; x < n; x++)
Discovered[x] = 0;
/* Advance the pointers in the direction you want */
*end_ptr = 0;
end_ptr++;
Discovered[0] = 1;
while (front_ptr != end_ptr) {
int curr = *front_ptr;
front_ptr++;
*exp_ptr = curr;
exp_ptr++;
for (int p = g.offsets[curr]; p < g.offsets[curr+1]; p++) {
if (Discovered[g.heads[p]] == 0) {
Discovered[g.heads[p]] = 1;
*end_ptr = g.heads[p];
end_ptr++;
}
}
}
free (g.heads);
free (g.offsets);
return 0;
}
(注意:避免硬编码文件名,例如 fopen("filename.graph","r")
、 main()
接受参数,使用它们将文件名作为第一个参数传递给程序[您可以从 stdin
读取如果没有提供参数则默认])
内存使用/错误检查
$ valgrind ./bin/readgraphsfile ~/tmp/graphfile/large.graph
==17345== Memcheck, a memory error detector
==17345== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==17345== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==17345== Command: ./bin/readgraphsfile ~/tmp/graphfile/large.graph
==17345==
==17345==
==17345== HEAP SUMMARY:
==17345== in use at exit: 0 bytes in 0 blocks
==17345== total heap usage: 3 allocs, 3 frees, 447,332 bytes allocated
==17345==
==17345== All heap blocks were freed -- no leaks are possible
==17345==
==17345== For counts of detected and suppressed errors, rerun with: -v
==17345== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
它与您的 large.graph
配合得很好文件。
关于c - C 中的广度优先搜索代码,可能的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54756475/
我有一个 div(蓝色框),它在父元素(红色框)内的页面上绝对定位,我需要将 overflow-y 设置为隐藏,以便它强制 Y 轴上的溢出内容切掉了,但我希望任何溢出-x 的内容都可见。 HTML:
请参阅以下帖子以获取突出显示我的问题和可能的解决方案的图片: CSS overflow-y:visible, overflow-x:scroll 但是,当您实际移动滚动条时,此策略会中断。在建议的实现
我在搜索中看到过几个类似的问题,但要么没有正确回答问题,要么没有给出答案。所以,我再问一次。 .parent { overflow-y:scroll; overflow-x:visible; wid
我读过这个CSS overflow-x hidden and overflow-y visible (以及很多其他帖子)但我无法在我的具体情况下使用它。 我正在使用 slick-slider并想添加下
我有以下 Spark 作业,试图将所有内容保留在内存中: val myOutRDD = myInRDD.flatMap { fp => val tuple2List: ListBuffer[(St
我有疑问 两个16位的值加上最大值,16位机会不会溢出? 我会详细说明 unsigned short a; unsigned short b; unsigned long c; c=(unsigne
我有这个 HTML 和 CSS,但“溢出:隐藏”标签在 Firefox 中不起作用。这让我感到难过...有人知道为什么它不起作用吗?是因为A标签不支持overflow标签吗? #page_sideba
我正在开发一个程序,用于在 C++ 中分解非常大的数字(20 位或更多),并且正在使用 GMP 来处理溢出问题。我的程序对于大约 10 位或更少的数字运行良好,但是当我向它抛出一个 15 位数字时,它
我创建了一个 Canvas ,并在其中放置了一个StackPanel。 StackPanel是水平的,它接受缩略图图像的列表。 Canvas 具有固定的大小。当我放置的缩略图多于Canvas宽度不能容
当 g_array_append_val() 时会发生什么或 GLib 中的其他附加/前置函数之一,使 GArray 的长度大于 guint (unsigned int) 所能容纳的长度? 文档对此没
overflow-x:hidden 和 overflow:hidden; 有什么区别? 我所知道的是overflow-x:hidden;禁用水平滚动,但当我使用它时,它不仅仅适用于 Firefox,所
我们正在运行 Solr 来索引大量数据,但遇到了一个非常有趣的问题,我无法在任何地方找到任何帮助。 似乎 Solr 使用带符号的 32 位整数来计算索引中当前的文档数。我们刚刚达到了这个数字,我们的
这是我的查询: 从相似性中选择 COUNT(*),其中 T1Similarity = 0 或 T2Similarity = 0 结果如下: Msg 8115, Level 16, State 2, L
int main(void) { char x1 = 0x81; char x2 = 0x1; int a, b; a = x1
我有一个 div,其中的内容通过查询的 append() 定期附加到它。随着内容越来越长,最终会溢出div。我不希望在溢出时出现滚动条,但仍然让内容向上滚动以显示下面的新内容。 这可能吗?当我使用 o
我为 UITextField 创建了一个简单的子类,它按预期工作。我遇到的唯一问题是当文本值变得太大时,它会溢出到清除按钮中。 我似乎无法找到如何仅更改文本的右侧以具有一些填充而不与清除按钮相交的方法
我想要一个包括下拉菜单的粘性导航栏。但是,当我将鼠标悬停在它上面时,下拉菜单没有显示。 如果我删除 overflow: hidden;在无序列表中,当我向下滚动时,导航栏设法保持在顶部,但是导航栏是不
我正在研究一些按钮。我想要一个翻转状态,我在一个 div 的图像中有这个,溢出:隐藏以隐藏不活动的状态。它有时有效,但有时看起来像这样: 最奇怪的是,当我尝试使用 Chrome Web Inspect
基本上,我正在尝试创建一个六边形形状,它内部有一个圆圈,圆圈的多余部分应该被隐藏。演示:https://codepen.io/AskSaikatSinha/pen/jwXNPJ?editors=110
这似乎是一个相当常见且不那么奇特的用例,但我以前没有遇到过。我设置了一支笔,但无法在那里复制它,我正在努力找出原因。 Demo Pen 左侧边栏有一个用于元素列表的自定义滚动窗口,但是虽然设置 ove
我是一名优秀的程序员,十分优秀!