【问题标题】:Dealing with warnings in c compilations处理 c 编译中的警告
【发布时间】:2010-01-23 11:39:40
【问题描述】:

我在编译过程中有以下警告:

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

【问题讨论】:

  • 问题出在 mtrx_multiple 的 x0 参数上。您需要说明 x0 是如何声明的。
  • 如何在solver.c中声明x0?
  • 我已将 x0 的声明添加到问题和我正在使用的函数中。
  • 现在它应该和其他变量一样存在。
  • 当你写 mtrx_multiple(A, x0) 时,你是想将一个矩阵和一个向量相乘还是两个矩阵相乘?

标签: c compiler-warnings


【解决方案1】:

根据您发布的内容,我猜您在调用它之前在范围内没有vec_numb_multiple 的声明,并且编译器会隐式键入它以返回 int;这将导致第 30 行和第 39 行的警告。

undefined reference to sqrt() 表示您没有在标准数学库中进行链接;我假设您使用的是 gcc,因此您需要在命令行中添加 -lm

为您自己的代码(math.h、math.c)使用标准库文件名是一个非常糟糕的主意。

【讨论】:

    【解决方案2】:

    替换(第 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,它是:许多数组。

    其余的请看约翰的回答。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多