处理c编辑中的警告

时间:2010-01-23 11:39:41

标签: c compiler-warnings

编译期间我有以下警告:

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

2 个答案:

答案 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。