二维数组元素在设置后发生变化
2D Array elements changing after they are set
下面的程序旨在根据用户输入的维度打印一个整数正方形网格(作为 edx 上哈佛 cs50 课程的一部分)。
数组初始化正确,但是打印出来的时候,最后一列总是打印不正确。我尝试通过在 init() 函数的最内层 for 循环中放置 2 个 printf 语句来进行调试。
似乎在最外层循环运行一次后,最后一列中的条目减少了一个,尽管在此之前它是正确的。
为什么会这样?它不应该正确打印吗?
#include <stdio.h>
main()
{
void init(int dim, int arr[dim-1][dim-1]);
int dim;
printf("Enter board dimension(max 10): ");
scanf("%d", &dim);
int arr[dim-1][dim-1];
init(dim, arr);
int i,j;
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
printf("%2d ",arr[i][j]);
}
printf("\n");
}
}
void init(int dim, int arr[dim-1][dim-1])
{
int i,j,p;
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
arr[i][j] = (dim*dim-1)-i*dim-j;
}
for(p=0;p<dim;p++)
{
printf("%d ", arr[i][p]);
if(i>=1)
printf("%d ", arr[i-1][p]);
}
}
printf("\n");
if(dim%2==0)
{
arr[dim-1][dim-3] = 1;
arr[dim-1][dim-2] = 2;
}
}
编辑:现在应该编译
您用 a[dim - 1][dim - 1]
定义数组,这比所需的维度少一维。如果用户输入“4”,则创建一个 3×3 数组。
您的数组是二维数组,长度可变。因此,您必须在函数中将维度与数组一起传递,至少对于最后一个维度。您正确地执行了此操作,但是 ´initbehaves as if the array were
a[dim][dim], when it's actually
a[dim - 1][dim - 1]`.
中的代码
定义具有实际维度的数组,dim
并访问索引为 0
到 dim - 1
的元素。这通常在这样的循环中完成:
for (int i = 0; i < dim; i++) ...
看到 >=
或 dim - 1
类似的东西应该让你保持警惕。
你的程序现在看起来像这样:
#include <stdio.h>
void init(int dim, int arr[dim-1][dim-1]);
void print(int dim, int arr[dim-1][dim-1]);
int main(void)
{
int dim;
printf("Enter board dimension: ");
scanf("%d", &dim);
int arr[dim][dim];
init(dim, arr);
print(dim, arr);
return 0;
}
void print(int dim, int arr[dim][dim])
{
int i,j;
for(i = 0; i < dim; i++) {
for(j = 0; j < dim; j++) {
printf("%2d ", arr[i][j]);
}
printf("\n");
}
}
void init(int dim, int arr[dim][dim])
{
int i, j;
for(i = 0; i < dim; i++) {
for(j = 0; j < dim; j++) {
int ii = dim - 1 - i;
int jj = dim - 1 - j;
arr[i][j] = ii*dim + jj;
}
}
}
下面的程序旨在根据用户输入的维度打印一个整数正方形网格(作为 edx 上哈佛 cs50 课程的一部分)。
数组初始化正确,但是打印出来的时候,最后一列总是打印不正确。我尝试通过在 init() 函数的最内层 for 循环中放置 2 个 printf 语句来进行调试。 似乎在最外层循环运行一次后,最后一列中的条目减少了一个,尽管在此之前它是正确的。
为什么会这样?它不应该正确打印吗?
#include <stdio.h>
main()
{
void init(int dim, int arr[dim-1][dim-1]);
int dim;
printf("Enter board dimension(max 10): ");
scanf("%d", &dim);
int arr[dim-1][dim-1];
init(dim, arr);
int i,j;
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
printf("%2d ",arr[i][j]);
}
printf("\n");
}
}
void init(int dim, int arr[dim-1][dim-1])
{
int i,j,p;
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
arr[i][j] = (dim*dim-1)-i*dim-j;
}
for(p=0;p<dim;p++)
{
printf("%d ", arr[i][p]);
if(i>=1)
printf("%d ", arr[i-1][p]);
}
}
printf("\n");
if(dim%2==0)
{
arr[dim-1][dim-3] = 1;
arr[dim-1][dim-2] = 2;
}
}
编辑:现在应该编译
您用 a[dim - 1][dim - 1]
定义数组,这比所需的维度少一维。如果用户输入“4”,则创建一个 3×3 数组。
您的数组是二维数组,长度可变。因此,您必须在函数中将维度与数组一起传递,至少对于最后一个维度。您正确地执行了此操作,但是 ´initbehaves as if the array were
a[dim][dim], when it's actually
a[dim - 1][dim - 1]`.
定义具有实际维度的数组,dim
并访问索引为 0
到 dim - 1
的元素。这通常在这样的循环中完成:
for (int i = 0; i < dim; i++) ...
看到 >=
或 dim - 1
类似的东西应该让你保持警惕。
你的程序现在看起来像这样:
#include <stdio.h>
void init(int dim, int arr[dim-1][dim-1]);
void print(int dim, int arr[dim-1][dim-1]);
int main(void)
{
int dim;
printf("Enter board dimension: ");
scanf("%d", &dim);
int arr[dim][dim];
init(dim, arr);
print(dim, arr);
return 0;
}
void print(int dim, int arr[dim][dim])
{
int i,j;
for(i = 0; i < dim; i++) {
for(j = 0; j < dim; j++) {
printf("%2d ", arr[i][j]);
}
printf("\n");
}
}
void init(int dim, int arr[dim][dim])
{
int i, j;
for(i = 0; i < dim; i++) {
for(j = 0; j < dim; j++) {
int ii = dim - 1 - i;
int jj = dim - 1 - j;
arr[i][j] = ii*dim + jj;
}
}
}