使用c中的结构的复杂向量加法

时间:2012-11-28 03:59:18

标签: c arrays multidimensional-array

我正在尝试使用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;
}

2 个答案:

答案 0 :(得分:1)

这里有很多问题要处理。

1。 vect_complex

也许您希望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;
    ...
}

2。 vector_add

此函数应将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];
    }
}

3。 addmx

我不确定'\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