编译期间我有以下警告:
solver.c:24: warning: passing argument 2 of ‘mtrx_multiple’ from incompatible pointer type
mat.h:5: note: expected ‘double *’ but argument is of type ‘double **’
solver.c:30: warning: assignment makes pointer from integer without a cast
solver.c:39: warning: assignment makes pointer from integer without a cast
/tmp/ccmU9zRf.o: In function `vec_norm':
math.c:(.text+0x331): undefined reference to `sqrt'
collect2: ld returned 1 exit status
这些行是:
solver.c
double *cg_solve( sparse_mat_t A, double *b, double *x ) {
double *a;
double **r;
double *be;
double **p;
double **x0;
x0[0] = vec_copy(x, size);
...
line 24: r[0] = vec_subtraction( b, mtrx_multiple(A, x0), size );
line 30: x0[k+1] = vec_addition( x0[k], vec_numb_multiple(a[k], p[k], size), size );
line 39: p[k+1] = vec_addition( r[k+1], vec_numb_multiple(be[k], p[k], size), size );
}
math.h
line 5: double *mtrx_multiple (sparse_mat_t A, double *c);
在那里使用的功能:(math.c
)
double *vec_subtraction (double *a, double *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
for(i=0; i<n; i++)
result[i] = a[i]-b[i];
return result;
}
double *vec_addition (double *a, double *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
for(i=0; i<n; i++)
result[i] = a[i]+b[i];
return result;
}
double *vec_numb_multiple (double a, double *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
for(i=0; i<n; i++)
result[i] = a*b[i];
return result;
}
double *mtrx_multiple (sparse_mat_t A, double *c) {
double *result;
int i, j;
result = malloc((A.size) * sizeof *result);
printf("c.n: %d \n", A.size);
for (i = 0; i < A.size; i++) {
int v = 0;
for (j = A.ia[i]; j < A.ia[i + 1]; j++) {
v += A.a[j] * c[A.ja[j]];
}
result[i] = v;
}
return result;
}
double vec_norm (double *a, int n){
double result;
int i;
for(i=0; i<n; i++)
result = result + ( a[i] * a[i] );
result = sqrt(result);
return result;
}
double *vec_copy (double *a, int n) {
double *result;
int i;
for(i=0; i<n; i++)
result[i] = a[i];
return result;
}
我将不胜感激任何帮助。
修改
我找到了x0问题的解决方案,感谢Ben。现在剩下的是:
solver.c:30: warning: assignment makes pointer from integer without a cast
solver.c:39: warning: assignment makes pointer from integer without a cast
/tmp/ccL4uSoH.o: In function 'vec_norm':
math.c:(.text+0x331): undefined reference to 'sqrt'
collect2: ld returned 1 exit status
答案 0 :(得分:2)
根据你发布的内容,我猜你在调用它之前没有vec_numb_multiple
的声明,并且编译器隐式输入它以返回int;这将导致第30和39行的警告。
undefined reference to sqrt()
表示您没有链接标准数学库;我假设你正在使用gcc,所以你需要在命令行中添加-lm
。
为您自己的代码(math.h,math.c)使用标准库文件名是一个非常糟糕的主意。
答案 1 :(得分:0)
替换(第24行)
r[0] = vec_subtraction( b, mtrx_multiple(A, x0), size );
与
r[0] = vec_subtraction( b, mtrx_multiple(A, x0[0]), size );
你说你想把一个矩阵(我猜是A
)与一个向量相乘,所以第二个参数必须是一个向量。 x0
是一个指向指针的指针,它可以看作是一个二维的二维数组,它意味着x0
的单个单元格是一个双精度数组(即你可以称之为向量的数组)。这就是你想要传递x0 [0]而不仅仅是x0的原因:多个数组。
请参阅John的aswer。