Podstawowe typy danych: gsl_block, gsl_vector, gsl_matrix, oraz odmiany dla typów liczbowych innych niż double. Dla konsystencji cała pamięć jest alokowana poprzez strukturę gsl_block. Wektory i macierze są tworzone przez slicing danego bloku. Domyślnie wektory i macierze mają włączone sprawdzanie poprawności indeksu.
// Definicje funkcji do zarządzania blokami są w tym nagłówku. #include <gsl/gsl_block.h> typedef struct { size_t size; // rozmiar bloku double *data; // wskaźnik do obszaru pamięci } gsl_block;
// Definicje funkcji do zarządzania wektorami są w tym nagłówku. #include <gsl/gsl_vector.h> typedef struct { size_t size; // liczba elementów wektora; zakres [0, size-1] size_t stride; // rozmiar jednego elementu (fizycznie) double *data; // wskaźnik do obszaru pamięci (do pierwszego elem) gsl_block *block; // wskaźnik do bloku posiadanego przez wektor int owner; // ownership flag (1-posiada, 0-nie posiada) } gsl_vector; // Położenie w pamięci i-tego elementu to v->data[i*v->stride]. // Dzięki stride można chyba tworzyć wektory przechowujące różne // inne obiekty. Można też zrobić widok np. tylko na parzyste elementy.
// Definicje funkcji do zarządzania macierzami są w tym nagłówku. #include <gsl/gsl_matrix.h> typedef struct { size_t size1; // zakres wierszy [0, size1-1] size_t size2; // zakres kolumn [0, size2-1] size_t tda; // fizyczny rozmiar wiersza double *data; // wskaźnik do pierwszego elementu macierzy gsl_block *block; int owner; } gsl_matrix;