Unlike fortran compilers, C compilers do not usually provide
support for range checking of vectors and matrices.1 The functions gsl_vector_get
and
gsl_vector_set
can perform portable range checking for you and
report an error if you attempt to access elements outside the allowed
range.
The functions for accessing the elements of a vector or matrix are
defined in gsl_vector.h and declared extern inline
to
eliminate function-call overhead. You must compile your program with
the preprocessor macro HAVE_INLINE
defined to use these
functions.
If necessary you can turn off range checking completely without
modifying any source files by recompiling your program with the
preprocessor definition GSL_RANGE_CHECK_OFF
. Provided your
compiler supports inline functions the effect of turning off range
checking is to replace calls to gsl_vector_get(v,i)
by
v->data[i*v->stride]
and calls to gsl_vector_set(v,i,x)
by
v->data[i*v->stride]=x
. Thus there should be no performance
penalty for using the range checking functions when range checking is
turned off.
If you use a C99 compiler which requires inline functions in header
files to be declared inline
instead of extern inline
,
define the macro GSL_C99_INLINE
(see Inline functions).
With GCC this is selected automatically when compiling in C99 mode
(-std=c99
).
If inline functions are not used, calls to the functions
gsl_vector_get
and gsl_vector_set
will link to the
compiled versions of these functions in the library itself. The range
checking in these functions is controlled by the global integer
variable gsl_check_range
. It is enabled by default—to
disable it, set gsl_check_range
to zero. Due to function-call
overhead, there is less benefit in disabling range checking here than
for inline functions.
This function returns the i-th element of a vector v. If i lies outside the allowed range of 0 to n-1 then the error handler is invoked and 0 is returned. An inline version of this function is used when
HAVE_INLINE
is defined.
This function sets the value of the i-th element of a vector v to x. If i lies outside the allowed range of 0 to n-1 then the error handler is invoked. An inline version of this function is used when
HAVE_INLINE
is defined.
These functions return a pointer to the i-th element of a vector v. If i lies outside the allowed range of 0 to n-1 then the error handler is invoked and a null pointer is returned. Inline versions of these functions are used when
HAVE_INLINE
is defined.
[1] Range
checking is available in the GNU C Compiler bounds-checking extension,
but it is not part of the default installation of GCC. Memory accesses
can also be checked with Valgrind or the gcc -fmudflap
memory protection option.