2017-09-14 1 views
1

2D 배열을 보유하는 구조체를 만들 필요가 있지만 배열 크기가 다를 수 있으므로 일정한 길이로 정의 할 수 없습니다. 이중 포인터가 이중 배열과 같지 않다는 것을 알아 내기 위해서만 이중 포인터로이를 해결하려고했습니다. 그럼 내가 어떻게 할 수 있니?C 구조체 내에서 2D 배열을 사용하는 방법?

struct GaussianKernel { 
    int r; 
    double weightSum; 
    double **kernel; 
}; 

GaussianKernel initializeKernel2D(jdouble sigma){ 
    int r = (int) ceil(3 * sigma); 
    int kernelLen = 2 * r + 1; 
    double G[kernelLen][kernelLen]; 
    double weightSum = 0; 
    double temp; 

    for (int y = -r; y <= r; y++) 
    { 
     for (int x = -r; x <= r; x++) 
     { 
     temp = exp(-(pow(x, 2) + pow(y, 2))/(2 * pow(sigma, 2)))/(2 * PI * pow(sigma, 2)); 
     G[y + r][x + r] = temp; 
     weightSum = weightSum + temp; 
     } 
    } 

    struct GaussianKernel GKernel; 
    GKernel.r = r; 
    GKernel.kernel = G; 
    GKernel.weightSum = weightSum; 

    return GKernel; 
} 
+0

주의의 논리에 따라 GKernel.kernel에 값을 저장할 수있는 코드가에 대한 포인터를 반환하는 노력이 지역 변수 - 그건 끔찍한 잘못입니다. 동적 할당을 사용해야합니다. 이 구조가 사용되는 곳을 얼마나 통제하고 있습니까? 당신이 작성하지 않은 함수에 무엇을 전달할 것입니까? 하나의 옵션은 적절한 크기의'double '값 벡터를 할당 한 다음'gk-> kernel [row * (2 * gk-> r + 1) + col]'(대신에'gk- > kernel [row] [col]'), 배열의 크기를 명시 적으로 구조체에 기록하는 것이 더 좋다. 그것은 다소 사소한 것입니다. 가능하다면 대안들이 더러워진다. –

답변

1

으로 당신이 당신의 2 차원 동적 배열을 할당해야합니다

GKernel.kernel = malloc(kernelLen * sizeof(double *)); 
for(i=0;i<kernelLen;i++) 
GKernel.kernel[i] = malloc(kernelLen * sizeof(double)); 

그런 다음 당신은 당신의 프로그램

+0

질문을 인용하려면 : _ 이중 포인터로만 이것을 해결하려고 시도했습니다. 이중 포인터가 이중 배열과 동일하지 않습니다 ._이 대답은 이중 포인터를 사용하는 것과 매우 흡사합니다. –

+0

사실, 나는 두 배 배열 및 포인터의 배열이 다르다는 데 동의합니다 – Pras

+0

고마워요 내 문제를 해결! – user2333716

관련 문제