Q&A (電気電子)

【構造体】構造体どうしの加算・減算は簡単にできなかった話

おぼえ書きとしてメモしておきます。

参考書をもとに勉強していて思ったんですが、構造体同士の「代入」は簡単にできるんですが、四則演算しようとすると、簡単にはできないようでした。

プログラム

練習問題のプログラムで、目的のx座標とy座標を入力する方法と目的の位置までのx座標とy座標(移動に必要な距離)の二種類で、入力方法を選択できるように、という指示のもと入力を行うものだったのですが、

 printf("入力方法:座標=1/座標移動距離=2:");
        scanf_s("%d", &input_select);

        if (input_select == 1) {
            printf("目的地のX座標:"); scanf_s("%lf", &dest.x);
            printf("    Y座標:"); scanf_s("%lf", &dest.y);
        }
        else {

            printf("X座標移動距離:"); scanf_s("%lf",&dest_frm_now.x);
            printf("X座標移動距離:"); scanf_s("%lf", &dest_frm_now.y);
            
            trg_point(&mycar,&dest,&dest_frm_now);

            printf("移動距離は以下の通りです。\n");
            printf("目的地のX座標:%.2f\n",dest.x);
            printf("    Y座標:%.2f\n",dest.y);
        }

このようなコードで適当に条件分岐して、

trg_point(&mycar,&dest,&dest_frm_now);

この関数でやってやろうと思ったのですが、

構造体同士は代入が可能なので、演算も行けるだろうと思ってやってみたところ、

typedef struct {
    double x;
    double  y;
}Point;

typedef struct {
    Point pt;
    double fuel;
}Car;
void trg_point(Car *c,Point *dest,Point *new_dest) {
    *dest=c->pt.x + *new_dest;
}  

という感じでポインタで指したdestという構造体にCarの構成メンバの構造体Pointのpt(ややこしい...)を直接代入しようと思ったのですが、「それはできません」的なエラーが出てダメでした。

結果的に以下の構文でできましたが、代入はできても演算は簡単にできないみたいですね。

void trg_point(Car *c,Point *dest,Point *new_dest) {
    dest->x = c->pt.x + new_dest->x;
    dest->y = c->pt.y + new_dest->y;
}

コメント

軽くネットで調べてみたところ、ほかの言語でなんだか特殊な文法?で代入している例があったのですが、一見して自分のレベルでは何をやっているのかわかりませんでしたし、
内部の構成メンバを指定してやった方が個人的に見やすかったので、今はこれで良しと納得?しました。

もっと理解したらもう一回戻ってこよう。。。

-Q&A (電気電子)
-