ページ 11

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

Posted: 2012年8月01日(水) 18:58
by Takumi
現在、龍神録プログラミングの館の第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」には何が入るのかを教えて欲しいです。お願いします。

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

Posted: 2012年8月01日(水) 19:10
by softya(ソフト屋)
Takumi さんが書きました: この引数に使用されたポインタについて調べたのですが仕組みが理解できません。
あとその仕組みを利用した結果「cp,p,c,cq,q」には何が入るのかを教えて欲しいです。お願いします。
ポインタの理解度を知りたいので答えてもらえますか?
(1)簡単なポインタから分からない。
(2)今回の様な構造体が絡むと分からない。

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

Posted: 2012年8月01日(水) 19:11
by nil
ポインタについて理解はありますか?
「cp,p,c,cq,q」にはいる値はprintfDxで出力すればわかります

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

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

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

Posted: 2012年8月01日(水) 19:28
by 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は別名として使えるわけです。

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

Posted: 2012年8月01日(水) 19:47
by box
p が構造体へのポインターであるとします。

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

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

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

え?そんなことはわかっている?これはどうも失礼いたしました。

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

Posted: 2012年8月01日(水) 20:20
by Takumi
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の値がどこで設定されているのかが気になります。

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

Posted: 2012年8月01日(水) 20:35
by softya(ソフト屋)
理解はあっていると思います。
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章かそれ以前の章の何処かにありませんか?

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

Posted: 2012年8月01日(水) 21:20
by Takumi
softya(ソフト屋) さんが書きました:理解はあっていると思います。

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

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