2015-04-06 77 views
3

我面临的问题是我想制作一个单一结构或容器,它将包含许多使用c语言的变量。 下面你可以看到我试图使一个Color类型和一个函数更容易定义一个。将组变量转换为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的功能。对于为例:

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。对于为例:

int    main() 
{ 
    ColorPalette *color; 

    color = fulfill_color(); 
} 

功能的呼叫后,您可以键入..

color.Red.R(价值1)

color.Red.G(值0)

等。

..以达到你想要的值。

祝你好运!

+0

增加手动内存管理,让一切难以无故使用 –

+0

Hi Gangai。你有正确的想法,但你的'fulfill_color()'函数不会按照你的意图工作。看到这个问题:http://stackoverflow.com/questions/7754986/returning-pointer-from-a-function –

+0

嗨embedded_guy! 这只是一个错误,但是,您必须允许足够的内存空间并获取malloc的返回值并声明指针颜色。 谢谢你的回应,我很感激。 –