یک روش خوب هم اینه که آدرس آرایه ای رو بدید به تابع تا نتیجه رو روی اون اعمال کنه. مثال:
int * MatrixAdd(
int * pOut,
const int * pM1,
const int * pM2,
const int Width,
const int Height)
{
int index;
for (int j = 0; j < Height; j++)
{
for (int i = 0; i < Width; i++)
{
index = j * Width + i;
pOut[index] = pM1[index] + pM2[index];
};
};
return pOut;
};
و برای استفاده:
int M1[4][3]; // init...
int M2[4][3]; // init...
int M3[4][3];
MatrixAdd(&M3[0][0], &M1[0][0], &M2[0][0], 3, 4);
و اگر برنامتون طوری هست که اشاره گر ها ممکنه آدرس های مشترکی رو بفرستن بهتره ازین روش استفاده کنید که خروجی مطمئن باشه:
int * MatrixAdd(
int * pOut,
const int * pM1,
const int * pM2,
const int Width,
const int Height)
{
size_t size_of_block = sizeof(int) * Height * Width;
int * mat = (int *)malloc(size_of_block);
int index;
for (int j = 0; j < Height; j++)
{
for (int i = 0; i < Width; i++)
{
index = j * Width + i;
mat[index] = pM1[index] + pM2[index];
};
};
memcpy(pOut, mat, size_of_block);
free(mat);
return pOut;
};
حالا میتونیم نتیجه رو مستقیما تو یکی از دو ماتریسی که داریم جمع میکنیم بریزیم:
int M1[4][3]; // init...
int M2[4][3]; // init...
MatrixAdd(&M1[0][0], &M1[0][0], &M2[0][0], 3, 4);