Имам някакъв чист C код в моя Objective-C проект. В един от API-тата, които използвам, мога да се регистрирам за обратно извикване с функция, която приема 32-битов целочислен параметър:
void Callback(Packet* packet, int32_t port);
Искам да мога да изпратя моето обратно повикване два 16-битови порта вместо един 32-битов порт. Естествено, бих могъл просто да използвам побитови операции, но бих предпочел нещо по-ясно.
Ето текущото ми решение с обединение:
typedef struct {
int16_t port1;
int16_t port2;
} MultiPortStruct;
typedef union {
int32_t port;
MultiPortStruct portStruct;
} MultiPortAdaptor;
В подателя:
void registerCallback(int16_t port1, int16_t port2) {
MultiPortAdaptor adaptor;
adaptor.portStruct.port1 = port1;
adaptor.portStruct.port2 = port2;
int32_t port = adaptor.port
RegisterAPICallback(&myCallback, port);
}
В обратното извикване:
void myCallback(Packet* packet, int32_t port) {
MultiPortAdaptor adaptor;
adaptor.port = port;
int16_t port1 = adaptor.portStruct.port1;
int16_t port2 = adaptor.portStruct.port2;
// do stuff
}
Правилен ли е този подход или има проблеми с него? (Например: трябва ли да нулирам обединенията на адаптерите? Добре ли е да имам достъп до различни членове на едно и също обединение?) Има ли по-прост начин?
АКТУАЛИЗАЦИЯ:
Добре, убеден съм: дори това да е възможно, вероятно не е добра идея. Реших просто да използвам набор от функции, за да извършвам побитовите операции вместо мен:
int32_t SubPortsToPort(int16_t port1, int16_t port2)
int16_t PortToSubPort1(int32_t port)
int16_t PortToSubPort2(int32_t port)
Сега всичко, което трябва да направя, е следното:
void registerCallback(int16_t port1, int16_t port2) {
int32_t port = SubPortsToPort(port1, port2);
RegisterAPICallback(&myCallback, port);
}
И в обратното извикване:
void myCallback(Packet* packet, int32_t port) {
int16_t port1 = PortToSubPort1(port);
int16_t port2 = PortToSubPort2(port);
// do stuff
}
По-малко код, по-малко грижи!
c
е най-подходящ тук. - person Archagon   schedule 09.08.2015recipient->(packet, adaptor.port);
е незаконно в C - person M.M   schedule 09.08.2015