[GRASS-dev] [GRASS GIS] #771: use longer ints for counting raster cells

GRASS GIS trac at osgeo.org
Thu Oct 1 10:03:06 EDT 2009


#771: use longer ints for counting raster cells
-------------------------+--------------------------------------------------
 Reporter:  hamish       |       Owner:  grass-dev at lists.osgeo.org
     Type:  task         |      Status:  new                      
 Priority:  normal       |   Milestone:  6.4.0                    
Component:  Raster       |     Version:  svn-develbranch6         
 Keywords:  overflow     |    Platform:  All                      
      Cpu:  Unspecified  |  
-------------------------+--------------------------------------------------
 Hi,

 when region sizes exceed a bit more than 45000x45000 plain int no longer
 has the bitspace to keep track of the number of cells and overflows.
 'unsigned int' only buys us a little time until region size exceeds
 65536x65536.

 in these cases 'unsigned long long' could be used to make the size bigger.
 not all compilers know about long long though so ./configure does a check
 for it and sets a macro.

  * r.stats and r.univar are a priority here.

 r.info and g.region seem to have working implimentations,

 example code from 6.5's g.region:

 {{{
 #ifdef HAVE_LONG_LONG_INT
             fprintf(stdout, "%-*s %lld\n", width, "cells:",
                     (long long)window->rows * window->cols);
             if (print_flag & PRINT_3D)
                 fprintf(stdout, "%-*s %lld\n", width, "3dcells:",
                         (long long)window->rows3 * window->cols3 *
                         window->depths);
 #else
             fprintf(stdout, "%-*s %ld\n", width, "cells:",
                     (long)window->rows * window->cols);
             if (print_flag & PRINT_3D)
                 fprintf(stdout, "%-*s %ld\n", width, "3dcells:",
                         (long)window->rows3 * window->cols3 *
 window->depths);
 #endif
 }}}


 r.info:
 {{{
 #ifdef HAVE_LONG_LONG_INT
             compose_line(out, "  Total Cells:  %llu",
                          (unsigned long long)cellhd.rows * cellhd.cols);
 #else
             compose_line(out,
                          "  Total Cells:  %lu (accuracy - see r.info
 manual)",
                          (unsigned long)cellhd.rows * cellhd.cols);
 #endif
 }}}

 r.info man page:
 {{{
 Some standards (ISO-C90) and compilers do not support the 'long long' type
 as a 64-bit type. In the case that GRASS was built with such a compiler,
 an accuracy message may be displayed in the output of <em>r.info</em>
 after Total Cells:
 }}}


 we should standardize on something. any reason not to make it unsigned?


 comments?

 Hamish

-- 
Ticket URL: <https://trac.osgeo.org/grass/ticket/771>
GRASS GIS <http://grass.osgeo.org>


More information about the grass-dev mailing list