2014-11-02 4 views
0

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

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

#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, будет оценена по достоинству. Просто FYI, вот gsl matrix examples

ответ

0

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

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 установлен, так если это сработает для вас, было бы прекрасно знать!

+0

yep это по существу то, что я сделал. Спасибо за вашу помощь! не используется для выделения памяти, но я понял, что я делал, как только я просмотрел указатели. – jti107

Смежные вопросы