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

まず、プログラムは *aaa.re = 5; の行で停止します。

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

その理由は、double 値ではなく double ポインター re および im にメモリを割り当てる構造体 aaa を定義したためです。

現在、これらのポインターは初期化されていない値を指します。*aaa.re のように参照すると、逆参照すると、セグメンテーション違反が発生します。

たとえば、私のボックスでは aaa.re は 0x17 を指しています。逆参照すると、プログラムメモリ領域外のメモリアドレスを参照しているため、セグメンテーション違反が発生します。

この問題を解決するには、double にメモリを割り当て、そのアドレスをポインター re に格納する必要があります。次に、double 値を格納します。

脳は完全に他の詳細をカバーしました。

ありがとう、

于 2012-11-28T07:01:38.047 に答える
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、複雑なベクトルの配列ではなく、参照を入力として受け取る必要があります。この実装は、上記の I の定義を前提としています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 に答える