GNU Scientific Library – Reference Manual: Accessing vector elements

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

#### 8.3.2 Accessing vector elements

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, size_t i)

  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.

Function: void gsl_vector_set (gsl_vector * v, 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 to n-1 then the error handler is invoked. An inline version of this function is used when `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 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.

#### Footnotes

### (8)

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]