我有一个TWinControl,并且正在尝试确定父窗口是否可见. 我看到TWinControl具有ParentWindow的属性. ParentWindow的返回类型是void *.因此,我很好奇是否必须施放特定类型,然后可以让我访问检查窗口是否可见. 有人知道我需要铸造的类型还是其他方法? 其他故障排除注释,第1部分: 我试图通过: 获得parentwindows类 String parentWindowClassName = ((TObject *)(Control->ParentWindow))->ClassName(); 但这给了违规访问.我还尝试将其铸造为Tform,这也违反了访问,这使我相信父窗口可以由Windows控制.如果是这样,有人知道是否可以检查它是否可见?例如.有什么com技巧或其他任何东西吗? 其他故障排除注释,第2部分: 这个问题的答案可能有助于解决我的另一个问题: C ++建筑商2009-无法将残疾或隐形窗口聚焦
以下是关于 void-pointers 的编程技术问答
我被告知手柄是一种"无效"指针.但是,"无效指针"到底是什么意思,其目的是什么.另外,"somehandle = GetStdHandle(STD_INPUT_HANDLE);做什么? 解决方案 一般意义上的手柄是一个不透明的值,它独特地标识了对象.在这种情况下,"不透明"是指实体分发句柄(例如窗口管理器)知道如何处理映射到对象,而不是使用句柄的实体(例如,代码). 这样做是这样,除非涉及提供商,否则它们无法掌握真实的对象,这使提供商可以确保没有人会弄乱其背后的对象. 由于它非常实用,因此传统上是整数类型或void*,因为在C中使用原语比其他任何内容都容易得多.特别是,Win32 API中的许多功能都接受或返回手柄(#define d带有各种名称:HANDLE,HKEY,许多其他功能).所有这些类型都映射到void*. 更新: 回答第二个问题(尽管可能会自行提出和回答): GetStdHandle(STD_INPUT_HANDLE) 其他解决方案
代码有什么问题.应该是什么.因为它正在丢弃错误.运算符"删除",应用于void*参数. int i; void *ptr = &i; delete ptr; 解决方案 代码怎么了. 除int i; 以外的其他所有内容 第二行尝试将整数转换为指针.在特殊情况下,您可以用reinterpret_cast迫使该编译器经过;但是,只有以某种方式包含有效的指针值,该程序才能正确行事. ( Update :现在已经编辑了这个问题以取为i的地址;因此,这一行不再是错误的). 第三行尝试使用无效的指针类型删除无效的内存. 应该是什么. 其他.不知道您想做什么,这是不可能说的.也许您想要: int i; void * ptr = &i; // Points to `i`, losing type information. 操作员delete,应用于void*参数. 这总是错的.您必须仅使用new分配的对象delete;指针必须是正确的类型.
我有一系列复杂的数字,我只想在两个元素之间交换.但是,我想实现未知类型(使用void*)的交换.因此,我使用了第一个交换实现编写了以下代码C">在这里: #include typedef struct complex complex; struct complex { int real; int img; }; void swap(void *arr[], int i, int j) { void *temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } void printComplexArray(complex* cArr, size_t len) { int i; for (i = 0; i
我正在尝试通过使用指针功能来实现C中的气泡排序,但行不通.谁能帮我?这是代码: #include #include void bubbleSort(void** base, size_t length, int (*compar)(const void*, const void*)); int main(int argc, char* argv[]) { int cmp(const void*, const void*); int vet[] = {1, 2, 5, 7, 6, 1, 3, 2, 9, 15, 14, 20}; bubbleSort((void**) &vet, sizeof(vet)/sizeof(vet[0]), cmp); int i; for (i = 0; i
我有一个动态的2D数组存储在void**指针中,我只是想知道我应该如何铸造/删除值以打印它们? 这是我要做的示例: /* Assume that I have a data structure called graph with some * element "void** graph" in it and some element "int order" */ void foo(graph_t *graph) { int **matrix; /*safe malloc works fine, it uses calloc to initialise it all to zeroes*/ matrix = safe_malloc(graph->order * sizeof(int*)); for (i = 0; i order; i++) matrix[i] = safe_malloc(graph-
混淆了如何访问存储在void指针(void *)的函数指针. 假设您有一个: void *functions[] = { &sqrt, // int ft_sqrt(int nb); &power, &logN, &factorial; }; // An array of void pointers, each storing a function pointer. 如果我想访问sqrt函数,我的猜测将是以下内容: (int (*)(int)) functions[0](x) 但是我的猜法是错误的: error: called object type 'void *' is not a function or function pointer 那么如何访问这些功能之一? 解决方案 这是 A>:功能调用操作员比铸造操作员具有更高的优先级. 这意味着您的表达(int (*)(int)) f
我有类似于以下问题的问题: 使用多个继承吗? 多继承:意外结果:意外结果从void *到第二基类后 ,但我真的不明白为什么它不起作用,因为我正在做建议的事情(归还给原始类型). 另外,涉及模板. 我有一个通用的模板对象容器,我将其作为std::string IDS和void*的地图实现. std::map mymap; 对象看起来如下: template class A { virtual void f1(const T&) = 0; }; class T1 {}; class T2 {}; class B : public A { void f1(const T1&) override; } class D { virtual void f3 () {}; } class C : public A, public D
void变量无事可做,而且void指针只能用铸造指向. 因此,当我们实际上不知道要指向哪种数据类型时,使用Void指针.但是什么是无效变量? 有实际示例? 解决方案 在C void中不能被视为数据类型,它是用作占位符代替数据类型的关键字,以表明实际上没有数据. 例如,考虑函数void f(void);.在这里,关键字void用于表示没有传递的任何参数并返回值. 但void *ptr;的含义不同. 此声明指针而不指定指向哪种数据类型. 其他解决方案 没有空隙变量,但是有空隙指针. 正如其他人所提到的那样,我想提醒您在使用无效指针之前打字. float generic_add(void *n1, void *n2){ return *((int *) n1) + *((float *) n2); } 当我们对确切的数据类型不了解时, 其他解决方案 void Pointer对于内存分配目的非常有用.尝试编写自己的malloc,以了解
假设我有一个功能.. void * getValue(...); 有没有办法检查呼叫的返回类型(...)? 我计划在程序中使用诸如getValue()之类的void*方法,并且程序的过程将取决于getValue()的返回类型. 可以检查返回类型吗? 解决方案 您可能需要返回结构 enum valuetype {PCHAR, PSHORT, PINT, PLONG, PLLONG, PFLOAT, PDOUBLE, PLDOUBLE}; struct sometype { enum valuetype vt; void *value; } struct sometype getValue(...); 其他解决方案 恐怕您无法确切地告诉(void *)指针中的内容.如果您想要我的建议,请更改您的代码并使用适当的打字指针 其他解决方案 no -c不使用其类型标记值,因此该信息不可用. 可能的替代方案包括在函数中添加一个o
我用void Pointers编写了这个双重链接列表 typedef struct list_el { void *data; struct list_el *prev; struct list_el *next; } list_el; typedef struct linked_list { int n_el; /*number of elements*/ list_el * head; /*pointer to the head*/ list_el * tail; /*pointer to the head*/ } linked_list; 我写了这些功能来处理它. /*for list_el allocation*/ list_el * new_el ( void ) { return (list_el *) m
我有一个函数 struct Analysis reduce (int n, void* results) 其中n是要分析的文件数,我将一系列分析结构传递给结果. 分析结构定义如下: struct Analysis { int ascii[128]; //frequency of ascii characters in the file int lineLength; //longest line in the file int lineNum; //line number of longest line char* filename; } 我已经施放了void *, struct Analysis resArray[n]; struct Analysis* ptr = results; resArray[0] = ptr[0]; ,但我不知道如何正确地通过重演.我尝试了 for (i = 0; i
尝试以下内容时,我会得到违规读取地点.我在做什么错? uint64_t hInt = 2901924954136; void* hPoint = reinterpret_cast(hInt); uint64_t hIntBack = *static_cast(hPoint); //get access violation here 解决方案 我猜您是要在hPoint中存储hInt的地址,而不是hInt的值. uint64_t hInt = 2901924954136; void* hPoint = reinterpret_cast(&hInt); // ^ addressof operator 其他解决方案 您要做的是以下内容: 将整数施放到空隙指针 - 很好,但是指针可能指向不可用的内存. 将空隙指针投入指向未签名的64位整数的指
我目前正在尝试将整数转换为char*,以便将其发送到插座上.在接收方法中,我从逻辑上试图再次将char*视为整数,但是我似乎缺少某些东西,因为我无法正确处理. #include using namespace std; int main(int argc, char** argv) { int num1 = 42; // Works int num2 = 100; // Works int num3 = 126; // Works int num4 = 517; // Doesn't seem to work for int > 127 char p1[sizeof(int)]; *p1 = num1; char p2[sizeof(int)]; *p2 = num2; char p3[sizeof(int)];
所以我试图在第64次写一个缓冲库,我开始介绍一些非常高级的东西.以为我会要求对此提供一些专业输入. 在我的第一个标头文件中,我有一个: typedef struct StdBuffer { void* address; } StdBuffer; extern void StdBufferClear(StdBuffer); 在另一个标头文件中#includes我有第一个标头文件: typedef struct CharBuffer { char* address; } CharBuffer; void (*CharBufferClear)(CharBuffer) = (void*) StdBufferClear; 声明此功能指针空隙会干扰呼叫吗?他们通过价值签名匹配.我以前从未见过函数指针宣布为void,但这是使其清洁编译的唯一方法. stackwise这与我在汇编编码中学到的内容完全没有任何区别. 无关紧要 omg!我刚刚在Stackoverflow
我有一个程序,我无法消除其工作原理.这是其中的一部分. 我不了解行typedef void *COMPLEX,命令this以及为什么要使用struct COMPLEX_IMPL. #ifndef _COMPLEX_H #define _COMPLEX_H typedef void *COMPLEX; COMPLEX NewCOMPLEX (double a, double b ); void DeleteCOMPLEX(COMPLEX this ); double GetA (COMPLEX this ); double GetB (COMPLEX this ); COMPLEX AddComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); COMPLEX MultComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); #endif /* _COMPLEX_H */ #if
这是程序中使用的结构: struct basic_block { void * aux; /* Many other fields, which are irrelevant. */ }; 现在: 在执行程序期间存在basic_block的几个实例. 该程序在阶段/通过时起作用,该程序接一个地执行. aux字段是用于在执行阶段的过程中存储阶段和basic_block特定数据,并由阶段本身释放(因此下一个阶段可以重复使用).这就是为什么它是void *. 我的舞台使用aux存储struct,所以每次我想访问某些东西时,我都必须进行演员: ( (struct a_long_struct_name *) (bb->aux))->foo_field = foo; 现在,我的问题:每次这样施放它是一种痛苦,当它是更复杂的表情的一部分时,很难阅读.我提出的解决方案是:使用宏为我做演员: #define MY_DATA(bb) \ ( (s
基本上我的问题是我正在尝试更改valor变量内的值.我在这里做错了什么?我正在尝试制作一个真正的通用功能,以便根据我传递给intainmant in the dinam变化的功能的数据类型.在这种情况下,是一种整数类型,但是我在这里要做的是检查我是否可以更改函数内部valor变量的值 #include #include void cambiar_valor(void* valor,int* valor_dos) {//assign valor_dos to valor valor = valor_dos; } int main() { void *valor; int *valor_dos = 25; cambiar_valor(valor,valor_dos); printf("%d \n",(int*)valor);//this should show 25 return 0; } 解
我是C语言的初学者,正在学习C语言的功能指针.在那里我遇到了一个问题? 写一个比较函数以按名称的第一个字符排序? * int(first namecharcompar)(const void * a,const void * b)) 这是我的代码解决方案. #include #include #include int compare1(const void *a,const void *b) { char *c = *(char**)a; char *d = *(char**)b; return c[0] - d[0]; //return ( *(char*)a[0] == *(char*)b[0] ); } int main() { char* str[3];