電子書籍の厳選無料作品が豊富!

行列の掛け算をする関数で
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から配列の大きさをわかるにはどうしたらいいですか?

A 回答 (4件)

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 );

ご参考まで。
    • good
    • 0

配列サイズを引数で渡すしか方法はないです。



多次元配列への動的なキャストを記述できるコンパイラであれば、
以下のサンプルの「#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;
}
    • good
    • 0

普通は行列のための構造体を作るんじゃないかなぁ?


struct Matrix {
double **elements;
size_t row;
size_t col;
};
って感じ.
    • good
    • 0

> *aから配列の大きさをわかるにはどうしたらいいですか?


その場合aから、aが示す先にある配列の大きさを知ることはできません。
aはint型へのポインタでしかなく、aが指しているのが配列の1要素なのか単独のint型変数なのかも分かりません。

配列の大きさが必要であれば、
配列の大きさを受け渡しする処理を書く必要があります。
(main関数の第1引数のargcみたいに)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!