四則演算、ポインタ利用の問題点がわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kitlose

四則演算、ポインタ利用の問題点がわかりません

#1

投稿記事 by kitlose » 8年前

四則演算のポインタを利用したプログラムです。
けれど、このファイルのコンパイルはできるのですがexeが開けません。
間違い等ご指摘お願いします。

code

#include<stdio.h>

typedef struct complex {
double re;
double im;
} COMPLEX;

COMPLEX *padd_c(COMPLEX *px , COMPLEX *py );
COMPLEX *psub_c(COMPLEX *px , COMPLEX *py );
COMPLEX *pmul_c(COMPLEX *px , COMPLEX *py );
COMPLEX *pdiv_c(COMPLEX *px , COMPLEX *py );

int main(void)
{
COMPLEX x = {2.0,2.5};
COMPLEX y = {-1.5,4.5};
COMPLEX *px,*py,*pz;

px = &x;
py = &y;

pz = padd_c(px,py);
printf("((%f)+(%f)i)+((%f)+(%f)i)=((%f)+(%f)i)\n",
px->re,px->im,py->re,py->im,pz->re,pz->im);

pz = psub_c(px,py);
printf("((%f)+(%f)i)-((%f)+(%f)i)=((%f)+(%f)i)\n",
px->re,px->im,py->re,py->im,pz->re,pz->im);

pz = pmul_c(px,py);
printf("((%f)+(%f)i)*((%f)+(%f)i)=((%f)+(%f)i)\n",
px->re,px->im,py->re,py->im,pz->re,pz->im);

pz = pdiv_c(px,py);
printf("((%f)+(%f)i)/((%f)+(%f)i)=((%f)+(%f)i)\n",
px->re,px->im,py->re,py->im,pz->re,pz->im);

}
COMPLEX *pz;
COMPLEX *padd_c(COMPLEX *px , COMPLEX *py ){
pz->re = px->re + py->re;
pz->im = px->im + py->im;
return pz;
}
COMPLEX *psub_c(COMPLEX *px , COMPLEX *py ){
pz->re = px->re - py->re;
pz->im = px->im - py->im;
return pz;
}
COMPLEX *pmul_c(COMPLEX *px , COMPLEX *py ){

pz->re = px->re * py->re - px->im * py->im;
pz->im = px->re * py->im + px->im * py->im;
return pz;
}
COMPLEX *pdiv_c(COMPLEX *px , COMPLEX *py ){
double temp;
temp = py->re * py->re + py->im * py->im;
pz->re = (px->re * py->re + px->im * py->im)/temp;
pz->im = (-1 * px->re * py->im + px->im * py->re)/temp;
return pz;
}
/code

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 四則演算、ポインタ利用の問題点がわかりません

#2

投稿記事 by みけCAT » 8年前

明示的に初期化されていない静的変数なのでNULLが入っているpzをデリファレンスして値を代入しようとしているのが致命的ですね。
無駄にグローバル変数を使用しているのも、致命的ではないですが良くないですね。
また、指す先のデータを変更しないポインタにはconstをつけた方がいいでしょう。

修正案

コード:

#include<stdio.h>
#include<stdlib.h>

typedef struct complex {
	double	re;
	double	im;
} COMPLEX;

COMPLEX *padd_c(const COMPLEX *px , const COMPLEX *py );
COMPLEX *psub_c(const COMPLEX *px , const COMPLEX *py );
COMPLEX *pmul_c(const COMPLEX *px , const COMPLEX *py );
COMPLEX *pdiv_c(const COMPLEX *px , const COMPLEX *py );

int main(void)
{
	COMPLEX x = {2.0,2.5};
	COMPLEX y = {-1.5,4.5};
	COMPLEX *px,*py,*pz;
	
	px = &x;
	py = &y;
	
	pz = padd_c(px,py);
	printf("((%f)+(%f)i)+((%f)+(%f)i)=((%f)+(%f)i)\n",
			px->re,px->im,py->re,py->im,pz->re,pz->im);
	free(pz);
			
	pz = psub_c(px,py);
	printf("((%f)+(%f)i)-((%f)+(%f)i)=((%f)+(%f)i)\n",
			px->re,px->im,py->re,py->im,pz->re,pz->im);
	free(pz);
			
	pz = pmul_c(px,py);
	printf("((%f)+(%f)i)*((%f)+(%f)i)=((%f)+(%f)i)\n",
			px->re,px->im,py->re,py->im,pz->re,pz->im);
	free(pz);
	
	pz = pdiv_c(px,py);
	printf("((%f)+(%f)i)/((%f)+(%f)i)=((%f)+(%f)i)\n",
			px->re,px->im,py->re,py->im,pz->re,pz->im);
	free(pz);
	
	return 0;
}
COMPLEX *padd_c(const COMPLEX *px , const COMPLEX *py ){
	COMPLEX *pz = malloc(sizeof(COMPLEX));
	pz->re = px->re + py->re;
	pz->im = px->im + py->im;
	return pz;
}
COMPLEX *psub_c(const COMPLEX *px , const COMPLEX *py ){
	COMPLEX *pz = malloc(sizeof(COMPLEX));
	pz->re = px->re - py->re;
	pz->im = px->im - py->im;
	return pz;
}
COMPLEX *pmul_c(const COMPLEX *px , const COMPLEX *py ){
	COMPLEX *pz = malloc(sizeof(COMPLEX));

	pz->re = px->re * py->re - px->im * py->im;
	pz->im = px->re * py->im + px->im * py->im;
	return pz;
}
COMPLEX *pdiv_c(const COMPLEX *px , const COMPLEX *py ){
	COMPLEX *pz = malloc(sizeof(COMPLEX));
	double temp;
	temp = py->re * py->re + py->im * py->im;
	pz->re = (px->re * py->re + px->im * py->im)/temp; 
	pz->im = (-1 * px->re * py->im + px->im * py->re)/temp;
	return pz;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

超初級者
記事: 56
登録日時: 9年前

Re: 四則演算、ポインタ利用の問題点がわかりません

#3

投稿記事 by 超初級者 » 8年前

ポインターを使うのは、必須条件ですか?
使わなくてもいいはずです。

box
記事: 2002
登録日時: 13年前

Re: 四則演算、ポインタ利用の問題点がわかりません

#4

投稿記事 by box » 8年前

こんな感じ?

コード:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    double re;
    double im;
} COMPLEX;

typedef COMPLEX *(*func)(COMPLEX *p, COMPLEX *q);

COMPLEX *padd_c(COMPLEX *px, COMPLEX *py)
{
    COMPLEX *pz = malloc(sizeof(COMPLEX));

    pz->re = px->re + py->re;
    pz->im = px->im + py->im;
    return pz;
}

COMPLEX *psub_c(COMPLEX *px, COMPLEX *py)
{
    COMPLEX *pz = malloc(sizeof(COMPLEX));

    pz->re = px->re - py->re;
    pz->im = px->im - py->im;
    return pz;
}

COMPLEX *pmul_c(COMPLEX *px, COMPLEX *py)
{
    COMPLEX *pz = malloc(sizeof(COMPLEX));

    pz->re = px->re * py->re - px->im * py->im;
    pz->im = px->re * py->im + px->im * py->re;
    return pz;
}

COMPLEX *pdiv_c(COMPLEX *px, COMPLEX *py)
{
    COMPLEX *pz = malloc(sizeof(COMPLEX));
    double t = py->re * py->re + py->im * py->im;

    pz->re = (px->re * py->re + px->im * py->im) / t;
    pz->im = (px->im * py->re - px->re * py->im) / t;
    return pz;
}

int main(void)
{
    COMPLEX x = {  2.0, 2.5 };
    COMPLEX y = { -1.5, 4.5 };
    COMPLEX *px, *py, *pz;
    func f[] = { padd_c, psub_c, pmul_c, pdiv_c };
    int i;

    for (px = &x, py = &y, i = 0; i < sizeof(f) / sizeof(f[0]); i++) {
        pz = f[i](px, py);
        printf("((%f)+(%f)i)+((%f)+(%f)i)=((%f)+(%f)i)\n",
            px->re, px->im, py->re, py->im, pz->re, pz->im);
        free(pz);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 四則演算、ポインタ利用の問題点がわかりません

#5

投稿記事 by box » 8年前

Rubyで書くと、めっちゃ簡単。

コード:

require "Complex"

p = Complex(2, 2.5)
q = Complex(-1.5, 4.5)
puts "(#{p}) + (#{q}) = (#{p + q})"
puts "(#{p}) - (#{q}) = (#{p - q})"
puts "(#{p}) * (#{q}) = (#{p * q})"
puts "(#{p}) / (#{q}) = (#{p / q})"
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

kitlose

Re: 四則演算、ポインタ利用の問題点がわかりません

#6

投稿記事 by kitlose » 8年前

ありがとうございます!
皆さんのプログラムを参考にし、様々な方向性から
アプローチできました!
お世話になりました。
ほんとうにありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る