C 2 D配列を戻り値とする方法

1361 ワード

大きな作業では、サブ関数に2次元配列を申請し、メイン関数では2次元配列のデータを使用しますが、メイン関数では事前に申請することはできません(配列の長さが分からないので)、配列returnを取得する必要があります.
サブ関数:
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次元配列を定義することができる.