Передача массивов GSL другим функциям

Я новичок в использовании GSL, и мне было интересно, как я могу вернуть массив GSL из одной функции в другую. Это не похоже на обычный массив ... Я пытался понять это некоторое время, и у меня нет сильного фона C, и это сводит меня с ума. Вот две псевдофункции, которые показывают, что я пытаюсь сделать.

Это основная функция

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_matrix.h>

void load(gsl_matrix * a);    

int main()
{
int row, col,i,j;   
row = 6; col = 25;
gsl_matrix *a = gsl_matrix_alloc(6,25);

load(a);

for (i = 0; i < 6; i++) 
  for (j = 0; j < 25; j++)
     printf ("a[%d,%d] = %g\n", i, j, 
         gsl_matrix_get (a, i, j));


return 0;
}   

И это функция загрузки, которая загружает матрицу из файла. Кажется, эта часть работает... Я просто не могу передать результат этой функции основной функции.

#include <stdio.h>
#include <stdlib.h>

#include <gsl/gsl_matrix.h>

void load(gsl_matrix * a)
{
int row_size, col_size;
row_size = 6; col_size = 25;    
int status_obs;
gsl_matrix * obs_map = gsl_matrix_alloc(row_size,col_size);

FILE *f = fopen("obs_map.dat","r");
status_obs = gsl_matrix_fscanf(f,obs_map);
fclose(f);

a = obs_map;    

if(status_obs == 0) 
    printf("Obstacle map loaded: %dx%d\n",row_size,col_size);

gsl_matrix_free (obs_map);

}

Прошу прощения, если это глупый вопрос, но мне просто нужна небольшая помощь в правильном направлении. Любая помощь от любого, кто использует GSL, будет оценена по достоинству. К вашему сведению, вот примеры матриц gsl


person jti107    schedule 02.11.2014    source источник


Ответы (1)


Вы освобождаете свою матрицу перед возвратом из load(). Возможно, самый простой способ сделать то, что вы ищете, — вернуть gsl_matrix* из load():

gsl_matrix* load() {
int row_size, col_size;
row_size = 6; col_size = 25;    
int status_obs;
gsl_matrix * obs_map = gsl_matrix_alloc(row_size,col_size);

FILE *f = fopen("obs_map.dat","r");
status_obs = gsl_matrix_fscanf(f,obs_map);
fclose(f);

a = obs_map;    

if(status_obs == 0) 
    printf("Obstacle map loaded: %dx%d\n",row_size,col_size);

return obs_map;
//Don't free it!
//gsl_matrix_free (obs_map);

}

int main() {
int row, col,i,j;   
row = 6; col = 25;
gsl_matrix *a = load();

//load(a);

for (i = 0; i < 6; i++) 
  for (j = 0; j < 25; j++)
     printf ("a[%d,%d] = %g\n", i, j, 
         gsl_matrix_get (a, i, j));

//Now you can free it
gsl_matrix_free(a);

return 0;
} 

Обратите внимание, что я не компилировал это, так как я не пытался установить эту библиотеку GSL, поэтому, если она работает для вас, было бы здорово знать!

person Joey    schedule 08.11.2014
comment
да это по сути то, что я сделал. Спасибо за вашу помощь! не привык к выделению памяти, но я понял, что делаю, когда просмотрел указатели. - person jti107; 11.11.2014