मैं सी पुस्तकालय को डेल्फी में परिवर्तित कर रहा हूं। मुझे नीचे दिए गए कोड को परिवर्तित करने में समस्या है। यह संचार के लिए उपयोग की जाने वाली संरचना है, इसलिए आदेश सही होना चाहिए।

डेल्फी

Tparam_union_params_t = packed record
  case Integer of
    0: (param_float:single);
    1: (param_int32:Int32);
    2: (param_uint32:UInt32);
    ...
    ...
end;

Tparam_union_t = packed record
  param:Tparam_union_params_t // This method requires var name.
  type:UInt8;
end;

सी लैंग

#ifdef __GNUC__
  #define PACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
#else
  #define PACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
#endif

PACKED(
typedef struct param_union {
    union {
        float param_float;
        int32_t param_int32;
        uint32_t param_uint32;
        int16_t param_int16;
        uint16_t param_uint16;
        int8_t param_int8;
        uint8_t param_uint8;
        uint8_t bytes[4];
    }; // This no-named union. no-named is important.
    uint8_t type;
}) param_union_t;

मेरी विधि को वर नाम की आवश्यकता है लेकिन मूल सी कोड का कोई नाम नहीं है। मैं अज्ञात संघ या संरचना को सी से डेल्फी में कैसे परिवर्तित करूं?

3
Seunghyun Baek 10 फरवरी 2019, 07:20

1 उत्तर

सबसे बढ़िया उत्तर

आपके पास जो है वह बुरा नहीं है, लेकिन मेरे लेख रूपांतरण के नुकसान में मैं वर्णन करता हूं बिना नाम के ऐसे संघ को संभालने के लिए थोड़ी अच्छी तकनीक:

param_union_p = ^param_union_t;
param_union_t = packed record
  case Integer of
    0: (param_float: Single);
    1: (param_int32: Int32);
    2: (param_uint32: UInt32;    // add the members after the union to the largest branch.
        &type: UInt8);
    3: (param_int16: Int16);
    ...
    ...
end;
PParamUnion = ^TParamUnion;
TParamUnion = param_union_t;

UInt32 शाखा के बजाय इसे उसी आकार की Single या Int32 शाखा में भी जोड़ा जा सकता है। यह अभी भी सी में संरचना के समान मेमोरी लेआउट में परिणाम देगा, &type ऑफ़सेट 4 पर, और रिकॉर्ड का आकार 5 होगा, और यह सब मायने रखता है। स्पष्टीकरण के लिए आलेख में आरेख पर एक नज़र डालें:

enter image description here

इस तरह, संघ के हिस्से को अपना प्रकार और अपना नाम देने की कोई आवश्यकता नहीं है। अगर आपको "ट्रिक" पर भरोसा नहीं है, तो उसी लेख में मेरे द्वारा दिए गए कोड का उपयोग करें। सी और डेल्फी में ऑफसेट की जांच करने के लिए।

Borland और Embarcadero, और Delphi-JEDI, अनाम यूनियनों का अनुवाद करने के लिए (डी) एक ही चाल का उपयोग करते हैं, और डेल्फी TVarRec (array of const पैरामीटर के लिए) और TVarType (वेरिएंट के लिए) रिकॉर्ड वैसे भी बनाए गए हैं।

6
Rudy Velthuis 10 फरवरी 2019, 20:26