Литье одной структуры С в другую

У меня две идентичные (но по-разному названные) структуры C:

typedef struct { double x; double y; double z; } CMAcceleration; typedef struct { double x; double y; double z; } Vector3d; 

Теперь я хочу назначить переменную CMAcceleration переменной Vector3d (копирование всей структуры). Как я могу это сделать?

Я попробовал следующее, но получил следующие compiler errors:

 vector = acceleration; // "incompatible type" vector = (Vector3d)acceleration; // "conversion to non-scalar type requested" 

Конечно, я могу прибегнуть к тому, чтобы установить всех членов по отдельности:

 vector.x = acceleration.x; vector.y = acceleration.y; vector.z = acceleration.z; 

но это кажется довольно неудобным.

Какое лучшее решение?

Это ваше единственное решение (кроме того, что оно обернуто в функцию):

 vector.x = acceleration.x; vector.y = acceleration.y; vector.z = acceleration.z; 

Вы могли бы фактически бросить его, как это (с помощью указателей)

 Vector3d *vector = (Vector3d*) &acceleration; 

но это не в спецификациях, и поэтому поведение зависит от компилятора, времени исполнения и большого зеленого космического монстра.

Вы можете использовать указатель, чтобы сделать typecast;

 vector = *((Vector3d *) &acceleration); 

Для этого используется функция утилиты:

 void AccelerationToVector( struct CMAcceleration* from, struct Vector3d* to ) { to->x = from->x; to->y = from ->y; to->z = from->z; } 

Почему ты не пользуешься.

 typedef CMAcceleration Vector3d; 

(вместо создания совершенно новой структуры)

в этом случае vector = acceleration; компилируется просто отлично.

memcpy(&vector, &acceleration, sizeof(Vector3d));

Обратите внимание, что это работает только в том случае, если физическое расположение структур в памяти идентично. Однако, как отметил @Oli, компилятор не обязан это гарантировать!

Безопасным (хотя и несколько запутанным) способом сделать это было бы использование союза:

 union { CMAcceleration a, Vector3d v } tmp = { .a = acceleration }; vector = tmp.v; 

Значения переинтерпретируются (начиная с C99), когда ansible элемент не является последним установленным. В этом случае мы устанавливаем ускорение, а затем мы обращаемся к вектору, поэтому ускорение переинтерпретируется.

Например, реализована функция NSRectToCGRect .

Это достигается легко через объединение :

 typedef struct { double x; double y; double z; } CMAcceleration; typedef struct { double x; double y; double z; } Vector3d; typedef union { CMAcceleration acceleration; Vector3d vector; } view; int main() { view v = (view) (Vector3d) {1.0, 2.0, 3.0}; CMAcceleration accel = v.acceleration; printf("proof: %g %g %g\n", accel.x, accel.y, accel.z); } 
  • Нечитаемая только альтернатива анонимным типам
  • Не уникальные значения enums
  • Невозможно изменить ошибку возвращаемого значения c #
  • Как скомпилировать C-код с анонимными структурами / объединениями?
  • Почему C имеет различие между -> и.?
  • Каковы различия между структурой и classом в C ++?
  • самореферентное определение структуры?
  • Почему «typdef struct {struct S * s; } S; ", содержащий указатель на компиляцию того же типа?
  • Структура массивов по сравнению с массивом структур в CUDA
  • Почему GCC не оптимизирует структуры?
  • Как работает встроенная реализация ValueType.GetHashCode?
  • Давайте будем гением компьютера.