Создание функции, которая копирует содержимое трехмерного массива - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь выяснить, как создать функцию, которая копирует содержимое из одного 3D-массива в другой 3D-массив, который должен быть пользовательский ввод . Мне удалось сделать программу в рамках одной основной функции, однако желаемый способ реализации этого заключается в наличии двух или более функций.

Первая попытка была следующей (то есть неверной - в одной основной функции)

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);



    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");
        }
    }

возврат 0; }

После того, как я провел исследование, и то, на что я не наткнулся, это было похоже на меня, оно требует ввода данных пользователем, однако это в 1D и не копирует содержимое. Размер массива пользовательского ввода C

После просмотра я пытаюсь настроить следующее, однако при попытке распечатать исходный массив (даже не скопированный) происходит сбой системы.

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

void printArray(int ***cpydisp,int x,int y,int z) {
    int i,j,k;
    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 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);
}


int main(void) {
    int x,y,z;
    printf("Enter the size of the array:\n");
    scanf("%d", &x);
    printf("Enter the size of the array:\n");
    scanf("%d", &y);
    printf("Enter the size of the array:\n");
    scanf("%d", &z);

    // ask for enough memory to fit `count` elements,
    // each having the size of an `int`
    int ***array = malloc(x * y * z * sizeof(***array));

    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 display[%d][%d][%d]:", i, j, k);
                scanf("%d", &array[i][j][k]);
            }
        }
    }

    printArray(array, x, y, z);

    free(array);
}

Заранее спасибо

1 Ответ

0 голосов
/ 13 января 2019

Это не рекомендуется ... но вам не хватает выделения памяти для массива. Для того, чтобы обернуть голову вокруг памяти и многомерных массивов, мне нравится думать о них поэтапно, и они также настраивают их поэтапно. Итак, сначала вы используете столбцы malloc, затем строки и т. Д.

так что вы попадаете с этим:

// get the columns mem sorted
int ***array = (int ***)malloc(y * sizeof(***array));

// loop through all the columns and give them enough mem for a row
for (int j = 0; j < y; j++) {
    array[j] = (int **)malloc(x * sizeof(**array));

    //loop through each row and give them them enough mem for z axis
    for (int i = 0; i < x; i++) {
        array[j][i] = (int *)malloc(x * sizeof(*array));
    }
}

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 display[%d][%d][%d]:", i, j, k);
            scanf("%d", &array[i][j][k]);
        }
    }
}

Это все настраивает, и вы можете получить доступ к членам. Но это означает, что в конце программы вам нужно повторить цикл, и вместо malloc вам нужно освободить все эти элементы. Опять же, это не рекомендуется. Прочитайте это или избавьте себя от головной боли имитируйте трехмерный массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...