- 締切済み
引数になっている二次元配列の大きさを知る
行列の掛け算をする関数で Matrix(int a[2][2], int b[2][2], int result[2][2]) のようにすると[3][3]用、[4][4]用、・・・と似たようなプログラムをいっぱい作る羽目になる。 Matrix(int *a, int *b, int *result) のようにすると*aから配列の大きさがわかれば その大きさ/4の平方根をとってnとでればn×n行列とわかって解決と考えましたが、*aから配列の大きさをわかるにはどうしたらいいですか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ency
- ベストアンサー率39% (93/238)
C 前提なら、別々に関数を用意するしかないと思います。 # int, double 等のように型が違う場合も同じですよね。 C++ でも大丈夫なのであれば、Matrix() をテンプレート関数とすることで、一つにまとめることができます。 # N×N の正方マトリックスを想定しています。 ======================================================== template<typename T> void Matrix( T a, T b, T result, int dim ) { int i, j; // a[i][j], b[i][j], result[i][j] のように使用できます // また、dim は配列の次元です。 } ======================================================== あとは、以下のように普通に使うことができます。 /* a, b, result が 2×2 の場合 */ Matrix( a, b, result, 2 ); /* a, b, result が 3×3 の場合 */ Matrix( a, b, result, 3 ); ご参考まで。
- z64423
- ベストアンサー率53% (26/49)
配列サイズを引数で渡すしか方法はないです。 多次元配列への動的なキャストを記述できるコンパイラであれば、 以下のサンプルの「#else」部分のように書くことができますが、 VC++ では不可でした。 # こういう記述が C/C++ 言語仕様として正しいかどうかは知りません。 移植性を考慮する必要があれば、1次元配列として処理したほうがいいでしょう。 (以下のサンプルの「#if 0」部分) //#include "stdafx.h" #include <stdio.h> int calc(const int a[], const int b[], int d2, int d1) { int sum = 0; int i, j; #if 0 // VC++ for (i = 0; i < d2; i++) { for (j = 0; j < d1; j++) { sum += a[i*d1 + j] + b[i*d1 + j]; } } #else // GCC, other, ... int (*a2)[d1] = (int (*)[d1])a; int (*b2)[d1] = (int (*)[d1])b; for (i = 0; i < d2; i++) { for (j = 0; j < d1; j++) { sum += a2[i][j] + b2[i][j]; } } #endif return sum; } //int _tmain(int argc, _TCHAR* argv[]) int main(void) { const int d2 = 20; const int d1 = 10; int a[d2][d1], b[d2][d1]; int i, j; for (i = 0; i < d2; i++) { for (j = 0; j < d1; j++) { a[i][j] = 200; b[i][j] = 100; } } printf("sum = %d\n", calc(&a[0][0], &b[0][0], d2, d1)); return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
普通は行列のための構造体を作るんじゃないかなぁ? struct Matrix { double **elements; size_t row; size_t col; }; って感じ.
- Werner
- ベストアンサー率53% (395/735)
> *aから配列の大きさをわかるにはどうしたらいいですか? その場合aから、aが示す先にある配列の大きさを知ることはできません。 aはint型へのポインタでしかなく、aが指しているのが配列の1要素なのか単独のint型変数なのかも分かりません。 配列の大きさが必要であれば、 配列の大きさを受け渡しする処理を書く必要があります。 (main関数の第1引数のargcみたいに)