重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

下にあるプログラムでコメントが書いてある部分の"Tmp->x"の値が途中で期待していない変化をします。何回も見ても特に操作していないと見てしまいますが、構造体変数の扱い方がおかしいのでしょうか?

struct zahyo *MpCalculate(struct zahyo *P,int a,int multiple,int prime)
{
struct zahyo *kp,*Tmp;
int i,u,r;

kp=(struct zahyo*)malloc(sizeof(struct zahyo));
kp->x=P->x;
kp->y=P->y;
if(multiple == 1) return kp;

u=myu(P,a,prime);
kp->x=x3_PequalQ(P->x,u,prime);
kp->y=y3(P,kp,u,prime);
if(multiple == 2) return kp;
printf("2Py(%d,%d)\n",kp->x,kp->y);

//P≠Q
for(i=3; i<=multiple; i++){
/*Tmp->xを表示させているDの部分で値が期待しない変化をします*/

Tmp=kp;
A: printf("A:Tmp->x=%d\n",Tmp->x);
r=rmd(Tmp,P,prime);
B: printf("B:Tmp->x=%d\n",Tmp->x);
kp->x=x3_PnotQ(Tmp,P,r,prime);
D: printf("D:Tmp->x=%d\n",Tmp->x);
kp->y=y3(Tmp,kp,r,prime);
printf("%dPy(%d,%d)\n",i,kp->x,kp->y);
}
return kp;
}

int rmd(struct zahyo *P,struct zahyo *Q,int prime)
{
unsigned int m,n;
m=mod(Q->x - P->x,prime);
n=mod(Q->y - P->y,prime);
exeuclid(m,prime,1,0,0,1);
return mod(aa*n,prime);
}

int x3_PnotQ(struct zahyo *P,struct zahyo *Q,int rmd,int p)
{
/*ここでもTmp->x(P->x)の値は操作されていません*/
C:printf("C:Tmp->x = %d\n",P->x);
return mod((int)pow(rmd,2) - P->x - Q->x,p);
}

実行結果
A:Tmp->x=10
B:Tmp->x=10
C:Tmp->x=10
D:Tmp->x=5
常にDの部分で変わってしまいます。

このように変化する原因が分かる方、回答よろしくお願いします。

A 回答 (3件)

> kp->xにx3_PnotQ(Tmp,P,r,prime)の戻り値を代入する部分で変わるのは分かるのですが、


> そこでTmpの値を変更するような操作をしていないので悩んでいます。Tmpの値を変えて
>いるのはループの頭の部分にあるTmp=kpだけなのでは、と思っているのですが、何が起

Tmp = kp とした時点で、Tmpとkpは同じ実体を指しますよね?
なので、そういう状態で kp->x に操作を加えてしまえば
Tmp->x にも影響が及ぶ(同じものなのだから)のは当然のことだと思うのですが
どこに疑問を感じていらっしゃるのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Tmp=kp の後にkpの値を変えればTmpの値まで変わってしまうのですね。
今まで気付きませんでした。
分かるまで教えてくださってありがとうございました。

お礼日時:2006/12/24 11:41

>struct zahyo *kp,*Tmp;


struct zahyo kp,Tmp;

↑こう変更して、プログラムを書き直すと、期待している結果が出ると思います。

Tmp=kp;
ポインタで宣言した場合は、Tmp と kp は同じ構造体を指しています。kp を変更すれば Tmp も変わります。

構造体として宣言した場合は、構造体のデータがコピーされ、kp を変更しても Tmp は変わりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
最近リストばかり使っていて構造体の使い方を忘れていたみたいです。

お礼日時:2006/12/24 11:54

kp->xにx3_PnotQ(Tmp,P,r,prime)の戻り値を代入する部分で変わってます。



Aの手前でTmp=kpとしてるので、Tmp->xに代入するのと同じことです。

この回答への補足

回答ありがとうございます。
kp->xにx3_PnotQ(Tmp,P,r,prime)の戻り値を代入する部分で変わるのは分かるのですが、
そこでTmpの値を変更するような操作をしていないので悩んでいます。Tmpの値を変えて
いるのはループの頭の部分にあるTmp=kpだけなのでは、と思っているのですが、何が起
きているのか考えられる点などありますか?

補足日時:2006/12/24 01:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!