2015-04-06 76 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的返回值並聲明指針顏色。 謝謝你的迴應,我很感激。 –