Next: Initializing vector elements, Previous: Vector allocation, Up: Vectors [Index]

Unlike FORTRAN compilers, C compilers do not usually provide
support for range checking of vectors and matrices.^{8} 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.

- Function:
*double***gsl_vector_get***(const gsl_vector **`v`, const size_t`i`) This function returns the

`i`-th element of a vector`v`. If`i`lies outside the allowed range of 0 tothen the error handler is invoked and 0 is returned. An inline version of this function is used when`n`-1`HAVE_INLINE`

is defined.

- Function:
*void***gsl_vector_set***(gsl_vector **`v`, const size_t`i`, double`x`) 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 tothen the error handler is invoked. An inline version of this function is used when`n`-1`HAVE_INLINE`

is defined.

- Function:
*double ****gsl_vector_ptr***(gsl_vector **`v`, size_t`i`) - Function:
*const double ****gsl_vector_const_ptr***(const gsl_vector **`v`, size_t`i`) These functions return a pointer to the

`i`-th element of a vector`v`. If`i`lies outside the allowed range of 0 tothen the error handler is invoked and a null pointer is returned. Inline versions of these functions are used when`n`-1`HAVE_INLINE`

is defined.

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.

Next: Initializing vector elements, Previous: Vector allocation, Up: Vectors [Index]