四則演算のポインタを利用したプログラムです。
けれど、このファイルのコンパイルはできるのですが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
四則演算、ポインタ利用の問題点がわかりません
Re: 四則演算、ポインタ利用の問題点がわかりません
明示的に初期化されていない静的変数なのでNULLが入っているpzをデリファレンスして値を代入しようとしているのが致命的ですね。
無駄にグローバル変数を使用しているのも、致命的ではないですが良くないですね。
また、指す先のデータを変更しないポインタにはconstをつけた方がいいでしょう。
修正案
無駄にグローバル変数を使用しているのも、致命的ではないですが良くないですね。
また、指す先のデータを変更しないポインタには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で殴ればいい!(死亡フラグ)
Re: 四則演算、ポインタ利用の問題点がわかりません
こんな感じ?
#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 四則演算、ポインタ利用の問題点がわかりません
ありがとうございます!
皆さんのプログラムを参考にし、様々な方向性から
アプローチできました!
お世話になりました。
ほんとうにありがとうございました!
皆さんのプログラムを参考にし、様々な方向性から
アプローチできました!
お世話になりました。
ほんとうにありがとうございました!