【发布时间】:2023-03-25 00:33:02
【问题描述】:
我是 C 的初学者。我遇到了这个错误,我不知道如何解决它。我正在使用 Code:blocks 和 GNU GCC 编译器。这是一个简单的矩阵,必须使用 Shaker 排序进行排序。在我完成这项工作之前,我无法继续。请帮帮我。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
int r=11, s=23, m[r][s], i, j, pom;
printf("Generated matrix:\n\n");
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
m[i][j]=rand()%100;
printf("%3d", m[i][j]);
}
printf("\n");
}
i=0;
j=0;
do{
if(m[i][j]>=m[i+1][j+1])
{
pom=m[i+1][j+1];
m[i+1][j+1]=m[i][j];
m[i][j]=pom;
}
if(j==s)
{
i++;
j=0;
}
if(i==r&&j==s)
break;
j++;
}while(1);
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
m[i][j]=rand()%100;
printf("%3d", m[i][j]);
}
printf("\n");
}
printf("\n\n");
return 0;
}
编辑:
是的,伙计们,我完全错了。现在我不再收到此错误,但我不明白为什么我无法将最高数字设为 m[r][s]。我总是得到完全相同的矩阵。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
int r=11, s=23, m[r][s], i, j, pom;
printf("Generated matrix:\n\n");
for(i = 0;i<r;i++)
{
for(j = 0;j<s;j++)
{
m[i][j] = rand()%100;
printf("%3d", m[i][j]);
}
printf("\n");
}
printf("\n\n");
i=0;
pom=0;
for(j=0;j=s;j++){
if(m[i][j]>=m[i][j+1])
{
pom = m[i][j+1];
m[i][j+1] = m[i][j];
m[i][j] = pom;
}
if(i==r&&j==s)
break;
if(j==s)
{
i++;
j=0;
}
}
for(i = 0;i<r;i++)
{
for(j = 0;j<s;j++)
{
printf("%3d", m[i][j]);
}
printf("\n");
}
printf("\n\n");
return 0;
}
【问题讨论】:
-
man 3 exit和man 2 exit结果是位掩码,只有低位构成实际的exit() 值,其余由进程退出的原因构成。顺便说一句:在“=”运算符周围使用一些空格。 -
这是访问冲突的错误代码。在你的 do-while 循环中,仔细查看
i==r && j==s时会发生什么。提示:你先打第二个if,这对i和j有影响... -
从排序逻辑来看,完全可以想象你退出的访问冲突是准确的。使用集成的
gdb会有所帮助,尽管仅在纸上走算法并记住维度为 N 的数组可以从 0..N-1 开始索引。如果您对if (j==s)的测试是真的,则意味着您已经违反了该索引前提并且您的程序格式不正确(确实如此)。 -
j在 do-while 循环结束时递增,并且在下一次迭代中使用它之前不检查。而对i的唯一检查是j也处于限制状态,if(i==r&&j==s) break;。这永远不会发生,因为当您增加i时,您会重置j。最后,您的矩阵操作被初始随机化的重复所挫败。 -
在您的新编辑中,交换循环现在是
for(j=0;j=s;j++),它在执行循环之前测试结束条件j=s。但是j=s不是一个测试,而是一个赋值,它不仅将j设置为超出矩阵数组的范围,而且对循环计算为true。每次迭代,j超出矩阵范围,i递增,直到循环仅在break被命中时结束。我可以说你需要for(j=0;j<s;j++),但这也不对。在循环中,当您应该使用两个嵌套循环时,您错误地摆弄i和j。