배열과 포인터가 그대로 호환되는건 1차원 배열인 경우입니다. 2차원이상의 배열을, 단순히 포인터의 포인터로 형변환할 경우, []를 통한 포인터 연산은 실제 배열구조를 무시하고 무조건 자료형크기만큼씩만 뛰니까요.
2차원이상의 경우는 최고차를 제외한 부분의 배열크기를 명시적으로 적어주어야합니다.
이경우는 두가지 해결법이 있습니다.
1. d를 배열로 선언하지 말고 double **d로 선언하고 동적할당한다.
2. f의 인자를 double**대신에 double [][2]로 한다.
의도하신건 f() 내에서는 d가 double d[][]로 해석되는걸 원하신 거 같은데 실제로는 double *d[]로 해석되니까
생기는 문제인 거 같은데 먼저 답변하신 분께서 말씀하신 2처럼 하셔도 되고 저 경우에는 이런 경우에는 1차원 array라고 생각하고 caller에서 column 수를 넘겨줘서 (d + (sizeof(double) * col) + row)를 해서 씁니다.
근데 1의 방법은 어디서 선언하고 어디서 동적할당 한단 말씀이신지.
=============================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
============================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
배열과 포인터가
배열과 포인터가 그대로 호환되는건 1차원 배열인 경우입니다. 2차원이상의 배열을, 단순히 포인터의 포인터로 형변환할 경우, []를 통한 포인터 연산은 실제 배열구조를 무시하고 무조건 자료형크기만큼씩만 뛰니까요.
2차원이상의 경우는 최고차를 제외한 부분의 배열크기를 명시적으로 적어주어야합니다.
이경우는 두가지 해결법이 있습니다.
1. d를 배열로 선언하지 말고 double **d로 선언하고 동적할당한다.
2. f의 인자를 double**대신에 double [][2]로 한다.
..
double ** d로 선언하고,
d = malloc(..)으로 대입했습니다.
그런데,
passing argument 1 of ‘f’ from incompatible pointer type
이라는 warning이 뜹니다. 함수 f의 인자에서 const를 떼 주니까 경고가 없어지는군요.
이것은 어떻게 해결할 수 없나요?
----------------
agidari.wordpress.com
의도하신건 f()
의도하신건 f() 내에서는 d가 double d[][]로 해석되는걸 원하신 거 같은데 실제로는 double *d[]로 해석되니까
생기는 문제인 거 같은데 먼저 답변하신 분께서 말씀하신 2처럼 하셔도 되고 저 경우에는 이런 경우에는 1차원 array라고 생각하고 caller에서 column 수를 넘겨줘서 (d + (sizeof(double) * col) + row)를 해서 씁니다.
근데 1의 방법은 어디서 선언하고 어디서 동적할당 한단 말씀이신지.
=============================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
...
이렇게 짰었습니다.
void f(const double ** d){
printf("%g\n", d[0][0]);
}
int main(){
double ** d;
d = malloc(....)
d[0][0] = ..;
d[0][1] = ...;
....
f(d);
}
----------------
agidari.wordpress.com
main의 d가 어떻게
main의 d가 어떻게 되는가는 별 상관이 없을 것 같아서 드렸던 질문인데 벌써 해보셨군요^^
간단하게 예제를 짜봤습니다. 다음 두개 코드의 차이를 이해하시면 제가 말씀드리고자 하는 봐를 이해하신겁니다.
그리고
끝으로 저라면
============================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
댓글 달기