반응형
C에서 어려운 부분이 ponter입니다.
특히 dimension과 같이 사용할 때 어려운 점이 많습니다.
MISRA C_2012 Guidelines for the use of the C language in critical systems에서는 pointer로 선언했을 경우 dimension 보다는 pointer를 사용하라고 합니다.
아래의 예제는 dimension을 선언하였을 때 사용하는 방법입니다.
void pointer_test(double *vdst, int stride_dst, const double* vsrc, int stride_src, int n)
{
int i;
if (stride_dst != 1 || stride_src != 1)
{
/*
* general unoptimized case
*/
for (i = 0; i < n; i++, vdst += stride_dst, vsrc += stride_src)
*vdst = *vsrc;
}
else
{
/*
* optimized case
*/
int n2 = n / 2;
for (i = 0; i < n2; i++, vdst += 2, vsrc += 2)
{
vdst[0] = vsrc[0];
vdst[1] = vsrc[1];
}
if (n % 2 != 0)
vdst[0] = vsrc[0];
}
}
int main(int argc, char **argv)
{
int i, j;
double pp_double[10][10];
double p_double[10];
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
pp_double[i][j] = (j + i * 10);
}
p_double[i] = i;
}
for (i = 0; i <= 10; i++)
{
pointer_test(&pp_double[i][0], 1, &p_double[0], 1, 10);
}
}
이것을 pointer로 사용하는 경우에는 다음과 같습니다.
void pointer_test(double *vdst, int stride_dst, const double* vsrc, int stride_src, int n)
{
int i;
if (stride_dst != 1 || stride_src != 1)
{
/*
* general unoptimized case
*/
for (i = 0; i < n; i++, vdst += stride_dst, vsrc += stride_src)
*vdst = *vsrc;
}
else
{
/*
* optimized case
*/
int n2 = n / 2;
for (i = 0; i < n2; i++, vdst += 2, vsrc += 2)
{
vdst[0] = vsrc[0];
vdst[1] = vsrc[1];
}
if (n % 2 != 0)
vdst[0] = vsrc[0];
}
}
int main(int argc, char **argv)
{
int i, j;
double **pp_double;
double *p_double;
pp_double = new double[10];
p_double = new double[10];
for(i = 0; i < 10; i++) {
pp_double[i] = new double[10];
}
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
*(*(pp_double + i) + j)) = (j + i * 10);
}
*(p_double + i) = i;
}
for (i = 0; i <= 10; i++)
{
pointer_test((*(pp_double + i) + 0), 1, p_double, 1, 10);
}
}
코드를 비교해 보시면 아시겠지만 다시 한번 써보면 dimension의 경우
p_double[i] = i;
*(p_double + i) = i;
두 코드는 같습니다.
또한
&p_double[i] 와 (p_double + i) 도 같습니다. (주소를 참조하는 경우 입니다.)
2차 dimension의 경우
pp_double[i][j] = ( j + i * 10);
*(*(pp_double + i) + j) = (j + i * 10);
이 두 코드도 동일합니다.
주소를 참조하는 경우
&pp_double[i][j] 는 (*(pp_double + i) + j) 와 같습니다.
위의 두 예제를 디버깅 해 보시기 바랍니다.
반응형
'Windows' 카테고리의 다른 글
Visual Studio 텍스트 편집기 왼쪽 아이콘들 (0) | 2021.02.22 |
---|---|
wsl2 xrdp 사용하기 (0) | 2021.02.09 |
WSL에서 Linux Ext4 사용해서 복사하기 (0) | 2021.01.30 |
작업 스케쥴러 오류 (0) | 2021.01.28 |
노트북에 설치된 Windows10 제품키 확인 (0) | 2021.01.27 |