프로그래밍
첫 페이지 회원가입 로그인
비공개 손님 2021-08-25 06:48:01
C에서 포인터를 고차원 배열로 바꾸는 법

제가 사용하는 라이브러리에서 필요한 함수 입력인자의 형태가 이런식

&arr[0][0]

으로 되어있는데요. 제가 다루는 변수는 포인터라서 혹시나 포인터를 고차원 배열로 변경하는 방법이 있는지 궁금합니다.

아래에 코드 첨부합니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netcdf.h>
#include <ctype.h>

int *arange_int(int start, int end, int stride);
float *arange_float(float start, float end, float stride);
float fld_mean(float *in_fld, int in_nx, int in_ny, int x_start, int x_end, int y_start, int y_end);
float *fld_init(float *in_fld, int in_nx, int in_ny, float in_thres, int in_res, char *in_var);
int blobcntr(float *in_fld, int in_nx, int in_ny, int in_i, int in_j, int in_tag);
void prnt_2darr(float *in_fld, int in_nx, int in_ny);
void prnt_2darr2(int in_nx, int in_ny, float in_fld[in_nx][in_ny]);

// resolution setting
#define res 288
#define nres 12
#define grd_siz 4000.0

// variable
#define ndim 3
#define var_nm "LWNT"
#define var_thres 250.0
#define x_nm "x"
#define y_nm "y"
#define t_nm "time"


// netcdf error detection
#define err(e) {printf("Error: %s\n", nc_strerror(e)); return 2;}
int main()
{
   // file resolution and output resolution settings
   int nt      = 2400,
       nx      = res,
       ny      = res,
       nres_x  = nx/nres,
       nres_y  = ny/nres;


   // file directory and names
   char in_dir[50] = "/home/rangke/temp/sa.rce/data",
        out_dir[50] = "/home/rangke/work/sa/output",
        in_file_pfix[50]   =  "2d.pw.lwnt.tb.ze.sa.rce",
        out_file_pfix[50]  =  "cluster",
        in_file_nm[90],
        out_file_nm[90];



   // microphysics and temperatures (in array)
   const char *mic_list[4],
              *tmp_list[8];


   // netcdf operations
   int retval,
       in_ncid, out_ncid,
       in_var_id, out_var_id,
       in_x_id, in_y_id, in_t_id,
       out_x_id, out_y_id, out_t_id,
       out_x_dimid, out_y_dimid, out_t_dimid;
   int dimids[ndim];
   size_t start[ndim] = {0,0,0},
          count[ndim] = {1,ny,nx};


   // variable
   float *x_in    = malloc(nx * sizeof(float)),
         *y_in    = malloc(ny * sizeof(float)),
         *t_in    = malloc(nt * sizeof(float)),
         *x_out,
         *y_out,
         *in_var  = malloc(ny * nx * sizeof(float)),
         *pcd_fld = malloc(nres_y * nres_y * sizeof(float));



   // loop variable
   int i,j,t;


   // blob counter variable
   int size, tag, blbgrp;


   mic_list[0] = "s1";
   mic_list[1] = "m2";
   mic_list[2] = "th";
   mic_list[3] = "p3";


   tmp_list[0] = "285";
   tmp_list[1] = "288";
   tmp_list[2] = "291";
   tmp_list[3] = "294";
   tmp_list[4] = "297";
   tmp_list[5] = "300";
   tmp_list[6] = "303";
   tmp_list[7] = "306";


   for(j=0;j<1;j++)
      for(i=0;i<1;i++)
      {
         snprintf(in_file_nm, sizeof(in_file_nm), "%s/%dx%d/%s.%dx%d.%s.%sk.old.nc",
                  in_dir, res, res, in_file_pfix, res, res, mic_list[j], tmp_list[i]);
         printf("%s\n",in_file_nm);

         snprintf(out_file_nm, sizeof(out_file_nm), "%s/%s.%s.%s.%sk.%dx%dto%dx%d.nc",
                  out_dir, out_file_pfix, var_nm, mic_list[j], tmp_list[i], nx, ny, nres_x, nres_y);
         printf("%s\n",out_file_nm);


         if ((retval = nc_open(in_file_nm, NC_NOWRITE, &in_ncid))) err(retval);
         if ((retval = nc_create(out_file_nm, NC_CLOBBER, &out_ncid))) err(retval);

         if ((retval = nc_inq_varid(in_ncid, var_nm, &in_var_id))) err(retval);
         if ((retval = nc_inq_varid(in_ncid, x_nm, &in_x_id))) err(retval);
         if ((retval = nc_inq_varid(in_ncid, y_nm, &in_y_id))) err(retval);
         if ((retval = nc_inq_varid(in_ncid, t_nm, &in_t_id))) err(retval);

         if ((retval = nc_get_var_float(in_ncid, in_x_id, x_in))) err(retval);
         if ((retval = nc_get_var_float(in_ncid, in_y_id, y_in))) err(retval);
         if ((retval = nc_get_var_float(in_ncid, in_t_id, t_in))) err(retval);



         // create netcdf dimensions

         if ((retval = nc_def_dim(out_ncid, y_nm, nres_y, &out_y_dimid))) err(retval);
         if ((retval = nc_def_dim(out_ncid, x_nm, nres_x, &out_x_dimid))) err(retval);
         if ((retval = nc_def_dim(out_ncid, t_nm, NC_UNLIMITED, &out_t_id))) err(retval);


         if ((retval = nc_def_var(out_ncid, y_nm, NC_FLOAT, 1, &out_y_dimid, &out_y_id))) err(retval);
         if ((retval = nc_def_var(out_ncid, x_nm, NC_FLOAT, 1, &out_x_dimid, &out_x_id))) err(retval);

         dimids[0] = out_t_id;
         dimids[1] = out_y_id;
         dimids[2] = out_x_id;

         if ((retval = nc_def_var(out_ncid, var_nm, NC_FLOAT, ndim, dimids, &out_var_id)))


         if ((retval = nc_put_att_text(out_ncid, out_y_id, "units", strlen("m"), "m"))) err(retval);
         if ((retval = nc_put_att_text(out_ncid, out_x_id, "units", strlen("m"), "m"))) err(retval);
         if ((retval = nc_put_att_text(out_ncid, out_var_id, "long_name", strlen("LWNT cluster"), "LWNT cluster"))) err(retval);
         if ((retval = nc_put_att_text(out_ncid, out_var_id, "units", strlen("#"), "#"))) err(retval);

         if ((retval = nc_enddef(out_ncid))) err(retval);

         x_out = arange_float(0.0,x_in[nx-1] + (grd_siz * nres), grd_siz * nres);
         y_out = arange_float(0.0,y_in[ny-1] + (grd_siz * nres), grd_siz * nres);

         if ((retval = nc_put_var_float(out_ncid, out_y_id, &y_out[0]))) err(retval);
         if ((retval = nc_put_var_float(out_ncid, out_x_id, &x_out[0]))) err(retval);


         for(t=0;t<nt;t++)
         {
            size     = 0;
            tag      = 1;
            blbgrp   = 0;
            start[0] = t;

            if ((retval = nc_get_vara_float(in_ncid, in_var_id, start, count, &in_var[0]))) err(retval);


            pcd_fld = fld_init((float*)in_var, nx, ny, var_thres, nres, var_nm);


            for(j=0;j<nres_y;j++)
            {
               for(i=0;i<nres_x;i++)
               {
                  size = blobcntr((float*)pcd_fld,nres_x,nres_y,i,j,tag);
      
                  if (size > 0)
                  {
                     blbgrp += 1;
                     tag += 1;
                     printf("timestep: %d  blbgrp: %d  size : %d\n",t,blbgrp,size);
                  }
               }
            }

            printf("\n=== t = %d ===",t);
         prnt_2darr((float*)pcd_fld,nres_x,nres_y);

            
         if ((retval = nc_put_vara_float(out_ncid, out_var_id, start, count, &pcd_fld[0]))) err(retval);
         }


         if ((retval = nc_close(in_ncid))) err(retval);
         if ((retval = nc_close(out_ncid))) err(retval);
      }

   free(x_in);
   free(y_in);
   free(t_in);
   free(x_out);
   free(y_out);
   free(in_var);
   free(pcd_fld);
   return 0;
}

위의 코트에서

if ((retval = nc_put_vara_float(out_ncid, out_var_id, start, count, &pcd_fld[0]))) err(retval);

부분이 에러가 나는 부분이구요. 여기서 &pcd_fld[0] 이 라이브러러리 예제에 의하면 &pcd_fld[0][0] 이어야 하는데 pcd_fld 변수는 배열이 아니라 포인터라서 전 그냥 &pcd_fld[0] 로 바꿨습니다.

pcd_fld를 2차원 배열로 바꾸면 될거 같은데 포인터를 2차원 배열로 어떻게 바꾸나요?

잡담 | 991명이 읽었어요. 3.215.79.68 |

0
1 비공개 손님 2021-08-25 10:26:11
2차원 배열 구글링하면 많이 나올텐뎅 ㅎ
이게 원하시는 질문이 맞는건가..

arrSizeA = 10;
arrSizeB = 10;

float ** pcd_fld = malloc( arrSizeA * sizeof(float*) );
for( int i=0; i<arrSizeA; i++ )
{
pcd_fld[i] = malloc( arrSizeB, sizeof(float) );
}
////////////////////

for( int i=0; i<arrSizeA; i++ )
{
free( pcd_fld[i] );
}
free pcd_fld;
2 비공개 손님 2021-08-25 11:31:31
답변 감사합니다. float ** pcd_fld 가 float pcd_fld[10][10] 랑 같은건가요?
3 비공개 손님 2021-08-25 20:01:31
원인 찾았네요.... size_t count = {1,ny,nx}; 부분이 잘못됐네요...
4 비공개 손님 2021-08-28 23:57:22
< 배열포인터 실습 >
[예] float pcd_fld[10][10] 선언하여 10x10 메모리 크기의 영역 만들고
char (*arrPtr)[10]; 로 선언 후 pcd_fld 시작 주소값을 넣어
arrPtr 변수를 이용하여 pcd_fld 배열에 접근해 보긔~^^*
댓글을 작성하실 수 없습니다.
(권한이 없는 회원레벨)
목록으로
△ 이전글: ТамреrМоnкеу [3]
▽ 다음글: 한나눔 형태소 분석기 [1]
이용약관 | 광고/제휴 | 개인정보취급방침 | 문의/신고 | 모바일 TE31 | 서버 부하 : 5.75%
실시간 Issue 커뮤니티 TE31 [알지롱] ⓒ 2002-2021
TOP arrow_upward