Tag: for loop

融合三角形循环进行并行化,计算子索引

并行化的一种常见技术是将嵌套的for循环融合在一起 for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { 至 for(int x=0; x<n*n; x++) { int i = x/n; int j = x%n; 我想知道我怎么能这样做融合像这样的三角形循环 for(int i=0; i<n; i++) { for(int j=0; j<i+1; j++) { 这具有n*(n+1)/2次迭代。 让我们调用融合迭代x 。 使用二次方程式我得出了这个: for(int x=0; x<(n*(n+1)/2); x++) { int i = (-1 + sqrt(1.0+8.0*x))/2; int j = x […]

初始化数组时出现Seg Fault

我正在上课,并遇到分段错误。 根据我的理解,当您访问尚未分配的内存或超出边界时,应该发生seg错误。 ‘当然我要做的就是初始化一个数组(虽然相当大) 我只是误解了如何解析二维数组? 错误放置绑定正是导致seg错误的原因 – 我在使用嵌套for-loop时错了吗? 教授提供了时钟function,所以我希望这不是问题所在。 我在Cygwin中运行此代码,这可能是问题吗? 源代码如下。 也使用c99标准。 要非常清楚:我正在寻找帮助理解(并最终修复)我的代码产生seg错误的原因。 #include #include int main(void){ //first define the array and two doubles to count elapsed seconds. double rowMajor, colMajor; rowMajor = colMajor = 0; int majorArray [1000][1000] = {}; clock_t start, end; //set it up to perform the test 100 times. for(int k = […]

在较大的字符串中查找子字符串的位置

我创建了一个函数,该函数应该在较大的字符串中找到子字符串的第一个字符的数字位置。 我输出有一些问题,我不太清楚为什么。 这些问题包括每次返回-1而不是子串的整数位置。 我已经调试过,无法追踪function出错的地方。 这是函数应该执行的方式:如果我的字符串是“狗很快”而我正在搜索子字符串“dog”,则该函数应返回4.感谢chqrlie对循环的帮助。 这是function: int findSubString(char original[], char toFind[]) { size_t i, j; int originalLength = 0; int toFindLength = 0; originalLength = strlen(original) + 1; toFindLength = strlen(toFind) + 1; for (i = 0; i < toFindLength + 1; i++) { for (j = 0; j < originalLength + 1; j++) { […]

在循环中重新声明for循环变量时出错

考虑一下C程序的片段: for(int i = 0; i < 5; i++) { int i = 10; // <- Note the local variable printf("%d", i); } 它编译时没有任何错误,并且在执行时,它提供以下输出: 1010101010 但是如果我在C ++中编写类似的循环: for(int i = 0; i < 5; i++) { int i = 10; std::cout << i; } 编译失败,出现此错误: prog.cc:7:13: error: redeclaration of ‘int i’ int i = 10; […]

有没有办法在C中只创建一个只有两个表达式的for循环?

我在C标准文本中遇到过这个问题,我可以在§6.8.5找到C99或C11的任何版本: iteration-statement: while ( expression ) statement do statement while ( expression ) ; for ( expression ; expression ; expression ) statement for ( declaration expression ; expression ) statement 这里的第四项似乎是只有一个分号的for ,我在其他地方看不到任何对这种语法的引用。 谁能在这里解释我错过了什么?

没有花括号的for循环有什么作用?

嗨所以基本上我的问题是什么做一个没有任何花括号围绕它的for循环呢? 所以据我所知,在if语句中只执行代码的第一行。 所以在for循环中它是如何工作的? 我没有真正理解没有括号和大括号的循环的概念。 我想用一段代码解释会有所帮助。 顺便说一句,这是在C语言中。 这是我一直在看的代码作为参考。 int main(int argc, char* argv[]) { int i; int count = 0; for (i = 0; i < 5; i++) count++; printf("The value of count is: %d\n", count); return 0; } 在这种情况下,我看到没有花括号,所以我假设它将继续迭代第一个语句,直到我<5,一旦我不小于5它没有做任何事情,但是当我测试了代码我得到它也最终打印printf语句。 我认为没有花括号的循环只执行第一行代码? 或者我在这里遗漏了一些东西。

C for循环索引:在新CPU中前向索引更快?

在我订阅的邮件列表中,两位相当知识渊博的(IMO)程序员正在讨论一些优化的代码,并说出以下内容: 在5 – 8年前发布的CPU上,向后循环迭代的速度稍快( 例如, for (int i=x-1; i>=0; i–) {…} ),因为将i与零进行比较比将其与其他数字相比更有效。 但是对于非常近期的CPU( 例如从2008年到2009年),推测性加载器逻辑使得如果for循环向前迭代它会更好( 例如 for (int i=0; i< x; i++) {…} ) 。 我的问题是,这是真的吗? 最近是否更改了CPU实现,这样前向循环迭代现在比后向迭代有优势? 如果是这样,对此有何解释? 即改变了什么? (是的,我知道,过早的优化是所有邪恶的根源,在考虑微优化之前检查我的算法等等…大多数我只是好奇)

“for(;;)”是什么意思?

在C / C ++中,以下是什么意思? for(;;){ … }

我如何处理OpenMP中的数据竞争?

我试图使用OpenMP在数组中添加数字。 以下是我的代码: int* input = (int*) malloc (sizeof(int)*snum); int sum = 0; int i; for(i=0;i<snum;i++){ input[i] = i+1; } #pragma omp parallel for schedule(static) for(i=0;i<snum;i++) { int* tmpsum = input+i; sum += *tmpsum; } 这并不能产生正确的结果。 怎么了?

如何在C中的for(;;)循环中初始化几个变量?

我以为可以在for循环中初始化几个变量: for (int i = 0, char* ptr = bam; i < 10; i++) { … } 但我发现这是不可能的。 GCC给出以下错误: 错误:’char’之前的预期unqualified-id 你是否真的无法在for循环中初始化不同类型的变量?