0

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

2 回答 2

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's 在这里做什么。将其更改为

for (i = 0; i < 100; i++)
    for (j = 0; j < 100; j++)
    {
        ...
    }
于 2012-11-28T04:30:11.267 回答
1

首先,您的程序在 *aaa.re = 5; 行停止。

int main()
{
vect_complex aaa;
vect_complex bbb;
*aaa.re = 5;  //your program stops here.
....
} 

原因是您定义了结构 aaa,它为双指针 re 和 im 分配内存,而不是为双精度值。

截至目前,这些指针将指向未初始化的值。当你引用 *aaa.re ie) 当你取消引用它时,你会得到分段错误。

例如,aaa.re 指向我的框中的 0x17。当我取消引用它时,出现分段错误,因为它引用的内存地址超出了程序内存区域。

为了解决这个问题,你应该为 double 分配内存并将它的地址存储到指针 re 中。然后存储双精度值。

大脑完美地覆盖了其他细节。

谢谢, nvseenu

于 2012-11-28T07:01:38.047 回答