标签: void-pointers

这是否适用于void指针?

这个问题是关于在特定实现中使用void指针的适当性.

我有一个相对简单的程序,包含一个无限循环.在每个循环中,程序迭代固定范围的常量值并在每个值上调用一个函数.调用的特定函数可以是三个中的一个,并且在运行时由参数指定.在无限循环开始之前,有一个条件块,它根据提供的参数设置一个函数指针.这样,条件逻辑只需运行一次,而不是每次循环中的每次迭代运行.

我已经实现了它并且运行良好,但我希望在每次调用函数之间保持状态.我的建议是将状态存储在结构中,并在每个值上调用函数时传递该结构.问题是每个函数都需要一个不同的结构来存储其状态的不同值集,并且所有三个函数的原型必须兼容(对于函数指针).我打算通过在三个函数的原型中使用void指针来解决这个问题,从而保持兼容的原型,但允许我将不同的结构传递给每个函数.

问题是; 我的建议是否适当使用了void指针,或者它是否引入了太多的运行时动态,因此我应该重新考虑我的方法?

注意:不可能在三个函数中的每个函数中使用静态变量,因为结构也需要在无限循环中可用,因为在迭代值范围之前和之后还要进行一些处理.

c function-pointers void-pointers

2
推荐指数
1
解决办法
683
查看次数

在运行时向对象添加任意类型

在我们的应用程序中,我们有一个在运行时接收属性的对象 例如,要向对象添加浮点数:

my_object->f("volume") = 1.0f;
Run Code Online (Sandbox Code Playgroud)

检索卷的工作方式相同:

cout << my_object->f("volume") << endl;
Run Code Online (Sandbox Code Playgroud)

在内部,这由字符串映射到它们各自的类型.每种类型都有自己的访问方法和地图.它看起来像这样:

map<string, float> my_floats;
map<string, int> my_ints;
map<string, void *> my_void_pointers;
Run Code Online (Sandbox Code Playgroud)

哦,可怕的void *.有时我们需要向对象添加类或函数.我们没有为每种可能的类型设置单独的地图,而是选择了void *地图.我们遇到的问题是清理.目前,我们保留了void *指向这些"悬空"对象的每种类型的列表,并在必要时在这些单独的列表上调用清理函数.

我不喜欢必须使用void *它以及正确清理所需的所有额外注意力.有没有更好的方法在运行时在对象中存储任意类型,可以通过字符串映射访问,并仍然可以通过析构函数自动清理?

c++ pointers void-pointers

2
推荐指数
1
解决办法
280
查看次数

c ++ void*to函数的参数

我在某个库中有这个功能:

class myConsole
{
    void addCommand( std::string command, void* fn );
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我班上我有这个功能:

void myApp::TestFn( const std::vector<std::string> & args )
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

在同一个班级我称之为:

void myApp::initApp( )
{
    myConsole::getSingleton( ).addCommand( "FirstTest", &myApp::TestFn );
}
Run Code Online (Sandbox Code Playgroud)

但这给了我这个错误:

错误c2664无法将参数2从'void(__ thiscall myApp ::*)(const std :: vector <_Ty>&)'转换为'void*'

我该怎么解决这个问题?

提前致谢!

c++ function-pointers void-pointers visual-c++

2
推荐指数
1
解决办法
1095
查看次数

C:无效的数组*

我正在使用openCV并需要一些回调函数.这些callback功能只接受有限的参数.所以,如果我需要更多这些函数的变量,我必须创建一个全局变量并在函数之间转换它.

例如,这是回调函数:

    void mouse_callback(int event, int x, int y, int flags, void* param);
// params : addition parameter, and just one, I need more parameters for this callback.
// but cannot, so make global variable.
Run Code Online (Sandbox Code Playgroud)

而且因为我不应该这样做(制作全局变量),所以我决定制作数组,(void*)但我担心C不能这样做,因为每个成员的大小可以不同.

我的问题是:我们可以创建(void*)数组,如果没有,我怎样才能克服我的问题:使用回调函数而不需要创建全局变量.

谢谢 :)

c void-pointers

2
推荐指数
1
解决办法
1145
查看次数

当我知道每个元素的大小时,如何从void指针到数组获取一个项目?

当我想为教育目的编写自己的快速入口时.这就是我得到的:

qsort(void* array, int count, int size, int(*compare)(const void*, const void*));
Run Code Online (Sandbox Code Playgroud)

我有数组中每个元素的大小,以及指向数组中第一个元素的指针.如何获取该数组中的每个元素?

c void-pointers

2
推荐指数
1
解决办法
2122
查看次数

打印空指针的位

如果我创建一个空指针,并将一段内存分配给该空指针,我如何打印出我刚刚分配的各个位?

例如:

void * p;
p = malloc(24);
printf("0x%x\n", (int *)p);
Run Code Online (Sandbox Code Playgroud)

我想上面打印我刚刚分配的 24 位。

c bits void-pointers

2
推荐指数
1
解决办法
4063
查看次数

为什么 memcpy 使用 void 指针作为参数?

如果函数是: 可以void memcpy(char* dst, const char* src, size_t size)吗?

在 memcpy() 中使用 void 指针有什么好处?

c pointers void-pointers

2
推荐指数
1
解决办法
1619
查看次数

C++无效,从'void*'类型转换为'double'类型

如何将void指针强制转换为double,保留存储在void指针中的确切二进制?我认为这可以用reinterpret_cast<double>(voidp),但g ++不允许我.我知道你可以将void指针转换为整数,所以我尝试过reinterpret_cast<double>(reinterpret_cast<long>(voidp)),但显然这也是无效的.sizeof(double)并且sizeof(void*)都是8,所以它不能是一个大小的东西.有什么我可以做到的吗?

编辑:在这种情况下,双指针没有指向,但是/是/ void指针 - 指针本身包含我想要的数据,它不指向我想要的数据.

c++ casting void-pointers

2
推荐指数
2
解决办法
1万
查看次数

ios将一个void*传递给Swift中的UISaveVideoAtPathToSavedPhotosAlbum

我是Swift的新手.我正在尝试在我的班级中使用方法签名:

func UISaveVideoAtPathToSavedPhotosAlbum(_ videoPath: String!,
                                   _ completionTarget: AnyObject!,
                                   _ completionSelector: Selector,
                                   _ contextInfo: CMutableVoidPointer)
Run Code Online (Sandbox Code Playgroud)

最后一个参数contextInfo是obj-c中的void*.

如果我在Swift中传递字典,我会得到一个NSDictionary不是CMutableVoidPointer错误的子类型.非常感谢任何帮助.我不知道如何void在Swift中传递*等效参数而不会出现该错误.

objective-c void-pointers ios swift

2
推荐指数
1
解决办法
2093
查看次数

在派生函数中指定 void* 参数

我想做一些在 Cpp 中可能无法实现的事情,但我找不到专门针对此的帖子。

我想让派生类指定虚函数上的 void* 参数的类型。

我有一个名为 interface 的基类,带有一个发送函数。

// pure virtual
class Interface{
    virtual bool Send(const void*)=0;

};

struct Packet{
    DataType data;
};

class SpecificInterface{
     bool Send(const DataType*);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让这样的工作?意图是SpecificInterface::Send 实现Interface::Send。允许特定接口不是纯虚拟的,同时将 void* 限制为特定的数据包类型。

否则我知道我可以使用 void* 参数并将其 static_cast 转换为 Packet* 类型;但是,我不希望其他人发送无法转换为 Packet* 的指针类型。

如果这不清楚,请告诉我

c++ inheritance void-pointers

2
推荐指数
1
解决办法
83
查看次数