龍神録プログラミングの館の第34章のポインタについて

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

龍神録プログラミングの館の第34章のポインタについて

#1

投稿記事 by Takumi » 13年前

現在、龍神録プログラミングの館の第34章を見ているのですが分からないところがあります。

コード:

/* 2次元ベクトル */
typedef struct {
  double x, y;
} Vector2_t;

/* diff ← ベクトル p - q */
void Vector2Diff(Vector2_t *diff, const Vector2_t *p, const Vector2_t *q)
{
  diff->x = p->x - q->x;
  diff->y = p->y - q->y;
}

/* ベクトル p と q の内積 */
double Vector2InnerProduct(const Vector2_t *p, const Vector2_t *q)
{
  return p->x * q->x + p->y * q->y;
}

/* ベクトル p と q の外積 */
double Vector2OuterProduct(const Vector2_t *p, const Vector2_t *q)
{
  return p->x * q->y - p->y * q->x;
}

/*中略*/

        /* ベクトル C→P と C→Q のなす角θおよび回転方向を求める.*/
        Vector2_t c, p, q; /* 入力データ */
        Vector2_t cp;      /* ベクトル C→P */
        Vector2_t cq;      /* ベクトル C→Q */
        double s;          /* 外積:(C→P) × (C→Q) */
        double t;          /* 内積:(C→P) ・ (C→Q) */
        double theta,theta2;/* θ (ラジアン) */

        /* c,p,q を所望の値に設定する.*/
        c.x = pt[0].x;  c.y = pt[0].y;
        p.x = pt[1].x;  p.y = pt[1].y;
        q.x = x;                q.y = y;

        /* 回転方向および角度θを計算する.*/
        Vector2Diff(&cp, &p, &c);          /* cp ← p - c   */
        Vector2Diff(&cq, &q, &c);          /* cq ← q - c   */
        s = Vector2OuterProduct(&cp, &cq); /* s ← cp × cq */
        t = Vector2InnerProduct(&cp, &cq); /* t ← cp ・ cq */
        theta = atan2(s, t);
この引数に使用されたポインタについて調べたのですが仕組みが理解できません。
あとその仕組みを利用した結果「cp,p,c,cq,q」には何が入るのかを教えて欲しいです。お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 龍神録プログラミングの館の第34章のポインタについて

#2

投稿記事 by softya(ソフト屋) » 13年前

Takumi さんが書きました: この引数に使用されたポインタについて調べたのですが仕組みが理解できません。
あとその仕組みを利用した結果「cp,p,c,cq,q」には何が入るのかを教えて欲しいです。お願いします。
ポインタの理解度を知りたいので答えてもらえますか?
(1)簡単なポインタから分からない。
(2)今回の様な構造体が絡むと分からない。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 14年前

Re: 龍神録プログラミングの館の第34章のポインタについて

#3

投稿記事 by nil » 13年前

ポインタについて理解はありますか?
「cp,p,c,cq,q」にはいる値はprintfDxで出力すればわかります

Takumi

Re: 龍神録プログラミングの館の第34章のポインタについて

#4

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:
Takumi さんが書きました:
ポインタの理解度を知りたいので答えてもらえますか?
(1)簡単なポインタから分からない。
(2)今回の様な構造体が絡むと分からない。
(2)になります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 龍神録プログラミングの館の第34章のポインタについて

#5

投稿記事 by softya(ソフト屋) » 13年前

Vector2_t で定義された変数はすべて構造体変数です。
構造体は分かりますよね?
Vector2_t s;
の場合は、s.xやs.yで構造体のメンバン変数を参照と更新できます。
ここまではOKでしょうか?

で、問題はここからですが、
Vector2_t *sp;
これが構造体のポインタです。
sp = &s;
で構造体の実体ポインタ値を設定すると。
sp->xでs.x。sp->yでs.yを参照と更新するのと同じことになります。
言うなれば、この状態においてはsの別名的存在がspと言うことですね。
引数においても同じで、
Vector2Diff(&cp, &p, &c);
で呼び出せば、
void Vector2Diff(Vector2_t *diff, const Vector2_t *p, const Vector2_t *q)
呼び元と関数側のcpとdiff、pとp、cとqは別名として使えるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 龍神録プログラミングの館の第34章のポインタについて

#6

投稿記事 by box » 13年前

p が構造体へのポインターであるとします。

そうすると、p が指している実体は *p と書きます。ここは、p が構造体であろうがなかろうが同じですね。

p が指している実体 *p に属するメンバー x にアクセスするとき、(*p).x と書きます。
ここは、別の変数 q が構造体の実体であるとき、メンバー x にアクセスする際 q.x と書くのと同じですね。
ここで、カッコは必ずいります。なぜなら、演算子の優先順位により、
*p.x は *(p.x) と解釈し、(*p).x とは意味合いが異なるからです。

そして、(*p).x と p->x は、等価です。

え?そんなことはわかっている?これはどうも失礼いたしました。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Takumi

Re: 龍神録プログラミングの館の第34章のポインタについて

#7

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:Vector2_t で定義された変数はすべて構造体変数です。
構造体は分かりますよね?
Vector2_t s;
の場合は、s.xやs.yで構造体のメンバン変数を参照と更新できます。
ここまではOKでしょうか?

で、問題はここからですが、
Vector2_t *sp;
これが構造体のポインタです。
sp = &s;
で構造体の実体ポインタ値を設定すると。
sp->xでs.x。sp->yでs.yを参照と更新するのと同じことになります。
言うなれば、この状態においてはsの別名的存在がspと言うことですね。
引数においても同じで、
Vector2Diff(&cp, &p, &c);
で呼び出せば、
void Vector2Diff(Vector2_t *diff, const Vector2_t *p, const Vector2_t *q)
呼び元と関数側のcpとdiff、pとp、cとqは別名として使えるわけです。
と言う事は
Vector2Diff(&cp, &p, &c);
この時、Vector2_t*deff→構造体cpのデータ const Vector2_t*p→構造体pのデータ const Vector2_t *q→構造体cのデータ で
diff->x = p->x - q->x;
diff->y = p->y - q->y;
これを処理するのでしょうか?
だとしたら
c.x = pt[0].x; c.y = pt[0].y;
p.x = pt[1].x; p.y = pt[1].y;
q.x = x; q.y = y;
構造体c,p,qのデータを設定するpt[0].x,pt[0].y,pt[1].x,pt[1].yの値がどこで設定されているのかが気になります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 龍神録プログラミングの館の第34章のポインタについて

#8

投稿記事 by softya(ソフト屋) » 13年前

理解はあっていると思います。
Takumi さんが書きました: c.x = pt[0].x; c.y = pt[0].y;
p.x = pt[1].x; p.y = pt[1].y;
q.x = x; q.y = y;
構造体c,p,qのデータを設定するpt[0].x,pt[0].y,pt[1].x,pt[1].yの値がどこで設定されているのかが気になります。
龍神録の全体を把握しているわけではありませんが、最初に提示された部分には無いことは確かです。
第34章かそれ以前の章の何処かにありませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 龍神録プログラミングの館の第34章のポインタについて

#9

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:理解はあっていると思います。

龍神録の全体を把握しているわけではありませんが、最初に提示された部分には無いことは確かです。
第34章かそれ以前の章の何処かにありませんか?
ソリューション全体で検索しましたが値が設定されている所は見つかりませんでした。
あとサイトでは「pt[0]」と書かれているのですが落としたプログラムの中では「pt0」書かれていました。

とりあえずポインタについて理解する事ができたの解決した事にします。どうもありがとうございました。

閉鎖

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