2013-12-17 40 views
1

有沒有辦法做這樣的事情:?發送號碼/字符/字符串到void *功能

void set(void* data, void *value, t_flags type) 
{ 
    if (type & INT) 
     *(int*)data = *(int*)value; 
    if (type & UINT) 
    (...) 
} 

int i; 
set(&i, 42, INT); 

我的設置功能的作品,但我不知道如何與數字調用它,字符「」,或字符串「」。

編輯:我忘記了最後一個參數,但問題來自42參數。

+2

你只傳遞了兩個參數給你的函數'set'。 – haccks

+1

嘗試'int i = 42;'。 –

+2

雖然你的實現沒有什麼概念錯誤,但你只是複製了一個不太強大的'memcpy' - 我推薦你使用它。 '#define set(data,value)memcpy(data,value,sizeof(value))' –

回答

3

有幾件事。首先,由於您對value使用void*(這是適當的),所以您需要傳遞void*作爲第二個參數,而不是常量。這將工作複製一個變量到下一個,但有更有效的方法。

其次,請注意,爲傳遞字符串,您需要將指針傳遞給char指針,並且char *將由函數設置。 (這取決於你是否是「軟拷貝」或「硬拷貝」 - 即指針是指向內存中的相同位置還是指向同一個字符串的另一個副本。你說你已經執行了set,所以我猜測你已經擁有你想要的方式。

您還沒有列入您的t_flags枚舉,所以我猜適當的值。

char c = 'c'; 
char* str = "str"; 
int i = 42; 
char c2; 
char* str2; 
char i2; 

set(&c2, &c, CHAR); /* presumably you have a CHAR flag? */ 
set(&str2, &str, CHARPTR); /* presumably you have a CHARPTR flag? */ 
set(&i2, &i, INT); 

對我來說,更大的問題是,你爲什麼會想這樣做,尤其是因爲在你的國旗你已經需要知道這種類型,它更乾淨(並有更好的類型檢查),只需做:

c2 = c; 
str2 = str; 
i2 = i; 

我假設這只是爲了瞭解功能,或者是爲了解決複雜問題而大量簡化。無論哪種方式,你就是這麼做的。

+0

+1:關於需要從地址傳遞值,而不是直接按值傳遞的優點。 –

+0

我試圖reprotucte從C++的向量,唯一的辦法,我發現不寫一個函數每種類型是void *。我希望C有一個技巧來做我想做的事情,但似乎我需要使用temp變量。 – mantal

+1

在C++中,生活更簡單,因爲你有模板。這可能 - 但不可能,你可以使用宏來做同樣的事情。你是否搜索過「c矢量」?我看到至少有兩個點擊彈出,可能對您有用 - 要麼學習或使用(當然取決於任何許可限制):http://stackoverflow.com/questions/4694401/how-to- replicate-vector-in-c https://gist.github.com/EmilHernvall/953968(第二個確實使用了void指針,但看起來比你的示例更加開發) –

0

也許你想這樣的:

void set(void* data, void *value, t_flags type) 
{ 
    if (type & INT) 
     *(int*)data = *(int*)value; 
    if (type & UINT) 
     *(unsigned int*)data = *(unsigned int*)value; 
    if (type & STRING) 
     strcpy((char*)data, (char*)value); 
    ... 
} 

int i; 
char string[100] ; 
set(&i, 42, 1<<INT); 
set(string, "Hello world", 1<<STRING) ; 

但它的怪異呢。