Package: dx
Version: 1:4.4.4-9+b1

Import of NetCDF files produces incorrect integer values on systems where long is not 32 bits. This can be seen by running the attached nctest.net and importing nctest.nc. The file can be inspected with
ncdump.  The connections, being int valued, will be imported incorrectly.

The attached patch should fix the problem. The erroneous code assumed that the NetCDF type NC_LONG corresponds to long. However, NC_LONG is a deprecated alias for NC_INT and by definition 32 bits, whereas long varies by platform. These days it is better to leave such type conversions to the NetCDF library, which provides likely more efficient and correct routines.

The patch also fixes a debug output routine, which casts pointers into unsigned int for printing. It seems that the routine is never called but at least compiler warnings are eliminated.

--
        Timo Korvola            <URL:http://www.iki.fi/tkorvola>

Attachment: nctest.nc
Description: Cdf file

//
// time: Fri Feb 24 00:10:21 2017
//
// version: 3.2.0 (format), 4.4.4 (DX)
//
//
// MODULE main
// workspace: width = 321, height = 499
// layout: snap = 0, width = 50, height = 50, align = NN
//
macro main(
) -> (
) {
    // 
    // node FileSelector[1]: x = 72, y = 14, inputs = 0, label = FileSelector
    // output[1]: visible = 1, type = 32, value = "/home/thk/src/test/nctest.nc"
    // output[2]: visible = 1, type = 32, value = "nctest.nc"
    //
    // 
    // node Import[1]: x = 90, y = 118, inputs = 6, label = Import
    //
main_Import_1_out_1 = 
    Import(
    main_FileSelector_1_out_1,
    main_Import_1_in_2,
    main_Import_1_in_3,
    main_Import_1_in_4,
    main_Import_1_in_5,
    main_Import_1_in_6
    ) [instance: 1, cache: 1];
    // 
    // node AutoColor[1]: x = 138, y = 191, inputs = 10, label = AutoColor
    //
main_AutoColor_1_out_1,
main_AutoColor_1_out_2 = 
    AutoColor(
    main_Import_1_out_1,
    main_AutoColor_1_in_2,
    main_AutoColor_1_in_3,
    main_AutoColor_1_in_4,
    main_AutoColor_1_in_5,
    main_AutoColor_1_in_6,
    main_AutoColor_1_in_7,
    main_AutoColor_1_in_8,
    main_AutoColor_1_in_9,
    main_AutoColor_1_in_10
    ) [instance: 1, cache: 1];
    // 
    // node AutoGlyph[1]: x = 201, y = 278, inputs = 7, label = AutoGlyph
    // input[2]: defaulting = 0, visible = 1, type = 32, value = "text"
    //
main_AutoGlyph_1_out_1 = 
    AutoGlyph(
    main_AutoColor_1_out_1,
    main_AutoGlyph_1_in_2,
    main_AutoGlyph_1_in_3,
    main_AutoGlyph_1_in_4,
    main_AutoGlyph_1_in_5,
    main_AutoGlyph_1_in_6,
    main_AutoGlyph_1_in_7
    ) [instance: 1, cache: 1];
    // 
    // node Tube[1]: x = 114, y = 280, inputs = 4, label = Tube
    //
main_Tube_1_out_1 = 
    Tube(
    main_AutoColor_1_out_1,
    main_Tube_1_in_2,
    main_Tube_1_in_3,
    main_Tube_1_in_4
    ) [instance: 1, cache: 1];
    // 
    // node Collect[1]: x = 177, y = 360, inputs = 2, label = Collect
    //
main_Collect_1_out_1 = 
    Collect(
    main_Tube_1_out_1,
    main_AutoGlyph_1_out_1
    ) [instance: 1, cache: 1];
    // 
    // node Image[1]: x = 175, y = 437, inputs = 49, label = Image
    // input[1]: defaulting = 0, visible = 0, type = 67108863, value = "Image_1"
    // input[4]: defaulting = 0, visible = 0, type = 1, value = 1
    // input[5]: defaulting = 0, visible = 0, type = 8, value = [0.0407761 
0.608095 3.3903]
    // input[6]: defaulting = 0, visible = 0, type = 8, value = [1.05857 
-0.449439 16.9762]
    // input[7]: defaulting = 1, visible = 0, type = 5, value = 7.32305
    // input[8]: defaulting = 0, visible = 0, type = 1, value = 640
    // input[9]: defaulting = 0, visible = 0, type = 5, value = 0.75
    // input[10]: defaulting = 0, visible = 0, type = 8, value = [0.0102178 
0.996991 0.076841]
    // input[11]: defaulting = 0, visible = 0, type = 5, value = 30.0001
    // input[12]: defaulting = 0, visible = 0, type = 1, value = 1
    // input[14]: defaulting = 0, visible = 0, type = 1, value = 1
    // input[15]: defaulting = 1, visible = 0, type = 32, value = "none"
    // input[16]: defaulting = 1, visible = 0, type = 32, value = "none"
    // input[17]: defaulting = 1, visible = 0, type = 1, value = 1
    // input[18]: defaulting = 1, visible = 0, type = 1, value = 1
    // input[19]: defaulting = 0, visible = 0, type = 1, value = 0
    // input[29]: defaulting = 1, visible = 0, type = 3, value = 0
    // input[41]: defaulting = 0, visible = 0, type = 32, value = "navigate"
    // depth: value = 24
    // window: position = (0.3708,0.4114), size = 0.3893x0.4971, screen = 0
    // internal caching: 1
    //
main_Image_1_out_1,
main_Image_1_out_2,
main_Image_1_out_3 = 
    Image(
    main_Image_1_in_1,
    main_Collect_1_out_1,
    main_Image_1_in_3,
    main_Image_1_in_4,
    main_Image_1_in_5,
    main_Image_1_in_6,
    main_Image_1_in_7,
    main_Image_1_in_8,
    main_Image_1_in_9,
    main_Image_1_in_10,
    main_Image_1_in_11,
    main_Image_1_in_12,
    main_Image_1_in_13,
    main_Image_1_in_14,
    main_Image_1_in_15,
    main_Image_1_in_16,
    main_Image_1_in_17,
    main_Image_1_in_18,
    main_Image_1_in_19,
    main_Image_1_in_20,
    main_Image_1_in_21,
    main_Image_1_in_22,
    main_Image_1_in_23,
    main_Image_1_in_24,
    main_Image_1_in_25,
    main_Image_1_in_26,
    main_Image_1_in_27,
    main_Image_1_in_28,
    main_Image_1_in_29,
    main_Image_1_in_30,
    main_Image_1_in_31,
    main_Image_1_in_32,
    main_Image_1_in_33,
    main_Image_1_in_34,
    main_Image_1_in_35,
    main_Image_1_in_36,
    main_Image_1_in_37,
    main_Image_1_in_38,
    main_Image_1_in_39,
    main_Image_1_in_40,
    main_Image_1_in_41,
    main_Image_1_in_42,
    main_Image_1_in_43,
    main_Image_1_in_44,
    main_Image_1_in_45,
    main_Image_1_in_46,
    main_Image_1_in_47,
    main_Image_1_in_48,
    main_Image_1_in_49
    ) [instance: 1, cache: 1];
// network: end of macro body
CacheScene(main_Image_1_in_1, main_Image_1_out_1, main_Image_1_out_2);
}
main_FileSelector_1_out_1 = "/home/thk/src/test/nctest.nc";
main_Import_1_in_2 = NULL;
main_Import_1_in_3 = NULL;
main_Import_1_in_4 = NULL;
main_Import_1_in_5 = NULL;
main_Import_1_in_6 = NULL;
main_Import_1_out_1 = NULL;
main_AutoColor_1_in_2 = NULL;
main_AutoColor_1_in_3 = NULL;
main_AutoColor_1_in_4 = NULL;
main_AutoColor_1_in_5 = NULL;
main_AutoColor_1_in_6 = NULL;
main_AutoColor_1_in_7 = NULL;
main_AutoColor_1_in_8 = NULL;
main_AutoColor_1_in_9 = NULL;
main_AutoColor_1_in_10 = NULL;
main_AutoColor_1_out_1 = NULL;
main_AutoGlyph_1_in_2 = "text";
main_AutoGlyph_1_in_3 = NULL;
main_AutoGlyph_1_in_4 = NULL;
main_AutoGlyph_1_in_5 = NULL;
main_AutoGlyph_1_in_6 = NULL;
main_AutoGlyph_1_in_7 = NULL;
main_AutoGlyph_1_out_1 = NULL;
main_Tube_1_in_2 = NULL;
main_Tube_1_in_3 = NULL;
main_Tube_1_in_4 = NULL;
main_Tube_1_out_1 = NULL;
main_Collect_1_out_1 = NULL;
macro Image(
        id,
        object,
        where,
        useVector,
        to,
        from,
        width,
        resolution,
        aspect,
        up,
        viewAngle,
        perspective,
        options,
        buttonState = 1,
        buttonUpApprox = "none",
        buttonDownApprox = "none",
        buttonUpDensity = 1,
        buttonDownDensity = 1,
        renderMode = 0,
        defaultCamera,
        reset,
        backgroundColor,
        throttle,
        RECenable = 0,
        RECfile,
        RECformat,
        RECresolution,
        RECaspect,
        AAenable = 0,
        AAlabels,
        AAticks,
        AAcorners,
        AAframe,
        AAadjust,
        AAcursor,
        AAgrid,
        AAcolors,
        AAannotation,
        AAlabelscale,
        AAfont,
        interactionMode,
        title,
        AAxTickLocs,
        AAyTickLocs,
        AAzTickLocs,
        AAxTickLabels,
        AAyTickLabels,
        AAzTickLabels,
        webOptions) -> (
        object,
        camera,
        where)
{
    ImageMessage(
        id,
        backgroundColor,
        throttle,
        RECenable,
        RECfile,
        RECformat,
        RECresolution,
        RECaspect,
        AAenable,
        AAlabels,
        AAticks,
        AAcorners,
        AAframe,
        AAadjust,
        AAcursor,
        AAgrid,
        AAcolors,
        AAannotation,
        AAlabelscale,
        AAfont,
        AAxTickLocs,
        AAyTickLocs,
        AAzTickLocs,
        AAxTickLabels,
        AAyTickLabels,
        AAzTickLabels,
        interactionMode,
        title,
        renderMode,
        buttonUpApprox,
        buttonDownApprox,
        buttonUpDensity,
        buttonDownDensity) [instance: 1, cache: 1];
    autoCamera =
        AutoCamera(
            object,
            "front",
            object,
            resolution,
            aspect,
            [0,1,0],
            perspective,
            viewAngle,
            backgroundColor) [instance: 1, cache: 1];
    realCamera =
        Camera(
            to,
            from,
            width,
            resolution,
            aspect,
            up,
            perspective,
            viewAngle,
            backgroundColor) [instance: 1, cache: 1];
    coloredDefaultCamera = 
         UpdateCamera(defaultCamera,
            background=backgroundColor) [instance: 1, cache: 1];
    nullDefaultCamera =
        Inquire(defaultCamera,
            "is null + 1") [instance: 1, cache: 1];
    resetCamera =
        Switch(
            nullDefaultCamera,
            coloredDefaultCamera,
            autoCamera) [instance: 1, cache: 1];
    resetNull = 
        Inquire(
            reset,
            "is null + 1") [instance: 2, cache: 1];
    reset =
        Switch(
            resetNull,
            reset,
            0) [instance: 2, cache: 1];
    whichCamera =
        Compute(
            "($0 != 0 || $1 == 0) ? 1 : 2",
            reset,
            useVector) [instance: 1, cache: 1];
    camera = Switch(
            whichCamera,
            resetCamera,
            realCamera) [instance: 3, cache: 1];
    AAobject =
        AutoAxes(
            object,
            camera,
            AAlabels,
            AAticks,
            AAcorners,
            AAframe,
            AAadjust,
            AAcursor,
            AAgrid,
            AAcolors,
            AAannotation,
            AAlabelscale,
            AAfont,
            AAxTickLocs,
            AAyTickLocs,
            AAzTickLocs,
            AAxTickLabels,
            AAyTickLabels,
            AAzTickLabels) [instance: 1, cache: 1];
    switchAAenable = Compute("$0+1",
             AAenable) [instance: 2, cache: 1];
    object = Switch(
             switchAAenable,
             object,
             AAobject) [instance:4, cache: 1];
    SWapproximation_options =
        Switch(
            buttonState,
            buttonUpApprox,
            buttonDownApprox) [instance: 5, cache: 1];
    SWdensity_options =
        Switch(
            buttonState,
            buttonUpDensity,
            buttonDownDensity) [instance: 6, cache: 1];
    HWapproximation_options =
        Format(
            "%s,%s",
            buttonDownApprox,
            buttonUpApprox) [instance: 1, cache: 1];
    HWdensity_options =
        Format(
            "%d,%d",
            buttonDownDensity,
            buttonUpDensity) [instance: 2, cache: 1];
    switchRenderMode = Compute(
             "$0+1",
             renderMode) [instance: 3, cache: 1];
    approximation_options = Switch(
             switchRenderMode,
            SWapproximation_options,
             HWapproximation_options) [instance: 7, cache: 1];
    density_options = Switch(
             switchRenderMode,
            SWdensity_options,
            HWdensity_options) [instance: 8, cache: 1];
    renderModeString = Switch(
            switchRenderMode,
            "software",
            "hardware")[instance: 9, cache: 1];
    object_tag = Inquire(
            object,
            "object tag")[instance: 3, cache: 1];
    annoted_object =
        Options(
            object,
            "send boxes",
            0,
            "cache",
            1,
            "object tag",
            object_tag,
            "ddcamera",
            whichCamera,
            "rendering approximation",
            approximation_options,
            "render every",
            density_options,
            "button state",
            buttonState,
            "rendering mode",
            renderModeString) [instance: 1, cache: 1];
    RECresNull =
        Inquire(
            RECresolution,
            "is null + 1") [instance: 4, cache: 1];
    ImageResolution =
        Inquire(
            camera,
            "camera resolution") [instance: 5, cache: 1];
    RECresolution =
        Switch(
            RECresNull,
            RECresolution,
            ImageResolution) [instance: 10, cache: 1];
    RECaspectNull =
        Inquire(
            RECaspect,
            "is null + 1") [instance: 6, cache: 1];
    ImageAspect =
        Inquire(
            camera,
            "camera aspect") [instance: 7, cache: 1];
    RECaspect =
        Switch(
            RECaspectNull,
            RECaspect,
            ImageAspect) [instance: 11, cache: 1];
    switchRECenable = Compute(
          "$0 == 0 ? 1 : (($2 == $3) && ($4 == $5)) ? ($1 == 1 ? 2 : 3) : 4",
            RECenable,
            switchRenderMode,
            RECresolution,
            ImageResolution,
            RECaspect,
             ImageAspect) [instance: 4, cache: 1];
    NoRECobject, RECNoRerenderObject, RECNoRerHW, RECRerenderObject = 
Route(switchRECenable, annoted_object);
    Display(
        NoRECobject,
        camera,
        where,
        throttle) [instance: 1, cache: 1];
    image =
        Render(
            RECNoRerenderObject,
            camera) [instance: 1, cache: 1];
    Display(
        image,
        NULL,
        where,
        throttle) [instance: 2, cache: 1];
    WriteImage(
        image,
        RECfile,
        RECformat) [instance: 1, cache: 1];
    rec_where = Display(
        RECNoRerHW,
        camera,
        where,
        throttle) [instance: 1, cache: 0];
    rec_image = ReadImageWindow(
        rec_where) [instance: 1, cache: 1];
    WriteImage(
        rec_image,
        RECfile,
        RECformat) [instance: 1, cache: 1];
    RECupdateCamera =
        UpdateCamera(
            camera,
            resolution=RECresolution,
            aspect=RECaspect) [instance: 2, cache: 1];
    Display(
        RECRerenderObject,
        camera,
        where,
        throttle) [instance: 1, cache: 1];
    RECRerenderObject =
        ScaleScreen(
            RECRerenderObject,
            NULL,
            RECresolution,
            camera) [instance: 1, cache: 1];
    image =
        Render(
            RECRerenderObject,
            RECupdateCamera) [instance: 2, cache: 1];
    WriteImage(
        image,
        RECfile,
        RECformat) [instance: 2, cache: 1];
}
main_Image_1_in_1 = "Image_1";
main_Image_1_in_3 = "X24,,";
main_Image_1_in_4 = 1;
main_Image_1_in_5 = [0.0407761 0.608095 3.3903];
main_Image_1_in_6 = [1.05857 -0.449439 16.9762];
main_Image_1_in_7 = NULL;
main_Image_1_in_8 = 640;
main_Image_1_in_9 = 0.75;
main_Image_1_in_10 = [0.0102178 0.996991 0.076841];
main_Image_1_in_11 = 30.0001;
main_Image_1_in_12 = 1;
main_Image_1_in_13 = NULL;
main_Image_1_in_14 = 1;
main_Image_1_in_15 = NULL;
main_Image_1_in_16 = NULL;
main_Image_1_in_17 = NULL;
main_Image_1_in_18 = NULL;
main_Image_1_in_19 = 0;
main_Image_1_in_20 = NULL;
main_Image_1_in_21 = NULL;
main_Image_1_in_22 = NULL;
main_Image_1_in_23 = NULL;
main_Image_1_in_25 = NULL;
main_Image_1_in_26 = NULL;
main_Image_1_in_27 = NULL;
main_Image_1_in_28 = NULL;
main_Image_1_in_29 = NULL;
main_Image_1_in_30 = NULL;
main_Image_1_in_31 = NULL;
main_Image_1_in_32 = NULL;
main_Image_1_in_33 = NULL;
main_Image_1_in_34 = NULL;
main_Image_1_in_35 = NULL;
main_Image_1_in_36 = NULL;
main_Image_1_in_37 = NULL;
main_Image_1_in_38 = NULL;
main_Image_1_in_39 = NULL;
main_Image_1_in_40 = NULL;
main_Image_1_in_41 = "navigate";
main_Image_1_in_42 = NULL;
main_Image_1_in_43 = NULL;
main_Image_1_in_44 = NULL;
main_Image_1_in_45 = NULL;
main_Image_1_in_46 = NULL;
main_Image_1_in_47 = NULL;
main_Image_1_in_48 = NULL;
main_Image_1_in_49 = NULL;
Executive("product version 4 4 4");
$sync
main();
--- a/src/exec/dxmods/import_ncdf.c
+++ b/src/exec/dxmods/import_ncdf.c
@@ -1406,9 +1406,10 @@
 	
 	vp1 = vp2;
 	vp2 = vp2->next;
-	printf("%08x: class = %d, varid = %d, name = %s\n",
-	       (unsigned int) vp1, vp1->class, vp1->varid, vp1->name);
-	printf("          next = %08x, child = %08x\n", (unsigned int) vp1->next, (unsigned int) vp1->child);
+	printf("%20p: class = %d, varid = %d, name = %s\n",
+	       (void *)vp1, vp1->class, vp1->varid, vp1->name);
+	printf("          next = %20p, child = %20p\n",
+	       (void *)vp1->next, (void *)vp1->child);
 
     }
 }    
@@ -2970,29 +2971,23 @@
 	if(series)
 	    dstart[0] = i;
 
-	/* if data is long, create a temp long buffer to copy 
-	   netCDF data to then move to the SVS array buffer */
-	if (ap->arraytype == TYPE_INT) {
-	   data_int = (int *)DXGetArrayData (adata);
-	   if(!data_int)
-	       goto error;
-	   for (k=0,n=ap->data_ndims - ap->arrayrank; k<ap->arrayrank; k++,n++) 
-	      ndims *= ap->datacounts[n];
-	   tempbuf = (long *)DXAllocate(ndims * size * sizeof(long));
-	   if(ncvarget(ap->cdfhandle,          /* netcdf file handle */
-		    ap->varid,              /* variable id */
-		    dstart,                 /* array-origin for each dim */
-		    long_datacounts,         /* array-counts along each dim */
-		    tempbuf) < 0) {         /* memory pointer */
-	       DXSetError(ERROR_INTERNAL, "netCDF library error");
-	       goto error;
-	   }
-	   for (k=0; k<size*ndims; k++) 
-	      data_int[k] = (int)tempbuf[k];
- 	   DXFree((Pointer)tempbuf);
-	}
+        /*TODO Use these modern converting nc functions more. */
+        if (ap->arraytype == TYPE_INT) {
+            data_int = DXGetArrayData (adata);
+            if(!data_int)
+                goto error;
+            if (nc_get_vara_int(
+                    ap->cdfhandle,          /* netcdf file handle */
+                    ap->varid,              /* variable id */
+                    dstart,                 /* array-origin for each dim */
+                    long_datacounts,       /* array-counts along each dim */
+                    data_int)               /* memory pointer */
+                != NC_NOERR) {
+               DXSetError(ERROR_INTERNAL, "netCDF library error");
+               goto error;
+            }
+        }
 	else {
-
 	dataval = DXGetArrayData (adata);
 	if(!dataval)
 	    goto error;
@@ -3143,26 +3138,21 @@
 	if(series)
 	    dstart[0] = i;
 
-	/* if data is long, create a temp long buffer to copy 
-	   netCDF data to then move to the SVS array buffer */
+	/*TODO Share code with build_data above. */
 	if (ap->arraytype == TYPE_INT) {
-	   data_int = DXGetArrayData (adata);
-	   if(!data_int)
-	       goto error;
-	   for (k=0, n=ap->array_ndims - ap->arrayrank; k<ap->arrayrank;k++,n++)
-	      ndims *=ap->arraycounts[n];
-	   tempbuf = (long *)DXAllocate(size * ndims * sizeof(long));
-	   if(ncvarget(ap->cdfhandle,          /* netcdf file handle */
-		    ap->varid,              /* variable id */
-		    dstart,                 /* array-origin for each dim */
-		    long_arraycounts,         /* array-counts along each dim */
-		    tempbuf) < 0) {         /* memory pointer */
-	       DXSetError(ERROR_INTERNAL, "netCDF library error");
-	       goto error;
-	   }
-	   for (k=0; k<size*ndims; k++) 
-	      data_int[k] = (int)tempbuf[k];
- 	   DXFree((Pointer)tempbuf);
+	    data_int = DXGetArrayData (adata);
+	    if(!data_int)
+	        goto error;
+	    if (nc_get_vara_int(
+	            ap->cdfhandle,          /* netcdf file handle */
+	            ap->varid,              /* variable id */
+	            dstart,                 /* array-origin for each dim */
+	            long_arraycounts,       /* array-counts along each dim */
+	            data_int)               /* memory pointer */
+	        != NC_NOERR) {
+	        DXSetError(ERROR_INTERNAL, "netCDF library error");
+	        goto error;
+	    }
 	}
 	else {
 	dataval = DXGetArrayData (adata);

Reply via email to