Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用数组初始化struct?_C++_Arrays_Pointers_Struct_Initialization - Fatal编程技术网

C++ 如何用数组初始化struct?

C++ 如何用数组初始化struct?,c++,arrays,pointers,struct,initialization,C++,Arrays,Pointers,Struct,Initialization,使用数组初始化结构是否有比执行以下操作更好的方法 struct Parameters { double distance; double radius; double strength; long distanceX; long distanceY; long clickX; long clickY; }; void calculate(double dParameters[], long lParameters[]) { Par

使用数组初始化结构是否有比执行以下操作更好的方法

struct Parameters
{
    double distance;
    double radius;
    double strength;
    long distanceX;
    long distanceY;
    long clickX;
    long clickY;
};

void calculate(double dParameters[], long lParameters[])
{
    Parameters param = 
    {
        dParameters[0], 
        dParameters[1],
        dParameters[2],

        lParameters[0],
        lParameters[1],
        lParameters[2],
        lParameters[3]
    };
}
我想分配指针:

void calculate(double dParameters[], long lParameters[])
{
    Parameters param;
    (double*)(&param.distance) = &dParameters[0];
    (long*)(&param.distanceX) = &lParameters[0];
}

但是我不确定它是否在C++中是有效的.< /p> 你的第二个例子是非法的,但是很可能优化器(知道实际的布局)确实实现了它。

如果你知道结构的布局,并且仔细地选择将所有类型的成员放在它们之间而没有任何东西,那么你可以使用<代码> MycPy.()

这是一段相当脆弱的代码,因为
distance
必须是一行中正好四个双参数中的第一个双参数,否则您将得到损坏的数据,并且在编译时不会验证这一点

可以使用offset of对其进行改进,以获取和/或验证长度。例如:

void calculate(double dParameters[], size_t n_dParameters, long lParameters[], size_t n_lParameters)
{
    Parameters param;

    assert(offsetof(Parameters, strength) - offsetof(Parameters, distance) == sizeof(*dParameters) * n_dParameters);
    memcpy(&param.distance, dParameters, offsetof(Parameters, strength) - offsetof(Parameters, distance));
    assert(offsetof(Parameters, clickY) - offsetof(Parameters, distanceX) == sizeof(*lParameters) * n_lParameters);
    memcpy(&param.distanceX, dParameters, offsetof(Parameters, clickY) - offsetof(Parameters, distanceX));
}
从历史上看,gcc在优化结构初始化方面并不擅长,例如在可能且有益的情况下使用等价的
memcpy()
memset()
。如果您的结构有100个字段,这实际上可能很有用

另一种技术是使用联合定义结构的数组版本和单个字段版本

struct ParametersArrays {
   double doubles[3];
   long longs[4];
};
union ParametersUnion {
   struct Parameters params;
   struct ParametersArrays arrays;
};
ParametersUnion u;
memcpy(u.arrays.doubles, dParameters, sizeof(u.arrays.doubles));
memcpy(u.arrays.longs, lParameters, sizeof(u.arrays.longs));
Parameters& p = u.params; // Now you can use p

注意,使用这样的一个以上成员的成员在C++中不是严格合法的,但它是在C中,并且大多数/所有C++编译器都会按预期编译它。

您有<代码>结构> <代码>。它包含您需要的所有值。因此,创建一个struct数组来保存所需的所有struct实例,并将struct数组(例如,指向数组中第一个struct的指针)作为参数传递,然后使用函数中的所有值处理该数组。
struct ParametersArrays {
   double doubles[3];
   long longs[4];
};
union ParametersUnion {
   struct Parameters params;
   struct ParametersArrays arrays;
};
ParametersUnion u;
memcpy(u.arrays.doubles, dParameters, sizeof(u.arrays.doubles));
memcpy(u.arrays.longs, lParameters, sizeof(u.arrays.longs));
Parameters& p = u.params; // Now you can use p