Как определить глобальный gsl_vector - PullRequest
0 голосов
/ 29 декабря 2018

Может ли кто-нибудь помочь мне с этой проблемой?У меня есть этот простой код:

#include "prova.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gsl/gsl_pow_int.h>
#include <gsl/gsl_sf_gamma.h>
#include <gsl/gsl_vector.h>

/* Global structures */
#define LENGTH_Cell 1001
gsl_vector * Cell; /* Global definition */

/* Function */
double sum(int l){
    double sum = 0;

    for(int j=0; j<l; j++)
    {
        sum = sum + gsl_vector_get(Cell, j);
    }

    return sum;
}

int main() {

    gsl_vector * Cell = gsl_vector_alloc(LENGTH_Cell);

    FILE *Cl_in = fopen("C_ells_1000.dat","r");
    gsl_vector_fscanf(Cl_in, Cell);
    fclose(Cl_in);

    for (int i = 0; i < 5; i++)
    {
        printf("sum: %g \n", sum(i));
    }

    return 0;
}

Программа компилируется, однако, когда я запускаю программу, выдает следующий вывод:

sum: 0 
Segmentation fault: 11

Я думаю, проблема в том, что я не определилправильным образом глобальная ячейка gsl_vector.У вас есть предложения?

Еще немного информации.Вот содержимое "C_ells_1000.dat"

0.
0.
1.48889036806174737e-10
6.99975015453780434e-11
3.9538692950311228e-11
2.51360836766398574e-11
1.73497511436282967e-11
1.27165467072195804e-11
9.75002071723029932e-12
7.7432773162174558e-12
6.3213378366797444e-12
5.27764322481988366e-12

. В то время как файл "prova.h" выглядит следующим образом:

#ifndef prova_h
#define prova_h

#include <stdio.h>

#endif /* prova_h */

Для компиляции программы я использую команду

gcc -o prova prova_1.c -I /usr/local/include -lm -lgsl -lgslcblas

Спасибо за помощь

1 Ответ

0 голосов
/ 30 декабря 2018

Это потому, что вы объявляете свою переменную Cell дважды.Пожалуйста, замените gsl_vector * Cell = gsl_vector_alloc(LENGTH_Cell); просто Cell = gsl_vector_alloc(LENGTH_Cell); Кроме того, не забудьте правильно освободить память с gsl_vector_free (Cell); после всех ваших вычислений.Современные компиляторы умны, однако они не всегда улавливают такие мелочи (однажды я потратил около недели на решение аналогичной проблемы).

...