السلام عليكم ورحمة الله وبركاته.

من أول ما بدأتُ أهتم بهذه اللغة وأنا أجد ألف طريقة وطريقة للقيام بأي شيء، ولا أعرف أيهم الشائع والأفضل، على العموم إن كان لدي لونٌ RGBA مكونًا من 32Bit أي طريقة أفضل لحفظه؟ على أن تكون شائعة عند مبرمجي C، ويمكن الحصول على قيمة تلك الأرقام في قيمة uint32.

وجدتُ حوالي ست طرق:

  1. Union الطريقة المثلى لا عمليات إضافية، لكن فقط تمثيل الألوان غير قابل للقرأءة.

  2. Struct طريقة مفهومة وواضحة، فقط مشكلة عمل الـCast عند الحصول عليها كقيمة uint32.

  3. Union بداخله struct طريقة رائعة لتمثيل الألوان، لكن ما مدى شيوعها وهل هي موافقة لأفضل الممارسات الـC؟

4 و5: مؤشر وحجز ذاكرة باستخدام malloc الفرق بين 5 و4 أن الأولى تمثل المؤشرات باستخدام مصفوفة والثانية بالمؤشر، قرأتُ أكثر من مرة أن المؤشرات تكون أسرع من المصفوفات في أكثر المجمعات، رغم أن الطريقتين غبيتان، إلا أني قرأتُ أكثر من مرة شخص يستخدمهما في C/C++.

6: حجز رقم والقيام بعملات Bitwise عليه، لا أعرف مدة سرعة هذه الطريقة، أراها مترددة بكثر في C وغيرها،

هذه شيفرة محاولة تطبيق مني، إن كان هنالك أي ملاحظات عليها:

#include <stdint.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h>

typedef union {
    unsigned char C[4];
    uint32_t color;
} COLOR_T;

typedef struct {
    unsigned char R;
    unsigned char G;
    unsigned char B;
    unsigned char A; 
} COLORS_T;

typedef union {
    COLORS_T C;
    uint32_t color;
} COLORUS_T;

int main() {
    // الطريقة الأولى
    COLOR_T *ucolor = malloc(sizeof (COLOR_T*));

    ucolor->C[0] = 57; // r
    ucolor->C[1] = 200; // g
    ucolor->C[2] = 182; // b
    ucolor->C[3] = 14; // a
    printf("rgba(%u, %u, %u, %u) COLOR=%"PRIu32"\n",
        ucolor->C[0],
        ucolor->C[1],
        ucolor->C[2],
        ucolor->C[3], ucolor->color);
    free(ucolor);

    // الطريقة الثانية        
    COLORS_T *scolor = malloc(sizeof (COLORS_T*));

    scolor->R = 57;
    scolor->G = 200;
    scolor->B = 182;
    scolor->A = 14;

    printf("rgba(%u, %u, %u, %u) COLOR=%"PRIu32"\n",
        scolor->R,
        scolor->G,
        scolor->B,
        scolor->A, *(uint32_t*)(scolor));
    free(scolor);

    // الطريقة الثالثة
    COLORUS_T *sucolor = malloc(sizeof (COLORUS_T*));

    sucolor->C.R = 57;
    sucolor->C.G = 200;
    sucolor->C.B = 182;
    sucolor->C.A = 14;

    printf("rgba(%u, %u, %u, %u) COLOR=%"PRIu32"\n",
        sucolor->C.R,
        sucolor->C.G,
        sucolor->C.B,
        sucolor->C.A, sucolor->color);
    free(sucolor);

    // الطريقة الرابعة
    unsigned char *pcolor = malloc(sizeof (char*) * 4);

    pcolor[0] = 57;
    pcolor[1] = 200;
    pcolor[2] = 182;
    pcolor[3] = 14;

    printf("rgba(%u, %u, %u, %u) COLOR=%"PRIu32"\n",
        pcolor[0],
        pcolor[1],
        pcolor[2],
        pcolor[3], *(uint32_t*)(pcolor));
    free(pcolor);

    // الطريقة الخامسة
    unsigned char *pcolor2 = malloc(sizeof (char*) * 4);

    *pcolor2 = 57;
    *(pcolor2+1) = 200;
    *(pcolor2+2) = 182;
    *(pcolor2+3) = 14;

    printf("rgba(%u, %u, %u, %u) COLOR=%"PRIu32"\n",
        *pcolor,
        *(pcolor+1),
        *(pcolor2+2),
        *(pcolor2+3), *(uint32_t*)(pcolor2));
    free(pcolor2);

    // الطريقة السادسة
    uint32_t uintcolor = 0;

    uintcolor |= 57; // r
    uintcolor |= (200 << 8); // g
    uintcolor |= (182 << 16); // b
    uintcolor |= (14 << 24); // a

    printf("rgba(%u, %u, %u, %u) COLOR=%"PRIu32"\n",
        uintcolor & 255,
        uintcolor >> 8 & 255,
        uintcolor >> 16 & 255,
        uintcolor >> 24 & 255, uintcolor);
}