
下にあるプログラムでコメントが書いてある部分の"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の部分で変わってしまいます。
このように変化する原因が分かる方、回答よろしくお願いします。
No.2ベストアンサー
- 回答日時:
> kp->xにx3_PnotQ(Tmp,P,r,prime)の戻り値を代入する部分で変わるのは分かるのですが、
> そこでTmpの値を変更するような操作をしていないので悩んでいます。Tmpの値を変えて
>いるのはループの頭の部分にあるTmp=kpだけなのでは、と思っているのですが、何が起
Tmp = kp とした時点で、Tmpとkpは同じ実体を指しますよね?
なので、そういう状態で kp->x に操作を加えてしまえば
Tmp->x にも影響が及ぶ(同じものなのだから)のは当然のことだと思うのですが
どこに疑問を感じていらっしゃるのでしょうか?
回答ありがとうございます。
Tmp=kp の後にkpの値を変えればTmpの値まで変わってしまうのですね。
今まで気付きませんでした。
分かるまで教えてくださってありがとうございました。
No.3
- 回答日時:
>struct zahyo *kp,*Tmp;
struct zahyo kp,Tmp;
↑こう変更して、プログラムを書き直すと、期待している結果が出ると思います。
Tmp=kp;
ポインタで宣言した場合は、Tmp と kp は同じ構造体を指しています。kp を変更すれば Tmp も変わります。
構造体として宣言した場合は、構造体のデータがコピーされ、kp を変更しても Tmp は変わりません。
No.1
- 回答日時:
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だけなのでは、と思っているのですが、何が起
きているのか考えられる点などありますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
if と配列の組み合わせ
-
C++でRPGを作成する際のステー...
-
C言語についてです。
-
C言語での奇数の和
-
C 言語の Gauss Jordan 法について
-
商と剰余を同時に求める(C言語)
-
C言語で行列の積を計算できるよ...
-
未解決の外部シンボル _printf...
-
行列の列の絶対値の総和の最大...
-
memsetについて
-
【Visual Studio】プロジェクト...
-
C言語で分からないところがあり...
-
「{ } で囲むだけ」は正しい?
-
整数データの配列から同じ値の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報