Работа с предупреждениями в c компиляциях - PullRequest
1 голос
/ 23 января 2010

У меня есть следующие предупреждения во время компиляции:

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;
}

Буду благодарен за любую помощь.

EDIT

Я нашел решение проблемы x0, спасибо Бен. Теперь то, что осталось:

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 ]

2 голосов
/ 23 января 2010

Исходя из того, что вы опубликовали, я собираюсь догадаться, что у вас нет декларации для vec_numb_multiple в области видимости, прежде чем вы ее вызовете, и компилятор неявно печатает ее, чтобы вернуть int; это привело бы к предупреждениям в строках 30 и 39.

undefined reference to sqrt() означает, что вы не используете ссылки в стандартной математической библиотеке; Я предполагаю, что вы используете gcc, поэтому вам нужно добавить -lm в командную строку.

Это действительно плохая идея использовать стандартное имя файла библиотеки для своего собственного кода (math.h, math.c).

0 голосов
/ 23 января 2010

заменить (строка 24)

r[0] = vec_subtraction( b, mtrx_multiple(A, x0), size );

с

r[0] = vec_subtraction( b, mtrx_multiple(A, x0[0]), size );

Вы сказали, что хотите умножить матрицу (A я предполагаю) на вектор, поэтому вторым аргументом должен быть вектор. x0 - это указатель на указатели, который можно рассматривать как двумерный массив значений типа double, это означает, что одна ячейка из x0 является массивом значений типа double (то есть то, что вы можете назвать вектором) Вот почему вы хотите передать x0 [0], а не просто x0, а именно: множество массивов.

см. Ответ Джона на остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...