我正在查看使用C编写的库的C#程序源代码.我遇到了这一行并且不确定它是什么:
cvbimUNSAFE.GetImageVPA ((cvbim.IMG)cvImg.Image, 0, (void**)&lpImageBits, &pVPAT);
Run Code Online (Sandbox Code Playgroud)
什么是类型的对象void **?我做了一些谷歌搜索,只能找到有关的信息void*,如果我理解正确,这是一个指向所有顶级类型的指针.
我正在学习C并在C中尝试粗略实现链表.长话短说我有一个只包含一个void指针(元素)的结构和另一个指向下一个节点的指针.(代码要遵循)我的问题是,当通过时头节点和其他一些节点成新函数,有没有办法确保两个元素属于同一类型?两个节点应该能够保存任何类型的数据.我已经尝试与sizeof()进行比较,但我无法顺从void指针.提前致谢!
struct Node{
void* element;
struct Node* next;
}
Run Code Online (Sandbox Code Playgroud)
这是节点的代码,我只需要一种方法将它们与assert进行比较,以确保链接列表具有所有相同的元素类型!谢谢!
这就是:我想创建一个void函数,它将接收两个众所周知的值类型,另一个可以是任何值.代码如下:
void change_settings(string element, short setting, ??? value) {
switch (setting) {
case ST_NAME:
// Cast value to string or char* and change element.name
break;
case ST_AMOUNT:
// Cast value to integer and change element.amount
break;
case ST_ENABLED:
// Cast value to boolean and change element.enabled
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图制作值的类型,const void*但我得到一个错误(cast from ‘const void*’ to ‘short int’ loses precision),因为我只是这样做:short name = (short)value,这必须是一些疯狂的绝望审判,希望能够幸运.现在,我不知道是否有办法做到这一点,传递任何类型的变量的指针然后将其转换为它是什么(我知道根据每种情况的变量类型.我将如何做到这一点?谢谢!
我注意到有关Voidhaskell Data.Void模块中的类型的一件事,这很奇怪,我非常想知道为什么它是这样的.未定义应该是一个存在于每种类型的值(在我的理解中),和
undefined :: Type
Run Code Online (Sandbox Code Playgroud)
应该屈服
*** Exception: Prelude.undefined
Run Code Online (Sandbox Code Playgroud)
它适用于我尝试的每种数据类型,除了Void.
undefined :: Void根本没有终止,相同absurd undefined.现在我认为这不是一个问题,因为它Void代表了一种不会发生的价值,但我仍然想知道导致这种行为的原因.
在test1()中,它可以返回test()成功返回的Void.但在test2()中,错误抛出.为什么?
//: Playground - noun: a place where people can play
import UIKit
import AVFoundation
func test()->Void{
print("Hello")
}
func test1(){//print Hello
return test()
}
func test2(){// throw error
return Void
}
Run Code Online (Sandbox Code Playgroud) 我正在为我正在教授的课程安排一个基于C++的作业.我有一个函数,我要向学生出口,我希望他们在他们的课程中的不同点上打电话,这样在评分期间,我们可以拦截这些电话,以确保他们在正确的时间做正确的事情.我不希望该代码在提供的启动文件中执行任何操作,因此我只给了函数一个只有一系列语句的主体,这些语句会转换所有参数void以禁止编译器有关未使用参数的警告.在这样做的过程中,我遇到了一个我以前从未见过的不寻常的编译器错误,并且对此站点的搜索没有发现任何有用的信息.
这个简化的测试用例可以最好地说明错误:
void iDontUseMyArguments(int a, int b) {
(void) a; // Explicit cast to void - totally fine!
(void) b;
}
void iDontEither(int a, int b) {
(void) a, b; // Comma expression casted to void, though technically
// b isn't casted to void!
}
void norDoI(int a, int b) {
void(a, b); // ERROR! No idea why this isn't okay.
}
void meNeither(int a, int b) {
(void)(a, b); // Comma expression casted to void - …Run Code Online (Sandbox Code Playgroud) 我想了解这两个编程概念之间的区别.第一个表示缺少数据类型,后者表示存在类型,但没有信息.另外,我认识到Unit来自函数式编程理论基础,但我仍然无法理解单元原语的可用性是什么(例如,在F#程序中).
默认情况下可以序列化原语'void',为什么对象'Void'不能扩展Serializable?
添加示例:
RootImplementation将有一个编译错误,说"Void不在其范围内",因为它没有扩展Serializable.虽然将'someMethod'声明为'void',但这不是问题.
public interface Root<R extends Serializable> extends Serializable {
R someMethod();
}
public class RootImplementation implements Root<Void> {
public Void someMethod() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 返回类型 - 方法返回的值的数据类型,如果方法未返回值,则返回void.
http://download.oracle.com/javase/tutorial/java/javaOO/methods.html
好的,那么..这是我的问题:
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public void tellItLikeItIs() {
switch (day) {
case MONDAY: System.out.println("Mondays are bad.");
break;
case FRIDAY: System.out.println("Fridays are better.");
break;
case SATURDAY:
case SUNDAY: System.out.println("Weekends are best.");
break;
default: System.out.println("Midweek days are so-so.");
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay …Run Code Online (Sandbox Code Playgroud) 在我的回答中,我提到解除引用void指针是一个坏主意.但是,当我这样做时会发生什么?
#include <stdlib.h>
int main (void) {
void* c = malloc(4);
*c;
&c[0];
}
Run Code Online (Sandbox Code Playgroud)
汇编:
gcc prog.c -Wall -Wextra
prog.c: In function 'main':
prog.c:4:2: warning: dereferencing 'void *' pointer
*c;
^~
prog.c:5:4: warning: dereferencing 'void *' pointer
&c[0];
^
prog.c:5:2: warning: statement with no effect [-Wunused-value]
&c[0];
^
Run Code Online (Sandbox Code Playgroud)
这是来自Wandbox的图片,对于那些说它没有发生的人:
和Live demoIdeone中的一个.
它实际上会尝试读取c指向的内存,然后获取该结果,但实际上什么都不做?或者这条线根本没有效果(但GCC不会产生警告).
我在想,既然编译器对数据类型一无所知,在不知道类型大小的情况下,它将无法做很多事情.
为什么derefencing a void*不会产生错误,只是警告?
如果我尝试作业,我会收到错误:
无效使用void表达式
但不应该单独解除引用会产生错误吗?