関数の引数「変数&とポインタ」の関係性

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ほりでい
記事: 15
登録日時: 4年前

関数の引数「変数&とポインタ」の関係性

#1

投稿記事 by ほりでい » 4年前

コード:

#include <math.h>
#include <DxLib.h>

static const float ROTATE_SPEED = DX_PI_F/90;//回転スピード

// (x,y)の点を(mx,my)を中心にang角回転する
void rotate(float *x, float *y, const float ang, const float mx, const float my){
    const float ox = *x-mx, oy = *y-my;
    *x =  ox * cos(ang) + oy * sin(ang);
    *y = -ox * sin(ang) + oy * cos(ang);
    *x += mx;
    *y += my;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

    float cameraX=0, cameraZ=-20;    //カメラの座標
    const float targetX=0, targetZ=0;//カメラの視線の先ターゲットの座標

    //3Dモデルの読み込み
    int ModelHandle = MV1LoadModel( "dat/Lat式ミク/Lat式ミクVer2.3_Normal.pmd" ) ;

    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;

    while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){

        if( CheckHitKey(KEY_INPUT_LEFT) > 0 ){//左キーが押されていたら
            rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ);//回転
        }
        if( CheckHitKey(KEY_INPUT_RIGHT) > 0 ){//右キーが押されていたら
            rotate(&cameraX, &cameraZ, -ROTATE_SPEED, targetX, targetZ);//回転
        }

        //第一引数の視点から第二引数のターゲットを見る角度にカメラを設置
        SetCameraPositionAndTarget_UpVecY( VGet( cameraX, 10, cameraZ ), VGet( targetX, 10.0f, targetZ ) ) ;

        // 3Dモデルの描画
        MV1DrawModel( ModelHandle ) ;

    }

    DxLib_End();
    return 0;
}
プログラミングの館「 rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ);//回転」のソースコードがいまいちわかりません。
「+ROTATE_SPEED」は DX_PI_Fを90で割った値をプラスの値にするということであっていますか?
それと「 DX_PI_F]はどういう意味か教えてくれたらうれしいです
「 rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ)」は引数として、rotate関数に渡されると思うんですが、&cameraXと&cameraZはどのように渡されるのでしょうか?
rotate関数の「float *x, float *y」はポインタ変数?
ネットでも調べはしましたが、いまいちピンときません「&cameraX,&cameraZ」と「float *x, float *y」の関係性について教えてください<(_ _)>
長文になってしまってすみません(-_-)

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

Re: 関数の引数「変数&とポインタ」の関係性

#2

投稿記事 by box » 4年前

「+ROTATE_SPEED」は DX_PI_Fを90で割った値をプラスの値にするということであっていますか?
ROTATE_SPEEDは90という定数として定義してあって、それに+が付いている(なくてもいいですけど)ということは、
関数に+90という値を渡していることになります。
それと「 DX_PI_F]はどういう意味か教えてくれたらうれしいです
たぶん円周率のことでしょう。

また、下記のコードで何をしているか、読めますか?

コード:

#include <stdio.h>

void func(double *x, double *y, int m, int n)
{
    *x = m + n;
    *y = m * n;
}

int main(void)
{
    double s, t;
    int i = 3, j = 4;

    func(&s, &t, i, j);
    printf("s = %f, t = %f\n", s, t);
    return 0;
}

バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 関数の引数「変数&とポインタ」の関係性

#3

投稿記事 by box » 4年前

static const float ROTATE_SPEED = DX_PI_F/90;//回転スピード
と書いてあるから、
ROTATE_SPEEDは90という定数として定義してあって、
は誤りでした。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ほりでい
記事: 15
登録日時: 4年前

Re: 関数の引数「変数&とポインタ」の関係性

#4

投稿記事 by ほりでい » 4年前

main関数内で、funcの引数に実数型の変数s,tのアドレスと整数型の変数i,jを渡し、func関数では、実数型の変数x,yが、実数型のs,tのアドレスを受け取り、整数型の変数m,nが、整数型の変数i,jの値(i=3,j=4)をそれぞれ受け取る?
x,yは受け取った変数のアドレス(s,t)となっていて、x(s)のアドレスにm+n(3+4=7)を代入、y(t)のアドレスにm*n(3*4=12)を代入
printf s=7,t=12 でいいでしょうか?
ここでいうSのアドレスとはメモリ上にある変数Sが保存されている場所の先頭のアドレスと解釈していますが、あっていますか?
プログラミングを始めたばかりで質問攻めになってしまってすみません。<(_ _)>

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

Re: 関数の引数「変数&とポインタ」の関係性

#5

投稿記事 by box » 4年前

func関数では、実数型の変数x,yが
double型へのポインター変数x, yです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ほりでい
記事: 15
登録日時: 4年前

Re: 関数の引数「変数&とポインタ」の関係性

#6

投稿記事 by ほりでい » 4年前

短いソースコードを作ってもらい、そのおかげで理解することができました。ありがとうございました(人''▽`)。

返信

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