Предаване на 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