C의 함수로 2D 어레이(매트릭스)를 통과시키는 방법
매트릭스 작업을 지속하려면 이 작업을 수행해야 합니다.그건 참고인 통과가 필요하다는 뜻인가요?
이것으로 충분할까요?
void operate_on_matrix(char matrix[][20]);
C에는 실제로 다차원 배열이 없지만 시뮬레이트하는 방법은 여러 가지가 있습니다.이러한 어레이를 함수에 전달하는 방법은 다차원 시뮬레이션에 사용되는 방법에 따라 달라집니다.
1) 어레이 어레이를 사용합니다.이는 컴파일 시 어레이의 범위가 완전히 결정되거나 컴파일러가 VLA를 지원하는 경우에만 사용할 수 있습니다.
#define ROWS 4
#define COLS 5
void func(int array[ROWS][COLS])
{
int i, j;
for (i=0; i<ROWS; i++)
{
for (j=0; j<COLS; j++)
{
array[i][j] = i*j;
}
}
}
void func_vla(int rows, int cols, int array[rows][cols])
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i][j] = i*j;
}
}
}
int main()
{
int x[ROWS][COLS];
func(x);
func_vla(ROWS, COLS, x);
}
2) (동적으로 할당된) 어레이에 대한 포인터 어레이를 사용합니다.이는 런타임까지 어레이 경계를 알 수 없는 경우에 주로 사용됩니다.
void func(int** array, int rows, int cols)
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i][j] = i*j;
}
}
}
int main()
{
int rows, cols, i;
int **x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * sizeof *x);
for (i=0; i<rows; i++)
{
x[i] = malloc(cols * sizeof *x[i]);
}
/* use the array */
func(x, rows, cols);
/* deallocate the array */
for (i=0; i<rows; i++)
{
free(x[i]);
}
free(x);
}
3) 1차원 배열로 지수를 고정한다.이는 정적으로 할당된 어레이(고정 크기)와 동적으로 할당된 어레이 모두에 사용할 수 있습니다.
void func(int* array, int rows, int cols)
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i*cols+j]=i*j;
}
}
}
int main()
{
int rows, cols;
int *x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * cols * sizeof *x);
/* use the array */
func(x, rows, cols);
/* deallocate the array */
free(x);
}
4) 동적으로 할당된 VLA를 사용합니다.옵션 2에 비해 이 방법의 장점 중 하나는 단일 메모리 할당이 있다는 것입니다.또 다른 장점은 포인터의 배열을 필요로 하지 않기 때문에 필요한 메모리가 적다는 것입니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
extern void func_vla(int rows, int cols, int array[rows][cols]);
extern void get_rows_cols(int *rows, int *cols);
extern void dump_array(const char *tag, int rows, int cols, int array[rows][cols]);
void func_vla(int rows, int cols, int array[rows][cols])
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
array[i][j] = (i + 1) * (j + 1);
}
}
}
int main(void)
{
int rows, cols;
get_rows_cols(&rows, &cols);
int (*array)[cols] = malloc(rows * cols * sizeof(array[0][0]));
/* error check omitted */
func_vla(rows, cols, array);
dump_array("After initialization", rows, cols, array);
free(array);
return 0;
}
void dump_array(const char *tag, int rows, int cols, int array[rows][cols])
{
printf("%s (%dx%d):\n", tag, rows, cols);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
printf("%4d", array[i][j]);
putchar('\n');
}
}
void get_rows_cols(int *rows, int *cols)
{
srand(time(0)); // Only acceptable because it is called once
*rows = 5 + rand() % 10;
*cols = 3 + rand() % 12;
}
가변 길이 2D 어레이를 통과하기 위한 가장 쉬운 방법
C와 C++의 가장 깨끗한 기술은 2D 어레이를 1D 어레이와 같이 통과시킨 후 함수 내에서 2D로 사용하는 것입니다.
#include <stdio.h>
void func(int row, int col, int* matrix){
int i, j;
for(i=0; i<row; i++){
for(j=0; j<col; j++){
printf("%d ", *(matrix + i*col + j)); // or better: printf("%d ", *matrix++);
}
printf("\n");
}
}
int main(){
int matrix[2][3] = { {0, 1, 2}, {3, 4, 5} };
func(2, 3, matrix[0]);
return 0;
}
내부적으로는 어레이의 치수 수에 관계없이 C/C++는 항상 1D 어레이를 유지합니다.이렇게 다차원 배열을 통과할 수 있습니다.
"데이터를 잃어버리지 마세요"라는 말이 무슨 뜻인지 모르겠어요.일반 2D 어레이를 함수에 전달하는 방법은 다음과 같습니다.
void myfunc(int arr[M][N]) { // M is optional, but N is required
..
}
int main() {
int somearr[M][N];
...
myfunc(somearr);
...
}
2D 어레이:
int sum(int array[][COLS], int rows)
{
}
3D 어레이:
int sum(int array[][B][C], int A)
{
}
4D 어레이:
int sum(int array[][B][C][D], int A)
{
}
및 nD 어레이:
int sum(int ar[][B][C][D][E][F].....[N], int A)
{
}
언급URL : https://stackoverflow.com/questions/3911400/how-to-pass-2d-array-matrix-in-a-function-in-c
'programing' 카테고리의 다른 글
VueJs 2를 사용한 기본적인 CRUD SQLite 3의 구조 (0) | 2022.08.11 |
---|---|
계산된 메서드 vuejs에서 개체 배열을 생성하시겠습니까? (0) | 2022.08.11 |
TypeError: state.categoriesState.푸시는 VUEX 함수가 아닙니다. (0) | 2022.08.11 |
Vuex 모듈을 추가할 때 "rawModule is defined"라고 표시되는 이유는 무엇입니까? (0) | 2022.08.11 |
Gson: 문자열을 Json Object로 직접 변환(POJO 없음) (0) | 2022.08.10 |