0

我有一个double在 a中返回 a 的函数void *。但是,它似乎松开了指针,或者似乎无法获取该值,因为它一旦退出函数就会返回 0。

您将如何创建一个 double 并将其分配为 void * 的值,然后在不超出范围的情况下返回它。

这个函数的想法是它将一个对象从 Objective-C 转换为 C++ 中的某个对象,但并非 C++ 中的所有内容都是一个对象,例如在 Objective C 中的 double。

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

1 回答 1

1

我假设通过在 void-pointer 中放置一个 double,实际上是指:获取 double 的地址,然后将该 double-pointer 分配给 void-pointer。

将双精度直接分配给指针肯定会给 32 位应用程序带来问题(双精度=8 字节,指针=4 字节)。

你可以做的是在你的函数中将一个双变量声明为静态的。然后返回指向该静态双精度变量的指针。但是,一旦其他人(其他线程?)调用该函数,静态双精度将被覆盖,第一个调用者将丢失该值。

线程问题可以通过使用线程本地存储来解决。在 Visual Studio 中,您可以使用“declspec(thread)”使静态变量为每线程静态。但是,如果您不能保证当第一个线程还没有从 void 指针中获取双精度值时,同一个线程将调用同一个函数,这仍然不能解决问题。

您可以考虑将双重引用作为参数传递给函数,然后返回一个指向给定引用的 void 指针。这样,调用者提供了自己的双变量,然后函数填充并返回一个指向的指针。

于 2013-10-01T14:50:59.367 回答