2015-04-06 1 views
3

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу создать единую структуру или контейнер , который будет содержать много переменных с использованием языка c. Ниже вы можете видеть, что я попытался сделать тип цвета и функцию, чтобы определить еще одно легко.Групповые переменные в структуру или контейнер в C

// Color Type For reuse 
typedef struct Color 
{ 
    GLfloat R; 
    GLfloat G; 
    GLfloat B; 
    GLfloat A; 
} Color; 
// Color Setter to Make using the Color Type Easier 
Color DefineColor (GLfloat R,GLfloat G,GLfloat B,GLfloat A) 
{ 
    Color NewColor; // Combine GLfloat parameters into a Color Type 
    NewColor.R = R; 
    NewColor.G = G; 
    NewColor.B = B; 
    NewColor.A = A; 

    return NewColor; 
} 

То, что я пытаюсь получить на это что-то вроде этого

typedef struct ColorPalette 
{ 
    Color Red = DefineColor(1,0,0,1); 
    Color Green = DefineColor(0,1,0,1); 
    Color Blue = DefineColor(0,0,1,1); 
    Color Violet = DefineColor(1,0,0.5,1); 
    // ... ect more colors and more colors 
} ColorPalette; 

Так что он может быть использован как таковой.

ColorPalette.Red; 

или как этот

Object.attribute.color = ColorPalette.Violet; 
Object.Color.ColorPalette.Red; 

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

+1

1) потерять модификатор typedef. 2) каждая запись цвета во время первоначального объявления экземпляра структуры может быть установлена ​​через: struct ColorPalette myColorPalette = {{1,0,0,1}, {0,1,0,1}, ...} ; – user3629249

+0

Что вы думаете? Вы уже показали код, который, кажется, делает то, что вы пытаетесь сделать. –

ответ

2

Я бы об этом, как это -

#include <stdio.h> 

typedef struct 
{ 
    GLfloat R; 
    GLfloat G; 
    GLfloat B; 
    GLfloat A; 
} Color; 

typedef struct 
{ 
    Color Red; 
    Color Green; 
    Color Blue; 
    Color Violet; 
} Palette; 

Palette ColorPalette = 
{ 
    /* red */ 
    { 
     1, 0, 0, 1 
    }, 
    /* green */ 
    { 
     0, 1, 0, 1 
    }, 
    /* blue */ 
    { 
     0, 0, 1, 1 
    }, 
    /* violet */ 
    { 
     1, 0, 0.5, 1 
    } 
}; 

Это даст вам переменную ColorPalette, которая содержит все ваши цвета.

+0

это, кажется, работает просто отлично, спасибо, возможно, есть более простой способ сериализации всех цветов? Возможно, используя цикл для генерации их –

+0

Конечно! Все зависит от того, чего вы пытаетесь достичь. Вы хотите назначать значения для каждого цвета в исходном коде, чтобы они были определены во время компиляции (возможно, даже при сохранении констант данных), или у вас есть функция, которую вы можете вызвать для инициализации каждого элемента (или пользователь может использовать для инициализации значений)? Вы можете пойти совершенно другим путем и динамически распределять память, чтобы добавлять или удалять цвета из «ColorPalette» - возможно, через связанный список. Все зависит от того, чего вы пытаетесь достичь. –

+0

Я полагаю, это зависит от количества цветов, я имею в виду, что не нужны все цвета, возьмите css, например, их предопределенные цвета слов. Все, что я действительно хочу сделать, это сделать полезный инструмент для работы с шейдерами, ui, материалами, а что нет, но, полагаю, с точки зрения сериализации может работать неорганизованный контейнер, такой как вектор C++, и позволять пользователям определять свои собственные цвета и добавить или удалить их. –

1

Вы не можете напрямую использовать свою переменную при определении своей структуры. Попробуйте так:

typedef struct ColorPalette 
{ 
    Color Red; 
    Color Green; 
    Color Blue; 
    Color Violet; 
    // ... ect more colors and more colors                                      
} ColorPalette; 

И потом, вы должны создать функцию, которая будет хранить все значения на переменном, которые находятся на вашу структуру ColorPalette. Для Exemple:

ColorPalette *fulfill_color(void) 
{ 
    ColorPalette *color; 

    if ((color = malloc(sizeof(ColorPalette))) == NULL) 
     return (NULL); 
    color->Red = DefineColor(1,0,0,1); 
    color->Green = DefineColor(0,1,0,1); 
    color->Blue = DefineColor(0,0,1,1); 
    color->Violet = DefineColor(1,0,0,1); 
    return (color); 
} 

И, кажется очевидным, но вы можете вызвать функцию fulfill_color(), чтобы сохранить все цвета на переменную с типом ColorPalette. Для Exemple:

int    main() 
{ 
    ColorPalette *color; 

    color = fulfill_color(); 
} 

После вызова функции можно ввести ..

color.Red.R (значение 1)

color.Red.G (значение 0)

и т.д ..

.. для достижения желаемых значений.

Удачи вам!

+0

добавление ручного управления памятью к этому делает все труднее использовать без причины –

+0

Привет, Гангай. У вас есть правильная идея, но ваша функция 'execute_color()' не будет работать так, как вы планировали. См. Этот вопрос: http://stackoverflow.com/questions/7754986/returning-pointer-from-a-функция –

+0

Привет, embedded_guy! Это просто ошибка, но да, вы должны разрешить достаточное пространство памяти и получить возвращаемое значение malloc с объявленным цветом указателя. Спасибо за ваш отзыв, я ценю. –

 Смежные вопросы

  • Нет связанных вопросов^_^