C 2 D配列を戻り値とする方法
1361 ワード
大きな作業では、サブ関数に2次元配列を申請し、メイン関数では2次元配列のデータを使用しますが、メイン関数では事前に申請することはできません(配列の長さが分からないので)、配列returnを取得する必要があります.
サブ関数:
2、主関数の中で計算しなければ配列の長さを知ることができ、直接静的に2次元配列を定義することができる.
サブ関数:
float ** SURFCompare(Mat srcImage1, Mat srcImage2)// float **
{
...
float **point;//
point = (float**)malloc(sizeof(float) * viewMatches.size());// ,
for (int i = 0; i < viewMatches.size(); i++)//viewmatch.size
{
point[i] = (float *)malloc(sizeof(float) * 4);//4
}
for (int i = 0; i < viewMatches.size(); i++)// point,
{
index1 = viewMatches.at(i).queryIdx;
index2 = viewMatches.at(i).trainIdx;
point[i][0] = keyPoints1.at(index1).pt.x;//u1
point[i][1] = keyPoints1.at(index1).pt.y;//v1
point[i][2] = keyPoints2.at(index2).pt.x;//u2
point[i][3] = keyPoints2.at(index2).pt.y;//v2
}
return point;//
}
メイン関数で呼び出されます.int main()
{
...
// surf ,
float **matchpoint = SURFCompare(srcImage1, srcImage2);//
// ,
solveab(matchpoint, pointnum, M1, M2);// , ,
for (int i = 0; i < pointnum; i++)// matchpoint,pointnum
free(matchpoint[i]);
free(matchpoint);
}
注意:1、主関数で配列の長さを計算できる場合、主関数でmallocが動的に配列を申請し、サブ関数を呼び出して配列の値を変更することができる.2、主関数の中で計算しなければ配列の長さを知ることができ、直接静的に2次元配列を定義することができる.