Двумерный массив: внутренняя ошибка компиляции продукта - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь завершить присваивание, которое требует от меня написать функцию double inner_product(const double *a, const double *b, int n), где a и b - указатели на массив длины n. Эта функция найдет внутренний продукт, определенный как $ \ sum_ {i = 0} ^ n i ^ 2 = a_i * b_i $, используя только арифметику указателей.

Ниже приведен код, который я придумал. Не компилируется и выдает ошибку. Может кто-нибудь, пожалуйста, помогите мне исправить эту ошибку и предложить какие-либо улучшения этого кода.

#include<stdio.h>
#define N 10

double inner_product(const double *a, const double *b, int n)
{   int sum=0;
    int row= (int)&a;
    int column=(int)&b;
    const double ar[row][column];
    const double *p;

    for(p=&ar[0][0]; p<&ar[n][n]; p++) 
    {sum += *p;}

    return sum;
}

int main()
{
  const double *a, *b;
  int row= (int)&a; int column=(int)&b;
  int N;
  double x;
  const double *p, ar[row][column];

 printf("Enter the %d elements of each row and column seperated by a comma:\n",N);

 for(p=&ar[0][0];p<&ar[N][N];p++)
    {scanf("%d%d",&row, &column);}

 x=inner_product(a,b, N);

 printf("the inner product of the matrix is: %lf", x);

 return 0;
 }

1 Ответ

0 голосов
/ 05 мая 2018

Как я уже говорил в комментариях, вам нужно начать с самого начала снова. Вот переписанная программа, которая делает эту работу. Функция inner_product() умеренно велика просто потому, что в ней есть отладочный код печати (закомментированный) и три альтернативных способа выполнения арифметики (два из них тоже закомментированы). Ядро чрезвычайно простое.

#include <stdio.h>

#define N 10

static double inner_product(const double *a, const double *b, int n)
{
    double sum = 0;
    for (int i = 0; i < n; i++)
    {
        /*printf("%8.3f * %8.3f = %14.6f  ", *a, *b, *a * *b);*/
        // Alternative ways of computing the sum
        // sum += *(a+i) * *(b+i);
        // sum += a[i] * b[i];
        sum += *a++ * *b++;
        /*printf("CS = %15.6f\n", sum);*/
    }
    return sum;
}

static void print_vector(const char *tag, const double *v, int n)
{
    printf("Vector %s (%d):\n", tag, n);
    for (int i = 0; i < n; i++)
        printf("%9.3f", v[i]);
    putchar('\n');
}

int main(void)
{
    // random -n 10 -F '%7.3f' -- -1000 1000 | commalist -B 8 -n 5 -W 8
    double a[N] =
    {
         -78.533,   52.153, -632.825, -196.897,  157.031,
        -804.630, -787.420, -281.817, -963.641,  561.922,
    };
    double b[N] =
    {
         112.700,  -83.580, -294.587,  320.394,   -8.366,
         218.917,  148.115,  421.533, -691.338, -741.578,
    };

    print_vector("A", a, N);
    print_vector("B", b, N);

    double x = inner_product(a, b, N);
    printf("The inner product of the vectors is: %lf\n", x);

    return 0;
}

Функция печати полезна; Вы можете разработать варианты, которые выводят новую строку каждые пять чисел или любое другое число чисел в строке. Печать данных теста важна; это гарантирует, что программа обрабатывает ожидаемые вами данные.

Вывод (отладка включена):

Vector A (10):
  -78.533   52.153 -632.825 -196.897  157.031 -804.630 -787.420 -281.817 -963.641  561.922
Vector B (10):
  112.700  -83.580 -294.587  320.394   -8.366  218.917  148.115  421.533 -691.338 -741.578
 -78.533 *  112.700 =   -8850.669100  CS =    -8850.669100
  52.153 *  -83.580 =   -4358.947740  CS =   -13209.616840
-632.825 * -294.587 =  186422.018275  CS =   173212.401435
-196.897 *  320.394 =  -63084.617418  CS =   110127.784017
 157.031 *   -8.366 =   -1313.721346  CS =   108814.062671
-804.630 *  218.917 = -176147.185710  CS =   -67333.123039
-787.420 *  148.115 = -116628.713300  CS =  -183961.836339
-281.817 *  421.533 = -118795.165461  CS =  -302757.001800
-963.641 * -691.338 =  666201.641658  CS =   363444.639858
 561.922 * -741.578 = -416708.992916  CS =   -53264.353058
The inner product of the vectors is: -53264.353058

Вывод (отладка отключена):

Vector A (10):
  -78.533   52.153 -632.825 -196.897  157.031 -804.630 -787.420 -281.817 -963.641  561.922
Vector B (10):
  112.700  -83.580 -294.587  320.394   -8.366  218.917  148.115  421.533 -691.338 -741.578
The inner product of the vectors is: -53264.353058

Я проверил это, написав скрипт для диска bc, чтобы повторить расчет; он дал тот же ответ (после того, как я отладил скрипт).

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