게시판

검색 결과: 17

, Lee Seok님이 작성
 

그냥 단순한 제안입니다. 

메트릭스를 m으로 calling하고, 행렬의 세로방향 크기를 m으로 정한게 햇갈리수도 있다고 생각해서 제안 드린거죠. 


allocMatrix(&m, 3, 3, sizeof(short));와 같이 matrix의 메모리 주소, 행렬 m, 행렬 n, 요소 크기를 넣어주었으므로 이 정보들을 이용해서 함수를 만들면 됩니다.

, 도장_ 관리자님이 작성
 

C 언어는 데이터의 크기를 항상 함께 지정해야 합니다.

자바 같은 언어는 내부에 크기 데이터를 미리 포함하고 있을 뿐입니다. 결국 컴퓨터 관점에서는 데이터는 항상 크기가 지정되어 있어야 합니다.

이에 대해서는 이전 답변을 참조하세요.

https://dojang.io/mod/forum/discuss.php?d=599&parent=1352


 

배열의 []는 C 언어 내부적으로 *로 변환됩니다.

자세한 내용은 이전 답변을 참고하세요.

https://dojang.io/mod/forum/discuss.php?d=699&parent=1577

2차원 배열은 **이고, 2차원 배열을 주소로 전달하고 싶다면 ***이 됩니다.

3차원 배열은 ***이고, 3차원 배열을 주소로 전달하고 싶다면 ****이 됩니다.

실무에서 ***이나 ****이 잘 안 보이는 이유는 ADT(Abstract Data Type, 데이터 추상화)를 사용하기 때문입니다.

typedef double 3dmatrix[30][30][20];
3dmatrix m;   // ***
3dmatrix *ptr = &m;   // ****

실제로는 이렇게 추상화해서 쓰기 때문에 3차원 배열에 대한 4중 포인터가 단일 포인터로 보일 뿐입니다.

prop_type ***proptable;
...
prop_type prop = proptable[c>>14][c>>7&0x7f][c&0x7f];

유니코드에서는 이렇게 문자 테이블을 씁니다.
다단 테이블을 쓰면 1차, 2차에 속하는 데이터 전체를 선택할 수 있습니다.


, Lee Seok님이 작성
 

main 함수에 short 2중 포인터를 선언한 이유가 있을까요? void  allocMatrix함수에서는 3중 포인터가 쓰인 이유가 궁금합니다. 배열이라서 그런건지, 굉장히 햇갈리네요 


void allocMatrix(void ***ptr, int m, int n, int elementSize)

{

*ptr = malloc(sizeof(void *)*m);

for (int i = 0; i < m; i++)

{

(*ptr)[i] = malloc(elementSize*n);

}

}


int main()

{

short **matrix;

allocMatrix(&matrix, 3, 3, sizeof(short));

matrix[0][2] = 10;

matrix[1][1] = 20;

printf("%d %d\n", matrix[0][2], matrix[1][1]);

freeMatrix(&matrix, 3);

return 0;

}



, Lee Seok님이 작성
 

allocMatrix(&matrix)로 하는게 나아 보이는데요. 왜냐면, 뒤에 행렬크기에서도 m이 쓰이니 약간 햇갈리는듯 하네요 


short **matrix;와 같이 이중 포인터에 메모리를 할당하여 행렬을 만들어야 합니다. 여기서 allocMatrix(&m, 3, 3, sizeof(short));와 같이 matrix의 메모리 주소, 행렬 m, 행렬 n, 요소 크기를 넣어주었으므로 이 정보들을 이용해서 함수를 만들면 됩니다.

, 도장_ 관리자님이 작성
 
배열은 크기가 미리 지정됩니다. 즉, 컴파일하기 전에 크기가 정해져 있어야 합니다.

포인터를 이용하면 동적으로 메모리를 할당해 크기를 자유롭게 만들 수 있습니다. 즉, 컴파일 시점이 아닌 실행 시점에 행렬의 크기를 정할 수 있습니다. 실무에서는 정해진 크기가 아니라 동적인 크기를 처리하는 경우가 더 많습니다. 따라서 포인터를 이용한 동적 메모리 할당이 일반적입니다. 이미지 뷰어를 만든다면 그림 크기에 따라 2차원 배열이 필요합니다. (x, y) 좌표에 해당하는 픽셀값을 저장해서 보여줘야 하기 때문이죠. 그림 크기가 800*600이면 800*600*픽셀값에 해당하는 메모리를 할당해야 하고, 그림 크기가 1024*768이면 1024*768*픽셀값에 해당하는 메모리를 할당해야 합니다. 픽셀값은 흑백 이미지이면 1바이트, 24비트 칼라 이미지면 3바이트, 32비트 칼라 이미지면 4바이트가 됩니다. 자세한 것은 이미지 형식(BMP, PNG, JPG 등)에 따라 달라집니다.

Unit 81. 실전예제: 비트맵 파일을 아스키 아트로 변환하기에서는 비트맵 파일(확장자 BMP)을 읽어서 이미지 크기에 따라 동적으로 메모리를 할당합니다. Unit 81까지 학습해보세요. 자연히 이해가 될 것입니다.

, 김 도훈님이 작성
 

문제에서 배열 matrix를 왜 short **matrix와 같이 더블 포인터로 정의하는 건가요??