2013-10-01 57 views
0

我有一個函數返回doublevoid *。但是,它似乎鬆了指針或似乎無法獲得該值,因爲它返回0一次的功能。在void中存儲雙精度*

你將如何創建一個double並將它賦值爲void *的值,然後在不超出範圍的情況下將其返回。

此功能的想法是將一個對象轉換的Objective-C的東西在C++,但在C++中不是所有的東西都是對象,如雙,它是客觀C.

void * IDToSTD (id anObject){ 

void * stdObject = NULL; 

if ([anObject class] == [PFObject class]) { 
    stdObject = BridgePFObject((void *)CFBridgingRetain(anObject)); 
    return stdObject; 
} 

CFTypeRef inTypeRef = (__bridge CFTypeRef)anObject; 
CFTypeID type = CFGetTypeID(inTypeRef); 

if (type == CFArrayGetTypeID()) { 
    std::vector<void *> arr = NSArrayToSTDVector([(NSArray *)anObject copy]); 
    stdObject = &arr; 
} else if (type == CFDictionaryGetTypeID()) { 
    std::map<std::string, void *> dict = NSDictionaryToSTDMap([(NSDictionary *)anObject copy]); 
    stdObject = &dict; 
} else if (type == CFStringGetTypeID()) { 
    stdObject = (char *)[(NSString *) anObject cStringUsingEncoding:NSUTF8StringEncoding]; 
} else if (type == CFNumberGetTypeID()) { 
    double *value = (double *)malloc(sizeof(double *)); 
    *value = [(NSNumber *)anObject doubleValue]; 
    stdObject = value; 
} else { 
    [NSException raise:@"Invalid object value" format:@"Object must be of basic Core Foundation or Parse Type, Object Type is: %@", NSStringFromClass([anObject class])]; 
} 

return stdObject; 

}

+4

爲什麼不只是返回一個'double'? –

+0

是否將堆的值存儲在堆或棧上? (使用'new'操作符還是不行?) – Matthew

+0

你能顯示代碼嗎?你正在編譯64位或32位?這聽起來像嘗試做生意的可怕方式。這聽起來好像你可能會嘗試:'void * vp;雙d = 3.14159; *(double *)&vp = d;'或者同樣野蠻的東西。 –

回答

1

我假設通過在void指針中加一個double,實際上意味着:獲取double的地址,然後將該雙指針指向void指針。

將double直接賦值給指針肯定給32位應用程序帶來了問題(double = 8字節,指針= 4字節)。

你可以做的是在你的函數中聲明一個雙變量爲靜態的。然後返回一個指向該靜態雙變量的指針。但是,只要其他人(其他線程?)將調用該函數,靜態double將被覆蓋,第一個調用者將失去該值。

線程問題可以通過使用線程本地存儲來解決。在Visual Studio中,您可以使用「declspec(thread)」來創建靜態變量static-per-thread。但是如果你不能保證同一個線程在第一個沒有從void-pointer中獲取double值的時候調用相同的函數,這仍然不能解決問題。

您可以考慮將雙引用作爲參數傳遞給該函數,然後將void指針返回給定引用。這樣,調用者提供了自己的雙變量,該函數然後填充並返回一個指針。