Hugh Parsonage
2021-Dec-28 13:36 UTC
[Rd] "getOption(max.print) omitted %d entries" may be negative
In src/main/printvector.c in the definition of printVector and printNamedVector (and elsewhere): Rprintf(" [ reached getOption(\"max.print\") -- omitted %d entries ]\n", n - n_pr); Though n - n_pr is of type R_xlen_t so may not be representable as int. In practice negative values may be observed for long vectors. Rprintf(" [ reached getOption(\"max.print\") -- omitted %lld entries ]\n", n - n_pr);
Martin Maechler
2022-Jan-03 17:15 UTC
[Rd] "getOption(max.print) omitted %d entries" may be negative
>>>>> Hugh Parsonage >>>>> on Wed, 29 Dec 2021 00:36:51 +1100 writes:> In src/main/printvector.c in the definition of printVector and > printNamedVector (and elsewhere): > Rprintf(" [ reached getOption(\"max.print\") -- omitted %d entries ]\n", > n - n_pr); > Though n - n_pr is of type R_xlen_t so may not be representable as > int. In practice negative values may be observed for long vectors. > Rprintf(" [ reached getOption(\"max.print\") -- omitted %lld entries ]\n", > n - n_pr); Thank you Hugh, for finding and reporting this, including a proposed remedy. At some point in time, I think the %lld format specifier was not portable enough to all versions of C compiler / libraries that were considered valid for compiling R. See e.g., https://stackoverflow.com/questions/462345/format-specifier-for-long-long which says that "it" does not work on Windows. Maybe this has changed now that we require C99 and also that since R version 4.0.0 (or 4.0.1) we also use a somewhat more recent version of gcc also on Windows? ... ah, searching the R sources reveals uses of %lld *plus* #ifdef Win32 #include <trioremap.h> /* for %lld */ #endif so it seems we can and should probably change this ... [Please, C compiler / library standard experts, chime in !] Martin Maechler ETH Zurich and R core team