我正在从“C Primer Plus”一书中学习C编程语言。我正在解决一个练习而且撞墙了:
编写一个初始化二维3×5数组的程序,并使用基于VLA的函数将其复制到第二个二维数组。还提供基于VLA的函数来显示两个数组的内容。通常,这两个函数应该能够处理任意N×M阵列。 (如果您无法访问支持VLA的编译器,请使用可处理N×5阵列的传统C函数方法。)
我不能使用VLA,因为我的编译器不支持它,我使用VC2013。这是我的代码:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#define LIM1 10
#define LIM2 10
#define LIM3 2
int ct, ct2, size;
void copy_arr(double *[LIM3], double *[LIM3], int size, int lim);
int main(void)
{
double arr1[LIM1][LIM2], arr2[LIM1][LIM2];
printf("Enter the size of the array\n");
scanf("%d", &size);
printf("Enter the array elements\n");
for (ct = 0; ct < size; ct++)
{
for (ct2 = 0; ct2 < LIM3; ct2++)
{
scanf("%lf", &arr1[ct][ct2]);
}
}
printf("\n");
for (ct = 0; ct < size; ct++)
{
for (ct2 = 0; ct2 < LIM3; ct2++)
{
printf("%.2f ", arr1[ct][ct2]);
}
printf("\n");
}
printf("\n");
copy_arr(arr1, arr2, size, LIM3);
for (ct = 0; ct < size; ++ct)
{
for (ct2 = 0; ct2 < LIM3; ++ct2);
{
arr2[ct][ct2] = arr1[ct][ct2];
printf("%.2f ", arr2[ct][ct2]);
}
printf("\n");
}
printf("\n");
system("pause");
}
void copy_arr(double (*arr1)[LIM3], double (*arr2)[LIM3], int size, int lim)
{
for (ct = 0; ct < size; ct++)
{
for (ct2 = 0; ct2 < lim; ct2++)
{
arr2[ct][ct2] = arr1[ct][ct2];
}
}
return;
}
输出:http://postimg.org/image/mnswuyy2b/
我无法弄清楚如何将size变量的值传递给函数copy_arr
。
除了VLA之外还有其他方法吗?
答案 0 :(得分:2)
arr1[LIM1][LIM2]
是一个大小为LIM1
的数组LIM2
的数组。因此copy_arr
的签名应为:
void copy_arr(double arr1[LIM1][LIM2], double arr2[LIM1][LIM2], int size, int lim);
或因为C ++允许省略第一维:
void copy_arr(double arr1[][LIM2], double arr2[][LIM2], int size, int lim);
或者,由于数组到指针的转换,数组可以转换为指向大小为LIM2
的数组的指针:
void copy_arr(double (*arr1)[LIM2], double (*arr2)[LIM2], int size, int lim);
您的代码中还有另一个问题:
for (ct2 = 0; ct2 < LIM3; ++ct2);
最后一个分号使得以下{}
块不属于循环。删除它。