c - 如何定义全局 gsl_vector
问题描述
有人可以帮我解决这个问题吗?我有这个简单的代码:
#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
谢谢你的帮助
解决方案
那是因为你声明了你的变量Cell
两次。请gsl_vector * Cell = gsl_vector_alloc(LENGTH_Cell);
用just替换Cell = gsl_vector_alloc(LENGTH_Cell);
,不要忘记gsl_vector_free (Cell);
在所有计算后正确释放内存。现代编译器很聪明,然而,它们并不总是能捕捉到这么小的东西(我曾经花了大约一周的时间来解决一个类似的问题)。
推荐阅读
- python - Kivy,ScreenManager:如何访问另一个屏幕中定义的变量?
- javascript - ES6 可以在函数范式中原生地对 Set 上的排列进行编码吗?
- api - 无法通过 JavaScript 从 Office365 生成 OAuth 2.0 访问令牌
- java - 语法错误(Sqlite 代码 1 SQLITE_ERROR)
- c - 不使用 [] 索引运算符的数组
- python - Flask 在页面加载时将电子邮件列表显示为 [email protected]
- c++ - 为数组分配内存
- vue.js - 如何解决通过 CDN 导入 TailwindCSS 工作正常但将其安装为 NPM 依赖项的问题不仅在 codeandbox.io 上?
- javascript - 在鼠标悬停事件期间为动态生成的表格添加弹出窗口
- javascript - 正则表达式 - 不允许大写