【问题标题】:Assigning double * to V[3]将双 * 分配给 V[3]
【发布时间】:2013-08-03 03:45:06
【问题描述】:

我有一个返回double *的函数

double* addVectors( double* vec1, double* vec2 ) 
{
    double vec[3];
    for( int i = 0; i < 3; i++ )
        vec[i] = vec1[i] + vec2[i];

    return vec;
}

如何将addVectors 的结果分配给数组?我做了以下,但我确信有一种专业的方法。

double A[3] = {1, 2, 3};
double B[3] = {4, 5, 6};
double C[3];

double *val = addVectors( A, B );
C[0] = val[0];
C[1] = val[1];
C[2] = val[2];

【问题讨论】:

    标签: c++ arrays pointers vector function-pointers


    【解决方案1】:

    addVectors返回一个指向本地数组的指针,当addVectors返回时val变成垃圾数据。

    您可以将第三个参数传递给addVectors,但您需要确保所有vec 至少有3 个元素:

    void addVectors( double* vec1, double* vec2, double* vec) 
    {
        for( int i = 0; i < 3; i++ )
            vec[i] = vec1[i] + vec2[i];
    }
    
    double A[3] = {1, 2, 3};
    double B[3] = {4, 5, 6};
    double C[3] = {};         // initialize all C elements to 0.0
    
    addVectors(A,B,C);
    

    我的建议是使用 STL 容器,如 std::vectorstd::list etc,或者如果启用了 C++11,则使用 st::array

    使用 STL 容器可以归档您的意图:

    std::vector<double> addVectors(const std::vector<double>& v1, 
                                   const std::vector<double>& v2)
    {
        std::vector<double> v;
    
        for( int i = 0; i < 3; i++ ) 
        {
            v.push_back(v1[i] + v2[i]);
        }
    
        return v;
    }
    
    
    int main()
    {
    
        std::vector<double> A = {1, 2, 3};
        std::vector<double> B = {4, 5, 6};
    
        std::vector<double> C(3, 0.0);
    
        std::vector<double> D = addVectors(addVectors(A,B),C);
    
        for(auto& e : D)
        {
            cout << e << endl;
        }
    }
    

    【讨论】:

    • 我定义函数返回double *的原因是我希望能够使用像addVectors(addVectors(A,B),C)这样的函数。
    • 那么你应该使用vector或std::array
    • 似乎array 会更合适,因为大小不会改变
    • @claptrap 这取决于他是否有 C++11!
    • 我使用了第一种方法void addVectors( double* vec1, double* vec2, double* vec),速度非常快。
    【解决方案2】:

    从函数返回数组的另一种方法是将其嵌入到结构中,因为这样内容将被复制:

    typedef struct
    {
      double vec[3];
    } vecret;
    
    
    vecret addVectors( double* vec1, double* vec2 ) 
    {
      vecret V;
      double vec[3];
      for( int i = 0; i < 3; i++ )
      {
          V.vec[i] = vec1[i] + vec2[i];
      }
      return V;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 2011-01-16
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      相关资源
      最近更新 更多