[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 20010103: multi-dimensional array writes in c++
- Subject: Re: 20010103: multi-dimensional array writes in c++
- Date: Thu, 03 Jan 2002 13:54:51 -0700
>To: address@hidden
>cc: address@hidden
>From: Bill Cassanova <address@hidden>
>Subject: multi-dimensional array writes in c++
>Organization: UCAR/Unidata
>Keywords: 200201031845.g03IgdN17359
Hi Bill,
> I am using the netCDF c++ interface and have not been able to find
> an example of doing a multi-dimensional put.
>
> Here's a couple of code snippets.
>
> First the CDL:
> netcdf foo{
> dimensions:
> msn = 18000 ;
> ftd = 1 ;
> fvd = 10 ;
> variables:
> int site_list(msn) ;
> float maxt_f(msn, fvd) ;
> float mint_f(msn, fvd) ;
> int icon_code1(msn, fvd) ;
> };
>
> Now the C++ portion:
> float foo[10][10];
> for( int i = 0; i < 10; i++ ){
> for( int j = 0; j < 10; j++ ){
> foo[i][j] = 999;
> }
> }
>
> NcVar *var=nc->get_var( "maxt_f" );
> assert(var);
> var->put( foo, 10, 10 );
>
> The problem is the netCDF interface requires a float * instead of a
> float **. Is there some way other than allocating another float *
> and copying foo into it to make this work?
>
> I've tried:
> var->put((int*)*foo, 10, 10 );
> var->put(*foo[0], 10, 10 );
Try
var->put(&foo[0][0], var->edges());
or equivalently
var->put(foo[0], var->edges());
There's an example that puts data in a 3-dimensional array in the
distributed netCDF source in the file
src/cxx/example.cpp
which is supposed to do the same thing in C++ that the equivalent C
code does in
src/cxx/example.c
Generally in either C or C++, if the prototype of a function requires
a foo* argument (a pointer to a foo), then you can supply a &foo (the
address of a foo). Since the netCDF C++ interface requires a float*
and foo[0][0] is a float, then &foo[0][0] is a float* so is the right
type. You could also use just foo[0], since a diagram of how arrays
work in C (or C++) shows that's the same as &foo[0][0].
Please let us know if this doesn't work.
--Russ