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