どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

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

どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

#1

投稿記事 by dic » 9年前

現在行列のプログラムに取り組んでいます
そこで typedef struct で Matrix3X3 という型を定義してこれを計算しようとしたところ
// error C2676: 二項演算子 '[' : 'Matrix3X3' は、この演算子または定義済の演算子に
// 適切な型への変換の定義を行いません。 (新しい動作; ヘルプを参照)
というコンパイルエラーがおきます
通常の計算もできないので、原因がわからないです
どうしたらいいのでしょうか?
環境は Visual C++ 6.0 です

コード:


typedef	struct
{
	double	index[3][3];
}Matrix3X3;

Matrix3X3	obj[3];

//==================================================================
void	func0()
{
	// 画像の読み込み
	GrHandle = LoadGraph( "test.jpg" );

	obj[0].index[0][0] = 50;
	obj[0].index[1][0] = 40;
	obj[0].index[2][0] = 1;

	obj[1].index[0][0] = 100;
	obj[1].index[1][0] = 40;
	obj[1].index[2][0] = 1;

	obj[2].index[0][0] = 75;
	obj[2].index[1][0] = 200;
	obj[2].index[2][0] = 1;

}

//	まだ理解できていない
Matrix3X3	multiplyMatrixNxM( Matrix3X3 a, Matrix3X3 b )
{
	Matrix3X3	temp;
	temp.index[0][0] = 0.0f;
	temp.index[1][0] = 0.0f;
	temp.index[2][0] = 0.0f;

	for( int i = 0; i<3; i++ )
	{
		for( int j=0; j<3; j++ )
		{
			temp.index[i][0] = (a.index[i][j] * b.index[j][0] );
		}
	}
	return temp;
}

Matrix3X3	rotate2D( Matrix3X3 start, float theta )
{
	Matrix3X3	temp;
	Matrix3X3	result;

	//	行列を0で初期化
	memset( &temp, 0, sizeof(temp) );

	//	回転行列に必要な値を入力
	temp.index[0][0] = cos( DegreesToRads(theta) );
	temp.index[1][1] = cos( DegreesToRads(theta) );
	temp.index[2][2] = 1;
	temp.index[0][1] = -1 * (sin(DegreesToRads(theta)));
	temp.index[1][0] = sin(DegreesToRads(theta));

	//	まだ、理解できていない
//	result = multiplyMatrixNxM( temp, start );


	//	error C2676: 二項演算子 '[' : 'Matrix3X3' は、この演算子または定義済の演算子に
	//	適切な型への変換の定義を行いません。 (新しい動作; ヘルプを参照)
	result[0][0] = 0 * 0;	//	これもダメ
	result[0][0] = temp.index[0][1] * start.index[0][0];
	result[1][0] = temp.index[1][0] * start.index[1][0];
	result[2][0] = temp.index[2][2] * start.index[2][0];

	return result;
}
最後に編集したユーザー dic on 2011年6月24日(金) 17:23 [ 編集 1 回目 ]

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: コンパイルエラー c2676 (VC++6.0)

#2

投稿記事 by dic » 9年前

ソースを眺めていたら .index がぬけていることを見つけました
解決しました

// 計算式があってないのは未完成なのです

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

#3

投稿記事 by dic » 9年前

スレを再利用させてもらいます

ひとまず、できたのですが したのソースにある
度に設定する変数が、1単位で作っているのですが
どうにも10単位で動かさないと、思ったとおりに動いてくれません

これは、どこか、計算しているところが間違っているのでしょうか?
デバック用に 計算結果をテキストに出力してみましたが、ここに異常はなかったです

やりたいことは、obj[3] に変数がはいっていてて、これが三角形の頂点として
図形を描きます
そして、これを回転させることです

コード:


//	引数をラジアンで受け取り、結果を度で返す
#define	RadsToDegrees(radian)	((radian)*(180.0f/M_PI))

//	度で入力した値をラジアンに変換して返す
#define	DegreesToRads(degrees)	((degrees)*(M_PI)/180.0f)

typedef	struct
{
	double	index[3][3];
}Matrix3X3;
typedef	struct
{
	double	index[3];
}Matrix3X1;

Matrix3X1	obj[3];

//==================================================================
void	func0()
{
	obj[0].index[0] = 50;
	obj[0].index[1] = 40;
	obj[0].index[2] = 0;

	obj[1].index[0] = 100;
	obj[1].index[1] = 40;
	obj[1].index[2] = 0;

	obj[2].index[0] = 75;
	obj[2].index[1] = 200;
	obj[2].index[2] = 0;

	//	デバック用
	vector<double>	vDegrees;
	FILE	*file = fopen( "DegreesToRads.txt", "wt" );
	char	buf[80];
	int	i;
	for( i=0; i<360; i++ )
	{
		sprintf( buf, "[%3d]:%f\n", i, DegreesToRads(i) );
		fputs( buf, file );
		vDegrees.push_back( DegreesToRads(i) );
	}
	fclose( file );
	
	file = fopen( "RadsToDegrees.txt", "wt" );
	for( i=0; i<vDegrees.size(); i++ )
	{
		sprintf( buf, "[%3d]:%f\n", i, RadsToDegrees(vDegrees.at(i)) );
		fputs( buf, file );
	}
	fclose( file );
}

Matrix3X1	multiplyMatrixNxM( Matrix3X3 a, Matrix3X1 b )
{
	Matrix3X1	temp;
	temp.index[0] = 0.0f;
	temp.index[1] = 0.0f;
	temp.index[2] = 0.0f;

	for( int i = 0; i<3; i++ )
	{
		for( int j=0; j<3; j++ )
		{
			temp.index[i] += (a.index[i][j] * b.index[j] );
		}
	}
	return temp;
}

Matrix3X1	rotate2D( Matrix3X1 start, float theta )
{
	Matrix3X3	temp;
	Matrix3X1	result;

	//	行列を0で初期化
	memset( &temp, 0, sizeof(temp) );
	memset( &result, 0, sizeof(result) );

	//	回転行列に必要な値を入力
	temp.index[0][0] = cos( DegreesToRads(theta) );
	temp.index[1][1] = cos( DegreesToRads(theta) );
	temp.index[2][2] = 1;
	temp.index[0][1] = -1 * (sin(DegreesToRads(theta)));
	temp.index[1][0] = sin(DegreesToRads(theta));

	result = multiplyMatrixNxM( temp, start );

	return result;
}

//==================================================================
void	func1()
{
	static	int	angle;

	angle += 10;	//	angle は度だが、1単位でなく10単位でないとほとんど動かない(?)
	if( angle >= 36000 )
		angle = 0;

	Matrix3X1	temp[3];
	temp[0] = rotate2D( obj[0], DegreesToRads(angle) );
	temp[1] = rotate2D( obj[1], DegreesToRads(angle) );
	temp[2] = rotate2D( obj[2], DegreesToRads(angle) );

	DrawLine( temp[0].index[0], temp[0].index[1], temp[1].index[0], temp[1].index[1], GetColor(255,255,255) );
	DrawLine( temp[1].index[0], temp[1].index[1], temp[2].index[0], temp[2].index[1], GetColor(255,255,255) );
	DrawLine( temp[2].index[0], temp[2].index[1], temp[0].index[0], temp[0].index[1], GetColor(255,255,255) );

	DrawFormatString( 100, 0, GetColor(255,0,0), "angle:%d", angle );

	DrawFormatString( temp[0].index[0], temp[0].index[1], GetColor(255,255,255), "(%d,%d)", (int)temp[0].index[0], (int)temp[0].index[1] );

//	DrawLine( 320, 240, 320+x, 240-y, GetColor(255,255,255) );
//	DrawLine( 320, 240, 320+x, 240+y, GetColor(255,255,255) );
}

アバター
lriki
記事: 88
登録日時: 9年前

Re: どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

#4

投稿記事 by lriki » 9年前

軽く読ませていただいた程度ですが、気になった点を3つほど書かせていただきます。

●1つめ…

func1()の

rotate2D( obj[0], DegreesToRads(angle) );

で角度をラジアンに変換してから rotate2D() に渡していますが、
rotate2D() の中でさらに theta をラジアンに変換しています。

これはなにか特別な意図があるのでしょうか?

●2つめ…

86 行目の

temp.index[0][1] = -1 * (sin(DegreesToRads(theta)));

の部分は、

temp.index[0][1] = -1.0f * (sin(DegreesToRads(theta)));

にしないと小数点以下が切り捨てられてしまいます。


●3つめ…

#define RadsToDegrees(radian) ((radian)*(180.0f/M_PI))



#define RadsToDegrees(radian) (((float)radian)*(180.0f/M_PI))

にしておいた方が無難だと思います・・・。( #define DegreesToRads も )

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

#5

投稿記事 by dic » 9年前

>>梨樹さん
ご指摘にあったことをもとに改善してみましたところ

1つめの
角度をラジアンに変換してから、またラジアンから角度に変換しているところを
修正してみたらうまく動作しました

2つめの
-1 から -1.0f に書き換えるところですが、-1 でも大丈夫でした
ですが、-1.0f に書き換えます

3つめの
マクロをカッコでくくるところですが、これも問題なかったですが
念のため付け加えておきます

無事、期待していたとおりの動きが実現できました
なかなか気づきにくいところで、大変たすかりました

box
記事: 1746
登録日時: 9年前

Re: どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

#6

投稿記事 by box » 9年前

すでに解決済みですが、梨樹さんが勘違いされているようなので…。
梨樹 さんが書きました: temp.index[0][1] = -1.0f * (sin(DegreesToRads(theta)));
にしないと小数点以下が切り捨てられてしまいます。
そんなことは決してありません。
int型の-1とdouble型のsin(何とか)を掛け算する際、int型の-1を自動的にdouble型に格上げします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
lriki
記事: 88
登録日時: 9年前

Re: どうにも値の変動が大きすぎる  元:コンパイルエラー c2676 (VC++6.0)

#7

投稿記事 by lriki » 9年前

すみません。他の言語と混同して考えてました・・・。

box さん、勉強になりました。ありがとうございます。

閉鎖

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