我正在尝试使用C中的结构为项目执行复杂的矢量添加和点积。我编写了我的代码,但是在编译时没有问题,一旦我运行我的程序就停止工作了。我还有其他程序部分,但这只是相关部分。我也试图用复数进行矩阵加法和乘法。我想如果能让这些工作起来,我可以修改其他人。任何帮助都将不胜感激。谢谢,我很感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define PI 3.14159265359
typedef struct complex
{
double re;
double im;
}complex;
typedef struct vect_complex
{
double *re;
double *im;
}vect_complex;
typedef struct mat_complex
{
//int i=0,j=0;
double re[100][100];
double im[100][100];
}mat_complex;
void vector_add(vect_complex a[4], vect_complex b[4], vect_complex c[4])
{
int i;
for(i=0; i<3 ;i++);
{
c->re[i] = a->re[i] + b->re[i];
c->im[i] = a->im[i] + b->im[i];
}
printf("Vector addition = (%f + %f*j)i + (%f +%f*j)j + (%f + %f*j)k\n\n",c- >re[0],c->im[0],c->re[1],c->im[1],c->re[2],c->im[2]);
}
void addmx(mat_complex *a, mat_complex *b, mat_complex *c)
{
int i, j;
for ( i = 0 ; i < '\0' ; i++ )
{
for ( j = 0 ; j < '\0' ; j++ )
{
c->re[i][j] = a->re[i][j] + b->re[i][j];
c->im[i][j] = a->im[i][j] + b->im[i][j];
}
}
printf("***Matrix Addition***\n");
for ( i = 0 ; i < '\0' ; i++ )
{
for ( j = 0 ; j < '\0' ; j++ )
{
printf("(%f + %f*j) ", c->re[i][j],c->im[i][j]);
}
printf("\n");
}
}
int main()
{
vect_complex aaa;
vect_complex bbb;
*aaa.re = 5;
*aaa.im = 4;
*bbb.re = 3;
*bbb.im = 2;
vect_complex ccc;
vector_add(&aaa, &bbb, &ccc);
vector_dot_prod(&aaa, &bbb, &ccc);
return 0;
}
答案 0 :(得分:1)
这里有很多问题要处理。
也许您希望vect_complex
保留固定数量的元素,在这种情况下应该定义:
typedef struct vect_complex
{
double re[3];
double im[3];
} vect_complex;
或者,您可以保留当前的定义,但每次使用结构时都需要分配新的数组:
int main(void)
{
vect_complex vc;
vc.re = (double *) malloc(3 * sizeof(double));
vc.im = (double *) malloc(3 * sizeof(double));
vc.re[0] = 1.0;
vc.im[0] = 2.0;
...
}
此函数应将vect_complex
作为输入,而不是复数向量的数组。此实现假定我在上面给出了vect_complex
的定义。
void vector_add(vect_complex * a, vect_complex * b, vect_complex * result)
{
int i;
for (i = 0; i < 3; i++)
{
result->re[i] = a->re[i] + b->re[i];
result->im[i] = a->im[i] + b->im[i];
}
}
我不确定'\0'
在这里做了什么。将其更改为
for (i = 0; i < 100; i++)
for (j = 0; j < 100; j++)
{
...
}
答案 1 :(得分:1)
首先,您的程序停在* aaa.re = 5;
行int main()
{
vect_complex aaa;
vect_complex bbb;
*aaa.re = 5; //your program stops here.
....
}
原因是你定义了结构aaa,为双指针re和im分配内存,而不是double值。
截至目前,这些指针将指向未初始化的值。当你引用像* aaa.re ie)当你取消引用它时,你会得到分段错误。
例如,aaa.re在我的框中指向0x17。当我取消引用它时,我得到分段错误,因为它指的是超出程序存储区的存储器地址。
要解决此问题,您应该为double分配内存并存储地址 它进入指针re。然后存储双精度值。
大脑覆盖其他细节完美。
谢谢, nvseenu