我可以理解void**在记忆中看起来如何,但我想知道我是否正确使用它.我在下面描述的是否有任何根本缺陷?例如,虽然我可以说"它对我有用",但我是否以某种方式创建了错误/不可移植的代码?
所以我有一个小行星克隆.有三个实体可以发射子弹,即玩家(SHIP *player_1,SHIP *player_2)和UFO(UFO *ufo).当子弹被射击时,重要的是要知道谁射了子弹; 如果它是一名球员,当它击中某些东西时,他们的分数需要增加.因此,子弹将存储它所属的实体类型(owner_type)以及直接指向所有者(owner)的指针:
enum ShipType
{
SHIP_PLAYER,
SHIP_UFO
};
typedef struct Bullet
{
// ...other properties
enum ShipType owner_type;
void **owner;
} BULLET;
Run Code Online (Sandbox Code Playgroud)
然后,当玩家点击按钮或UFO看到目标时,将调用以下功能之一:
void ship_fire(SHIP **shipp)
{
BULLET *bullet = calloc(1, sizeof(BULLET));
bullet->owner_type = SHIP_PLAYER;
bullet->owner = (void**)shipp;
// do other things
}
void ufo_fire(UFO **ufop)
{
BULLET *bullet = calloc(1, sizeof(BULLET));
bullet->owner_type = SHIP_UFO;
bullet->owner = (void**)ufop;
// do other things
}
Run Code Online (Sandbox Code Playgroud)
......他们可能被称为,例如,像这样: …
Error 1 error C2036: 'const void *' : unknown size file.cpp 111
Run Code Online (Sandbox Code Playgroud)
我不跟随.GCC从不抱怨void*指针算法,即使是-ansi -pedantic -Wall.有什么问题?
这是代码 -
struct MyStruct {
const void *buf; // Pointer to buffer
const void *bufpos; // Pointer to current position in buffer
};
...
size_t someSize_t, anotherSize_t;
MyStruct *myStruct = (MyStruct *) userdata;
...
if ( (myStruct->bufpos + someSize_t) >
(myStruct->buf + anotherSize_t) ) { // Error on this line
...
Run Code Online (Sandbox Code Playgroud) 假设我有这个函数,它是一些gui工具包的一部分:
typedef struct _My_Struct My_Struct;
/* struct ... */
void paint_handler( void* data )
{
if ( IS_MY_STRUCT(data) ) /* <-- can I do something like this? */
{
My_Struct* str = (My_Struct*) data;
}
}
/* in main() */
My_Struct s;
signal_connect( SIGNAL_PAINT, &paint_handler, (void*) &s ); /* sent s as a void* */
Run Code Online (Sandbox Code Playgroud)
由于paint_handler也将由GUI工具包的主循环与其他参数一起调用,因此我不能总是确定我接收的参数将始终是指针s.
我可以IS_MY_STRUCT在paint_handler函数中执行某些操作来检查我收到的参数是否可以安全地返回到My_Struct*?
为什么说我们可以在C编程中用void*实现参数多态?这是不正确的?
教授提出了这个问题而从未回答过.我认为void*实际上是一个非常低级别的被认为是参数多态的东西但是有更强的理由吗?
我需要将int(指定一个字节偏移量)强制转换为const void*。真正适合我的唯一解决方案是c样式强制转换:
int offset = 6*sizeof(GLfloat);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)offset);
Run Code Online (Sandbox Code Playgroud)
我想摆脱c风格的转换,但找不到有效的解决方案。我试过了
static_cast<void*>(&offset)
Run Code Online (Sandbox Code Playgroud)
并进行编译,但这不是正确的解决方案(此方法的整体输出有所不同)。正确的解决方案是什么?
链接至的文档glVertexAttribPointer:链接
我尝试自己实现链表。因此,当我向其中添加新数据时,我会使用类似node->data = datawhere的内容data is (void*) type。所以我想通过意外编辑添加的变量来防止数据损坏。
例如:
int data = 10;
LinkedList_add(list, (void*)&data);
...
/* It will modify value in list */
data = new value;
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我尝试这样复制它:
void* data_copy;
*data_copy = *_data;
Run Code Online (Sandbox Code Playgroud)
但我觉得这行不通,也行不通。
我正在使用visual studio进行C项目.我试着编译以下代码:
void shuffle(void *arr, size_t n, size_t size)
{
....
memcpy(arr+(i*size), swp, size);
....
}
Run Code Online (Sandbox Code Playgroud)
我在Visual Studio Compiler中遇到以下错误:
error C2036: 'void *' : unknown size
Run Code Online (Sandbox Code Playgroud)
该代码与GCC编译良好.如何解决这个错误?
我有一个问题。我正在尝试将 void* 转换为 std::function 。这只是一个简单的例子,任何建议将不胜感激
#.h file
class Example {
public:
Example();
int foo(void* hi);
int fooFunc(std::function<int(int, int)> const& arg, int x, int y) {
foo(arg.target<void*>(), x, y);
return 2;
}
};
#.cpp file
Example::Example() {
}
int Example::foo(void * func, int x, int y)
{
//cast back to std::function
func(x, y);
std::cout << "running in foo: " << a << "\n";
return a;
}
Run Code Online (Sandbox Code Playgroud)
我尝试的每一次选角都不起作用。
我知道我可以在这个例子中发送一个std::function,但这是为了更大的事情,我正在研究一个例子以使其在这里工作。
,的全部含义void*是有时在这些情况下使用它,当您不知道您将收到什么时,然后将其转换为您需要的特定用法。
谢谢!
考虑以下代码:
int main()
{
typedef struct { int first; float second; } type;
type whole = { 1, 2.0 };
void * vp = &whole;
struct { int first; } * shorn = vp;
printf("values: %d, %d\n", ((type *)vp)->first, shorn->first);
if (vp == shorn)
printf("ptrs compare the same\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两个问题:
second初始化行上的成员的“剪切” shorn:像这样抛弃结构成员然后取消引用操纵的指针以访问其余成员是否有效?有人可以解释这背后的逻辑吗?为什么void?例如
#include <iostream>
using namespace std;
int main()
{
char c;
cout << (void *)&c;
return 0;
}
Run Code Online (Sandbox Code Playgroud) void-pointers ×10
c ×6
casting ×5
c++ ×3
pointers ×3
void ×3
c++11 ×1
c-strings ×1
copy ×1
opengl ×1
std-function ×1
visual-c++ ×1
windows ×1