我想写一个程序,生成两倍的向量as_re, as_im, bs_re, bs_im, cs_re,
和cs_im
,每个向量的长度为30000,生成bs_re, bs_im, cs_re,
和cs_im
的条目(任何类型的条目都可以(,然后使用一个名为multiply
的函数将bs
和cs
的条目相乘,将结果保存为as。将一个as的随机条目打印到终端。
注意:multiply的签名必须是我写的,即没有返回类型,并且接受double*类型的所有六个参数。
我看了很多关于指针的视频,但我发现很难理解这个概念。我认为我的multiply
函数更改了内存中具有不同地址的a_re
和a_im
,而不是我全局声明的地址。但是,如果我已经全局声明了它们,那么main
函数和multiply
都应该看到它们?
以下是我所做的:
#include <stdio.h>
#include <stdlib.h>
// declaring the multiply function
void multiply(double* c_re, double* c_im, double* a_re, double* a_im, double* b_re, double* b_im);
// generating the vectors
int n = 30000;
double* as_re[n];
double* as_im[n];
double* bs_re[n];
double* bs_im[n];
double* cs_re[n];
double* cs_im[n];
double* a_re = 0;
double* a_im = 0;
int main(){
srand(time(NULL))
for (int i = 0; i < n; i++){
//filling the arrays with random numbers of type double* between 1 and 100.
bs_re[i] = (double*) rand() % 100 + 1;
bs_im[i] = (double*) rand() % 100 + 1;
cs_re[i] = (double*) rand() % 100 + 1;
cs_re[i] = (double*) rand() % 100 + 1;
multiply(cs_re[i], cs_im[i], &as_re[i], &as_im[i], bs_re[i], bs_im[i]);
as_re[i] = a_re;
as_im[i] = a_im;
printf("The product is %d + %din", as_re[i], as_im[i]);
}
}
void multiply(double* c_re, double* c_im, double* a_re, double* a_im, double* b_re, double* b_im){
*a_re = *c_re * *b_re - *c_im * *b_im;
*a_im = *c_re * *b_im + *c_im * *b_re;
}
我认为您可能想要生成一组随机的双值,然后将它们传递给乘法函数,但这不是您所拥有的。注意你所有的数组声明,像这个
double* bs_re[n];
是指向double的指针,而不是double本身。所以当你以后做这个任务时
bs_re[i] = (double*) rand() % 100 + 1;
您正在使指针指向一个随机生成的地址,这或多或少可以保证最终指向不应该指向的内存,并导致分段错误。
你应该做的是像这个一样将数组声明为double
double bs_re[n];
然后给他们分配一个像这样的随机值
bs_re[i] = (double) (rand() % 100 + 1);
然后将这些值的地址(即指向这些值的指针(传递到乘法中,这样它们就可以解引用您在上述步骤中分配的值。
multiply(&cs_re[i], &cs_im[i], &as_re[i], &as_im[i], &bs_re[i], &bs_im[i]);
由于multiply函数将答案直接放入as_re和as_im中,因此调用后的赋值语句不需要进行乘法运算。
您也有一些其他错误,但这应该有助于您理顺指针部分。
rand
生成一个int
。然后,您指示编译器将该随机int视为指向双精度的指针,然后推迟该随机小地址,从而导致崩溃。将int转换为双精度。