Расчет векторной точки неправильная сумма - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу создать программу, которая может вычислять векторы с помощью скалярного произведения, но моя сумма всегда равна 0, что я сделал неправильно в этом коде?Я новичок в указателях и функциях, если это важно для вас.Я закодировал все только в основной функции, и это сработало, но я хочу вычислить в другой функции, потому что она понятнее, чем записывать все в основной функции.Я скомпилировал его с -Wall и -Werror и получил 0 предупреждений.

Было бы неплохо, если бы вы могли помочь мне здесь:)

Вот код:

#include<stdio.h>
#include<stdlib.h>

double calculation(int o, double *a, double *b, int sum) {
    int i;
    for(i=0;i<o;++i) {
      printf("Components of first vector\n");
      printf("Component %d: ", i+1);
      scanf("%lf", &a[i]);
    }
    for(i=0;i<o;++i) {
      printf("Components of second vector\n");
      printf("Component %d: ", i+1);
      scanf("%lf", &b[i]);
    }

    for(i=0;i<o;++i) {
      sum += a[i] * b[i];
    }
    return(0);
}
int main() {

  int o;
  int sum=0;
  printf("How many dimensions should the vectors have?\n");
  scanf("%d", &o);
  double *a = malloc(o * sizeof(double));
  double *b = malloc(o * sizeof(double));
  if(a==NULL) {
    printf("Memoryallocation was not successfull!!!");
    return(1);
  }
  if(b==NULL) {
    printf("Memoryallocation was not successfull!!!");
    return(1);
  }
  calculation(o,a,b,sum);


  printf("The dot product is: %d\n", sum);
  free(a);
  free(b);
  a=NULL;
  b=NULL;


  return(0);
}

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Проблема с вашим кодом в том, что sum является локальной переменной в функции calculation.Поэтому, когда вы возвращаетесь к основному параметру, ваша переменная уничтожается, и sum in main по-прежнему равно 0.

Также, если вы получаете floating point values для dimensions, тогда вы должны использовать double для суммы тоже.

Одно из возможных решений может быть таким:

#include<stdio.h>
#include<stdlib.h>

double calculation(int o, double *a, double *b) {
    int i;
    double sum =0.0;
    for(i=0;i<o;++i) {
      printf("Components of first vector\n");
      printf("Component %d: ", i+1);
      scanf("%lf", &a[i]);
    }
    for(i=0;i<o;++i) {
      printf("Components of second vector\n");
      printf("Component %d: ", i+1);
      scanf("%lf", &b[i]);
    }

    for(i=0;i<o;++i) {
      sum += a[i] * b[i];
    }
    return sum;
}
int main() {

  int o;
  double sum =0;
  printf("How many dimensions should the vectors have?\n");
  scanf("%d", &o);
  double *a = malloc(o * sizeof(double));
  double *b = malloc(o * sizeof(double));
  if(a==NULL) {
    printf("Memoryallocation was not successfull!!!");
    return(1);
  }
  if(b==NULL) {
    printf("Memoryallocation was not successfull!!!");
    return(1);
  }
  sum = calculation(o,a,b);


  printf("The dot product is: %lf\n", sum);
  free(a);
  free(b);
  a=NULL;
  b=NULL;


  return(0);
}

Или вы можете передать адрес sum в функцию вычисления как:

#include<stdio.h>
#include<stdlib.h>

void calculation(int o, double *a, double *b,double *sum) {
    int i;
    for(i=0;i<o;++i) {
      printf("Components of first vector\n");
      printf("Component %d: ", i+1);
      scanf("%lf", &a[i]);
    }
    for(i=0;i<o;++i) {
      printf("Components of second vector\n");
      printf("Component %d: ", i+1);
      scanf("%lf", &b[i]);
    }

    for(i=0;i<o;++i) {
      *sum += a[i] * b[i];
    }
}
int main() {

  int o;
  double sum=0;

  printf("How many dimensions should the vectors have?\n");
  scanf("%d", &o);
  double *a = malloc(o * sizeof(double));
  double *b = malloc(o * sizeof(double));
  if(a==NULL) {
    printf("Memoryallocation was not successfull!!!");
    return(1);
  }
  if(b==NULL) {
    printf("Memoryallocation was not successfull!!!");
    return(1);
  }
  calculation(o,a,b,&sum);


  printf("The dot product is: %lf\n", sum);
  free(a);
  free(b);
  a=NULL;
  b=NULL;


  return(0);
}
0 голосов
/ 10 февраля 2019

Эта функция

double calculation(int o, double *a, double *b, int sum) {

должна измениться

double calculation(int o, double *a, double *b, double & sum) {
0 голосов
/ 10 февраля 2019

В double calculation(int o, double *a, double *b, int sum) последний аргумент передается значением 1 .То есть, когда вы вызываете calculation(..., sum);, переменная sum равна , копируется и затем передается в функцию.

Внутри этой функции вы изменяете sum, но это только изменяет копию исходной переменной, которая была передана.Чтобы решить эту проблему, передайте указатель или просто верните сумму из вашей функции.


  1. На самом деле все аргументы передаются по значению.Второй и третий просто указатели.
0 голосов
/ 10 февраля 2019

В C переменные передаются по значению.Это означает, что когда вы изменяете значение sum в calculation, вы изменяете только локальную копию.

Идиоматическим способом, когда вам нужно только одно значение, является его возвращение:

double calculation(int o, double *a, double *b) {
    double sum = 0.;
    ...
    return sum;
}

и в основном:

...
double sum = calculation(o, a, b);
...

В качестве альтернативы, если вам нужно вернуть несколько значений, вы можете передать указатели на выходные переменные

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