因为这是我在这里的第一篇文章,所以我希望我不会犯太多错误......
我面临以下问题。 当我运行这段代码时(我很抱歉)我在LAPACKE调用期间在“solve”函数中遇到了段错误。
问题是当我不尝试在main函数中打开文件“dataf”时,此代码运行时没有任何(可见)问题。
我想我用我的类型Bob和指针搞砸了,但我想有你的观点。
祝你好运
Thibaut
#include <stdio.h>
#include <stdlib.h>
#include <lapacke/lapacke.h>
typedef struct{
double *data;
double *tmp;
double **A;
int size;
} Bob;
void allocate(Bob *b);
void init_data(Bob *b);
void init_A(Bob* b);
void allocate(Bob *b){
b->data = malloc(b->size*sizeof(double));
b->tmp = malloc(b->size*sizeof(double));
b->A = malloc(4*sizeof(double*));
b->A[0] = malloc(b->size*sizeof(double));
b->A[1] = malloc(b->size*sizeof(double));
b->A[2] = malloc(b->size*sizeof(double));
b->A[3] = malloc(b->size*sizeof(double));
}
void init_data(Bob *b){
int i;
for (i=0;i<b->size;i++){
b->data[i] = 0.0;
}
}
void init_A(Bob* b){
int i;
double *diag = b->A[0];
double *down = b->A[1];
double *up = b->A[2];
double *up2 = b->A[3];
for (i=0;i<b->size;i++){
diag[i] = 2.0;
down[i] = -1.0;
up[i] = -1.0;
up2[i] = 0.0;
}
}
void solve(Bob *b){
lapack_int info;
lapack_int *ipiv = malloc(b->size*(sizeof(lapack_int)));
lapack_int lsize = b->size;
lapack_int lone = 1;
int i;
for (i=0;i<b->size;i++){
b->tmp[i] = b->data[i];
}
info = LAPACKE_dgttrs(LAPACK_COL_MAJOR,'N',
lsize,lone,\
b->A[1],b->A[0],b->A[2],b->A[3],\
ipiv, b->tmp, lsize);
printf("%d\n",info);
free(ipiv);
}
int main(void){
Bob b;
b.size = 10000;
allocate(&b);
init_A(&b);
init_data(&b);
// No Segfault if dataf is not opened
FILE *dataf;
dataf = fopen("data","w");
fclose(dataf);
solve(&b);
free(b.data);
free(b.tmp);
free(b.A[0]);
free(b.A[1]);
free(b.A[2]);
free(b.A[3]);
free(b.A);
return 0;
}
使用Makefile:
P=mini
CC=gcc
CFLAGS=-g -Wall
LFLAGS=-lm -llapacke -llapack -lblas
FILES=min.c
all: $(FILES)
$(CC) $(CFLAGS) $(LFLAGS) $(FILES) -o $(P)
编辑: 我在原帖中犯了一个错误。 A [0] - >的分配A [3]是双打而不是指向双打的指针。
解决后改变fclose的位置似乎解决了这个问题。但在我的真实代码中,它并没有改变任何东西......
EDIT2: 这个问题似乎与LAPACK功能有关。我改变了这个功能(更适合我的问题的东西)而且内存问题现在已经消失了。
这不是我原来问题的解决方案,但我以某种方式解决了它。感谢所有非常有用的回复和评论:)
EDIT3: 我找到了问题的根源。它与LAPACK有关。 在函数求解中,我为ipiv分配空间。但是LAPACKE_dgttrs将init_A中函数LAPACKE_dgttrf给出的ipiv作为输入。
所以我在我的struct中为ipiv分配了一个指针,并在程序的其余部分使用它。
答案 0 :(得分:0)
错误是由fclose函数引起的,在fclose之前检查dataf是否为NULL或noy
FILE *dataf;
dataf = fopen("data","w"); //If file is not opened for writing, the dataf is NULL
fclose(dataf);
solve(&b);
更改为
FILE *dataf;
dataf = fopen("data","w");
if(dataf != NULL)
fclose(dataf);
solve(&b);
答案 1 :(得分:0)
在你对#34; Bob&#34;的定义中,成员A被定义为指向指针的指针,并且根据你的代码,我假设你正在建立一个二维的双打阵列。如果是这种情况,分配b-> A [i]的四个语句应该分配双精度数,而不是指向双精度数。
void allocate(Bob *b){
b->data = malloc(b->size*sizeof(double));
b->tmp = malloc(b->size*sizeof(double));
b->A = malloc(4*sizeof(double*));
b->A[0] = malloc(b->size*sizeof(double));
b->A[1] = malloc(b->size*sizeof(double));
b->A[2] = malloc(b->size*sizeof(double));
b->A[3] = malloc(b->size*sizeof(double));
}