NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

VB.NET wrapper for NetCDF

Hi,

some time ago, I reported a problem I´ve experienced using the VB.NET class
of NetCDF. The NetCDF files I am working with contain a 2-dimensional string
(or char) variable of the type

        char peak_name(peak_number, _32_byte_string) 
        with the two dimensions peak_number=7 and _32_byte_string=32

The data of the variable peak_name are therefore 7 strings (the peak names).

Using the code
        vartext = New StringBuilder(dimlen - 1)
        res = NetCDF.nc_get_var_text(ncid, varid, vartext)

which was used by Ed Hartnett in a sample application he provided together
with the VB.NET wrapper class, I could read only one (the first) string
(peak name) from the 2-dimensional variable.

I now found a solution to read all string data (all peak names) from the
variable.
The data can all be read using the NetCDF function

 Declare Ansi Function nc_get_var1_text Lib "netcdf.dll" (ByVal ncid As
Int32, _
        ByVal varid As Int32, <[In](), Out()> ByVal indexp() As Int32, _
        ByVal ip As StringBuilder) As Int32

As I understand, the first index value of the indexp() variable
(indexp(0))points to the data of the first dimension, the second index value
(indexp(1)) to the second dimension. A definite set of values points to a
definite character (for example indexp(0)=0 and indexp(1) =1 points to the
second character in the first string). The function stores that char in the
StringBuilder ip.
Now one can loop through both dimensions and read each caracter at a time.
The way I implement this in my code is as follows:


Me.listview.items.clear

        res=NetCDF.nc_inq_varid (ncid, "peak_name", varid) 

For k= 0 To number_of_peaks-1
   dimname = New StringBuilder(32)
        For i= 0 To 31
                indexp(0)=k
                indexp(1)=i
                Try     
                        res = NetCDF.nc_get_var1_text(ncid, varid,indexp, 
varname)
                If (res <> 0) Then exit for  ' GoTo err          
                        dimname.append(varname(0))                
                Catch ex as IndexOutOfRangeException
                Exit For
                End Try
        Next i
        Me.listView.Items.Add(dimname.tostring)
Next k


The error handling is necessary, because an IndexOutOfRangeException always
occurs when the variable i exceeds the length of a string (a peak name). The
second dimension (_32_byte_string) only specifies the maximum number of
characters of a peak name, but they can have a smaller length.

With best regards

H.J. Rieger

-- 
"Sie haben neue Mails!" - Die GMX Toolbar informiert Sie beim Surfen!
Jetzt aktivieren unter http://www.gmx.net/info


  • 2004 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: