矢量点积计算错误的总和

时间:2019-02-10 14:03:06

标签: c

我想制作一个可以计算带有点积的向量的程序,但是我的总和始终为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 :(得分:3)

在C中,变量按值传递。这意味着,当您更改width<div class="parent"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> 的值时,您仅更改了本地副本。

只需要一个值的惯用方式是返回它:

.parent {
  width: 100%;
  display: flex;
  flex-wrap: wrap;
}
.item {
  flex-grow: 1;
  min-width: calc(100%/8);
}

和主要内容:

sum

或者,如果您需要返回多个值,则可以将指针传递给输出变量

答案 1 :(得分:1)

double calculation(int o, double *a, double *b, int sum)中,最后一个参数由值 1 传递。也就是说,当您调用calculation(..., sum);时,变量sum复制,然后传递给函数。

在此函数中,您正在修改sum,但这只会修改传递的原始变量的副本。要解决此问题,请传递一个指针或仅从函数中返回总和。


  1. 实际上,所有参数都是按值传递的。第二和第三个恰好是指针。

答案 2 :(得分:0)

此功能

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

应该更改

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

答案 3 :(得分:0)

您的代码存在的问题是sumcalculation函数中的局部变量。因此,当您返回main时,变量将被破坏,并且sum in main仍为0。

此外,如果您获得floating point values的{​​{1}},则也必须使用 double作为总和

一个可能的解决方案可能是这样的:

dimensions

或者您可以通过以下方式将#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