好吧,所以我试图让用户输入列数和行数,然后让输出显示一个随机数矩阵,然后是一个平滑的图像矩阵,它找到数组中每个像素的平均滤波器。现在我把它带到了可以给我一个随机数字矩阵的地方,但平滑的矩阵完全没有了。现在我编写的代码只关注有4个邻居的整数,但显然我做错了。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
// function that randomly generates numbers
void fillArray(int a[10][20], int m, int n)
{
int random;
int i,j;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
random=rand()%100;
a[i][j]=random;
}
}
}
// function that prints the first matrix of random numbers
void printarray (int a[10][20], int m, int n)
{
int i,j;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
}
// function that finds the mean for any number and its 4 nieghbors
void smooth (int a[10][20], int m, int n)
{
int i,j;
for (i=1;i<m;i++)
{
for (j=1;j<n;j++)
{
a[i][j]=a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
printf("%4d",a[i][j]);
}
printf("\n");
}
}
int main()
{
int a[10][20];
int m,n;
srand(time(NULL));
//User input
printf("please enter number of columns and rows");
scanf("%d %d", &m,&n);
fillArray(a,m,n);
printarray (a,m,n);
printf("The smoothed image is\n");
smooth(a,m,n);
getch();
return 0;
}
现在,如果我输入3和3,我会得到这样的东西:
23 43 54
12 76 89
56 98 24
The smoothed image is
347373849493234343
12 23345345345
2132334565645645645
有人有任何想法吗?
答案 0 :(得分:0)
看起来你访问了一个[m] [..]和一个[..] [n](因为你循环而i&lt; m,例如,访问i + 1),这些都没有在你的随机中初始化数字生成函数。
编辑:分配值时,每个循环从0到m-1 / n-1
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
random=rand()%100;
a[i][j]=random;
}
}
但是当你使用这些值时,每个循环从1到m-1 / n-1,但在这个循环中你使用相邻的单元格(i-1,j-1,i + 1,j + 1)
for (i=1;i<m;i++)
{
for (j=1;j<n;j++)
{
a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
}
}
}
这意味着在最后一次迭代(i = m - 1)中,您访问未初始化的单元格,因为您访问i + 1 = m 请记住,多维数组实际上是内存中的一维数组,因此其中一些调用实际上不是未初始化的值,但有些是
要解决此问题,您可以在分配阶段循环直到m / n(而不是m-1 / n-1)