这个问题是关于在特定实现中使用void指针的适当性.
我有一个相对简单的程序,包含一个无限循环.在每个循环中,程序迭代固定范围的常量值并在每个值上调用一个函数.调用的特定函数可以是三个中的一个,并且在运行时由参数指定.在无限循环开始之前,有一个条件块,它根据提供的参数设置一个函数指针.这样,条件逻辑只需运行一次,而不是每次循环中的每次迭代运行.
我已经实现了它并且运行良好,但我希望在每次调用函数之间保持状态.我的建议是将状态存储在结构中,并在每个值上调用函数时传递该结构.问题是每个函数都需要一个不同的结构来存储其状态的不同值集,并且所有三个函数的原型必须兼容(对于函数指针).我打算通过在三个函数的原型中使用void指针来解决这个问题,从而保持兼容的原型,但允许我将不同的结构传递给每个函数.
问题是; 我的建议是否适当使用了void指针,或者它是否引入了太多的运行时动态,因此我应该重新考虑我的方法?
注意:不可能在三个函数中的每个函数中使用静态变量,因为结构也需要在无限循环中可用,因为在迭代值范围之前和之后还要进行一些处理.
在我们的应用程序中,我们有一个在运行时接收属性的对象 例如,要向对象添加浮点数:
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 *它以及正确清理所需的所有额外注意力.有没有更好的方法在运行时在对象中存储任意类型,可以通过字符串映射访问,并仍然可以通过析构函数自动清理?
我在某个库中有这个功能:
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*'
我该怎么解决这个问题?
提前致谢!
我正在使用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*)数组,如果没有,我怎样才能克服我的问题:使用回调函数而不需要创建全局变量.
谢谢 :)
当我想为教育目的编写自己的快速入口时.这就是我得到的:
qsort(void* array, int count, int size, int(*compare)(const void*, const void*));
Run Code Online (Sandbox Code Playgroud)
我有数组中每个元素的大小,以及指向数组中第一个元素的指针.如何获取该数组中的每个元素?
如果我创建一个空指针,并将一段内存分配给该空指针,我如何打印出我刚刚分配的各个位?
例如:
void * p;
p = malloc(24);
printf("0x%x\n", (int *)p);
Run Code Online (Sandbox Code Playgroud)
我想上面打印我刚刚分配的 24 位。
如果函数是: 可以void memcpy(char* dst, const char* src, size_t size)吗?
在 memcpy() 中使用 void 指针有什么好处?
如何将void指针强制转换为double,保留存储在void指针中的确切二进制?我认为这可以用reinterpret_cast<double>(voidp),但g ++不允许我.我知道你可以将void指针转换为整数,所以我尝试过reinterpret_cast<double>(reinterpret_cast<long>(voidp)),但显然这也是无效的.sizeof(double)并且sizeof(void*)都是8,所以它不能是一个大小的东西.有什么我可以做到的吗?
编辑:在这种情况下,双指针没有指向,但是/是/ void指针 - 指针本身包含我想要的数据,它不指向我想要的数据.
我是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中传递*等效参数而不会出现该错误.
我想做一些在 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* 的指针类型。
如果这不清楚,请告诉我
void-pointers ×10
c ×5
c++ ×4
pointers ×2
bits ×1
casting ×1
inheritance ×1
ios ×1
objective-c ×1
swift ×1
visual-c++ ×1