嗨,我在教科书中偶然发现一个问题:“写一个函数,该函数可以复制3D整数数组的内容。该功能应支持任何3D数组大小。'
在与我的讲师讨论之后,他指定该函数的原型应类似于此(这是2D,我需要3D)。
int sum2d(int rows, int cols, int ar[rows][cols]);
现在,通过在main函数中制作所有内容,我目前的编码方式是这样的,它应按应有的方式工作,即复制所有内容等。
int main()
{
int x,y,z;
printf("Enter x value.\n");
scanf("%d", &x);
printf("Enter y value.\n");
scanf("%d", &y);
printf("Enter z value.\n");
scanf("%d", &z);
int *arrx = malloc(x * sizeof(*arrx));
int *arry = malloc(y * sizeof(*arry));
int *arrz = malloc(z * sizeof(*arrz));
printf("The size of the array is %d.\n", x*y*z);
/* 3D array declaration*/
int disp[x][y][z];
int cpydisp[x][y][z];
/*Counter variables for the loop*/
int i, j, k;
for(i=0; i<x; i++) {
for(j=0;j<y;j++) {
for (k = 0; k < z; k++) {
printf("Enter value for disp[%d][%d][%d]:", i, j, k);
scanf("%d", &disp[i][j][k]);
}
}
}
memcpy(cpydisp,disp, sizeof(disp));
//Displaying array elements
printf("Three Dimensional array elements:\n");
for(i=0; i<x; i++) {
for(j=0;j<y;j++) {
for (k = 0; k < z; k++) {
printf("%d ", cpydisp[i][j][k]);
}
printf("\n");
}
}
}
但是,这是不正确的,因为我需要实现仅用于复制的功能,所以我想到了这一点。创建一个名为void array_copy
的函数,该函数实际上由memcpy将数组disp
的内容复制到另一个数组cpydisp
。然后在主函数中调用函数array_copy
,但这不起作用。
int i, j, k;
int x,y,z;
int disp[x][y][z];
int cpydisp[x][y][z];
void array_copy() {
memcpy(cpydisp, disp, sizeof(disp));
//Displaying array elements
printf("Three Dimensional array elements:\n");
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++) {
for (k = 0; k < z; k++) {
printf("%d ", cpydisp[i][j][k]);
}
printf("\n");
}
}
}
int main()
{
printf("Enter x value.\n");
scanf("%d", &x);
printf("Enter y value.\n");
scanf("%d", &y);
printf("Enter z value.\n");
scanf("%d", &z);
//int *arrx = malloc(x * sizeof(*arrx));
//int *arry = malloc(y * sizeof(*arry));
//int *arrz = malloc(z * sizeof(*arrz));
printf("The size of the array is %d.\n", x*y*z);
/* 3D array declaration*/
/*Counter variables for the loop*/
int i, j, k;
for(i=0; i<x; i++) {
for(j=0;j<y;j++) {
for (k = 0; k < z; k++) {
printf("Enter value for disp[%d][%d][%d]:", i, j, k);
scanf("%d", &disp[i][j][k]);
}
}
}
array_copy();
}
任何人都想知道如何修复它,因为当用户在开始任何操作之前先估算出想要的尺寸时,它似乎可以占用任何尺寸时,我似乎无法理解它的问题。
预先感谢
编辑:
#include<stdio.h>
#include <string.h>
int x,y,z;
int i, j, k;
void user_input(){
printf("Enter x value.\n");
scanf("%d", &x);
printf("Enter y value.\n");
scanf("%d", &y);
printf("Enter z value.\n");
scanf("%d", &z);
}
void array_copy() {
int disp[x][y][z];
int cpydisp[x][y][z];
memcpy(cpydisp, disp, sizeof(disp));
//Displaying array elements
printf("Three Dimensional array elements:\n");
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++) {
for (k = 0; k < z; k++) {
printf("%d ", cpydisp[i][j][k]);
}
printf("\n");
}
}
}
int main()
{
user_input();
int disp[x][y][z];
int cpydisp[x][y][z];
printf("The size of the array is %d.\n", x*y*z);
/* 3D array declaration*/
/*Counter variables for the loop*/
for(i=0; i<x; i++) {
for(j=0;j<y;j++) {
for (k = 0; k < z; k++) {
printf("Enter value for disp[%d][%d][%d]:", i, j, k);
scanf("%d", &disp[i][j][k]);
}
}
}
array_copy();
}
我已经以这种方式重试了,现在正在输出某些内容,而不是第二次尝试,但是输出只是随机数。即:
Enter x value.
1
Enter y value.
2
Enter z value.
3
The size of the array is 6.
Enter value for disp[0][0][0]:1
1
Enter value for disp[0][0][1]:2
2
Enter value for disp[0][0][2]:3
3
Enter value for disp[0][1][0]:4
4
Enter value for disp[0][1][1]:5
5
Enter value for disp[0][1][2]:6
6
Three Dimensional array elements:
797168 0 6421264
0 3 0
Process finished with exit code 0
正确的输出应为1,2,3,4,5,6
再次感谢
答案 0 :(得分:0)
鉴于您有一个实际的3D阵列,该函数很简单:
memcpy( dst, src, sizeof(int[x][y][z]) );
如果出于学习目的,您想自己编写一个效率较低的版本,则如下所示:
void copy (size_t x, size_t y, size_t z, int dst[x][y][z], int src[x][y][z])
{
for(size_t i=0; i<x; i++)
for(size_t j=0; j<y; j++)
for(size_t k=0; k<z; k++)
dst[i][j][k] = src[i][j][k];
}
代码不起作用的原因是因为您使用了可变长度数组(VLA),但在文件范围(“全局”)中声明了它们,这是不允许的。必须在本地范围内声明VLA,并且必须在声明VLA之前将数组边界设置为有效值。
上面的代码不在乎3D数组的分配方式,而是将其留给调用者。
答案 1 :(得分:0)
编写一个函数,该函数可以复制3D整数数组的内容。该功能应支持任何3D数组大小
类似
int sum2d(int rows, int cols, int ar[rows][cols]);
OP使用全局variable-length array (VLA)的方法失败,因为在文件范围内不允许使用VLA。
VLA不能初始化(在声明时给定值)。但是,可以在运行时分配它们的元素。
有了VLA d[x][y][z]
(在C99和C11中可选),使用memcpy()
很容易。
在函数内,使用大小:sizeof d[0] * x
。
memcpy(d, src, sizeof d[0] * x);
实施说明:
s, d
是指针。
size_t
是一些无符号类型,它是用于处理大小和数组索引的正确宽度。 int
可能太窄了。
使用int d[x][y][z]
作为参数,尺寸信息x
丢失。
x
可能被编译器用于选择优化和检查,但是代码将d
视为类型int (*)[y][z]
。
#include <stddef.h>
void copy3d(size_t x, size_t y, size_t z, int d[x][y][z], int src[x][y][z]) {
printf("s[%zu][%zu][%zu]\nSizes: d:%zu, d[]:%zu, d[][]:%zu, d[][][]:%zu\n\n",
x, y, z, sizeof d, sizeof d[0], sizeof d[0][0], sizeof d[0][0][0]);
// 'sizeof' on array function parameter 'src' returns
// size of 'int (*)[(sizetype)(y)][(sizetype)(z)]
memcpy(d, src, sizeof d[0] * x);
}
样品用量
#include <stdio.h>
int main(void) {
size_t x = (unsigned) rand() % 4 + 1;
size_t y = (unsigned) rand() % 4 + 1;
size_t z = (unsigned) rand() % 4 + 1;
int src[x][y][z];
int i = 0;
for (size_t xi = 0; xi < x; xi++) {
for (size_t yi = 0; yi < y; yi++) {
for (size_t zi = 0; zi < z; zi++) {
src[xi][yi][zi] = ++i;
}
}
}
int dest[x][y][z];
// Call with two 3D: dest, and src, along with dimension info.
copy3d(x, y, z, dest, src);
for (size_t xi = 0; xi < x; xi++) {
printf("{");
for (size_t yi = 0; yi < y; yi++) {
printf("{");
for (size_t zi = 0; zi < z; zi++) {
printf("%2d ", dest[xi][yi][zi]);
}
printf("}, ");
}
printf("}\n");
}
}
输出
s[2][4][3]
Sizes: d:8, d[]:48, d[][]:12, d[][][]:4
{{ 1 2 3 }, { 4 5 6 }, { 7 8 9 }, {10 11 12 }, }
{{13 14 15 }, {16 17 18 }, {19 20 21 }, {22 23 24 }, }