C#中的枚举,结构,数组怎么理解啊

C#中的枚举,结构,数组怎么理解啊,第1张

语法的事情我就不解释了,自己看书;

我只说说我的理解;

枚举是一组静态值的组合,可以和switch

case组合

用在枚举某事物的状态,比如性别有男女,比如三餐,比如12个小时,都是定死的,

结构呢,一般用在存储某一实物的状态特征

比如飞机的参数可以用一个结构来显示:高度、长度、重量,型号等,参数代表的意思是死的,但是它的值可以变;

数组呢,就是放一堆值的地方,呵呵,啥都成,但是内存空间是钉死的,比如char

a[10];

那么你就可以放十个字符,至于放什么,无所谓,谁也不知道。

枚举顶层(top-level)窗口枚举桌面顶层窗口相对于枚举进程来说可能要容易一些。枚举桌面顶层窗口的方法是用 EnumWindows() 函数。不要用 GetWindow()来创建窗口列表,因为窗口之间复杂的父子及同胞关系(Z-Order)容易造成混乱而使得枚举结果不准确。EnumWindows()有两个参数,一个是指向回调函数的指针,一个是用户定义的 LPARAM 值, 针对每个桌面窗口(或者顶层窗口)它调用回调函数一次。然后回调函数用该窗口句柄做一些处理,比如将它添加到列表中。这个方法保证枚举结果不会被窗口复杂的层次关系搞乱,因此,一旦有了窗口句柄,我们就可以通过 GetWindowText() 得到窗口标题。枚举进程建立系统进程列表比枚举窗口稍微复杂一些。这主要是因为所用的 API 函数对于不同的 Win32 *** 作系统有依赖性。在 Windows 9x、Windows Me、Windows 2000 Professional 以及 Windows XP 中,我们可以用 ToolHelp32 库中的 APIs 函数。但是在 Windows NT 里,我们必须用 PSAPI 库中的 APIs 函数, PSAPI 库是 SDK 的一部分。本文我们将讨论上述所有平台中的实现。附带的例子程序将对上述库中的 APIs 进行包装,以便包装后的函数能支持所有 Win32 *** 作系统。使用 ToolHelp32 库枚举进程ToolHelp32 库函数在 KERNEL32dll 中,它们都是标准的 API 函数。但是 Windows NT 40 不提供这些函。ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和 Process32Next()。使用 ToolHelp32 函数的第一步是用 CreateToolhelp32Snapshot() 函数创建系统信息“快照”。这个函数可以让你选择存储在快照中的信息类型。如果你只是对进程信息感兴趣,那么只要包含 TH32CS_SNAPPROCESS 标志即可。 CreateToolhelp32Snapshot() 函数返回一个 HANDLE,完成调用之后,必须将此 HANDLE 传给 CloseHandle()。接下来是调用一次 Process32First 函数,从快照中获取进程列表,然后重复调用 Process32Next,直到函数返回 FALSE 为止。这样将遍历快照中进程列表。这两个函数都带两个参数,它们分别是快照句柄和一个  PROCESSENTRY32 结构。调用完 Process32First 或 Process32Next 之后,PROCESSENTRY32 中将包含系统中某个进程的关键信息。其中进程 ID 就存储在此结构的 th32ProcessID。此 ID 可以被传给 OpenProcess() API 以获得该进程的句柄。对应的可执行文件名及其存放路径存放在 szExeFile 结构成员中。在该结构中还可以找到其它一些有用的信息。注意:在调用 Process32First() 之前,一定要记住将 PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)。使用 PSAPI 库枚举进程在 Windows NT 中,创建进程列表使用 PSAPI 函数,这些函数在 PSAPIDLL 中。这个文件是随 Platform SDK 一起分发的,最新版本的 Platform SDK 可以从这里下载:使用这个库所需的 PSAPIh 和 PSAPIlib 文件也在该 Platform SDK 中。为了使用 PSAPI 库中的函数,需将 PSAPIlib 添加到代码项目中,同时在所有调用 PSAPI API 的模块中包含 PSAPIh 文件。记住一定要随可执行文件一起分发 PSAPIDLL,因为它不随 Windows NT 一起分发。你可以点击这里单独下载 PSAPIDLL 的可分发版本(不用完全下载 Platform SDK)。与 ToolHelp32 一样,PSAPI 库也包含各种各样有用的函数。由于篇幅所限,本文只讨论与枚举进程有关函数:EnumProcesses()、EnumProcessModules()、GetModuleFileNameEx()和 GetModuleBaseName()。创建进程列表的第一步是调用 EnumProcesses()。该函数的声明如下:BOOL EnumProcesses( DWORD lpidProcess, DWORD cb, DWORD cbNeeded );EnumProcesses()带三个参数,DWORD 类型的数组指针 lpidProcess;该数组的大小尺寸 cb;以及一个指向 DWORD 的指针 cbNeeded,它接收返回数据的长度。DWORD 数组用于保存当前运行的进程 IDs。cbNeeded 返回数组所用的内存大小。下面算式可以得出返回了多少进程:nReturned = cbNeeded / sizeof(DWORD)。注意:虽然文档将返回的 DWORD 命名为“cbNeeded”,实际上是没有办法知道到底要传多大的数组的。EnumProcesses()根本不会在 cbNeeded 中返回一个大于 cb 参数传递的数组值。结果,唯一确保 EnumProcesses()函数成功的方法是分配一个 DWORD 数组,并且,如果返回的 cbNeeded 等于 cb,分配一个较大的数组,并不停地尝试直到 cbNeeded 小于 cb现在,你获得了一个数组,其元素保存着系统中每个进程的ID。如果你要想获取进程名,那么你必须首先获取一个句柄。要想从进程 ID 得到句柄,就得调用 OpenProcess()。一旦有了句柄,则需要得到该进程的第一个模块。为此调用 EnumProcessModules() API:EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned );调用之后,hModule 变量中保存的将是进程中的第一个模块。记住进程其实没有名字,但进程的第一个模块既是该进程的可执行模块。现在你可以用 hModule 中返回的模块句柄调用 GetModuleFileNameEx() 或 GetModuleBaseName() API 函数获取全路径名,或者仅仅是进程可执行模块名。两个函数均带四个参数:进程句柄,模块句柄,返回名字的缓冲指针以及缓冲大小尺寸。用 EnumProcesses() API 返回的每一个进程 ID 重复这个调用过程,你便可以创建 Windows NT 的进程列表。16位进程的处理方法在 Windows 95,Windows 98 和 Windows ME 中,ToolHelp32 对待16位程序一视同仁,它们与 Win32 程序一样有自己的进程IDs。但是在 Windows NT,Windows 2000 或 Windows XP 中情况并不是这样。在这些 *** 作系统中,16位程序运行在所谓的 VDM 当中(也就是DOS机)。为了在 Windows NT,Windows 2000 和 Windows XP 中枚举16位程序,你必须使用一个名为 VDMEnumTaskWOWEx()的函数。在源代码模块中必须包含 VDMDBGh,并且 VDMDBGlib 文件必须与项目链接。这两个文件都在 Platform SDK 中。该函数的声明如下:INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,LPARAM lparam );此处 dwProcessId 是 NTVDM 中拟枚举的16位任务进程标示符。参数 fp 是回调枚举函数的指针。参数 lparam 是用户定义的值,它被传递到枚举函数。枚举函数应该被定义成如下这样:BOOL WINAPI Enum16( DWORD dwThreadId,WORD hMod16,WORD hTask16,PSZ pszModName,PSZ pszFileName,LPARAM lpUserDefined );该函数针对每个运行在 NTVDM 进程中的16位任务调用一次,NTVDM 进程ID将被传入 VDMEnumTaskWOWEx()。如果想继续枚举则返回 FALSE,终止枚举则返回 TRUE。注意这是与 EnumWindows()相对的。关于代码本文附带的代码例子将 PSAPI 和 ToolHelp32 封装到一个名为 EnumProcs() 的函数中。该函数的工作原理类似 EnumWindows(),有一个指向回调函数的指针,并要对该函数进行重复调用,针对系统中的每个进程调用一次。另一个参数是用户定义的 lParam。下面是该函数的声明:BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam );使用该函数时,要象下面这样声明回调函数:BOOL CALLBACK Proc( DWORD dw, WORD w16, LPCSTR lpstr, LPARAM lParam );参数 dw 包含 ID,“w16”是16位任务的任务号,如果为32位进程则为0(在 Windows 95 中总是0),参数lpstr 指向文件名,lParam 是用户定义的,要被传入 EnumProcs()。EnumProcs() 函数通过显示链接使用 ToolHelp32 和 PSAPI,而非通常所用的隐式链接。之所以要这样做,主要是为了让代码能够在二进制一级兼容,从可以在所有 Win32 *** 作系统平台上运行。

枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int

1、检测到USB设备后,对USB设备复位,使设备地址变为0x0。发80060100004000命令,读取设备描述符命令,由于不知道设备描述符的长度,暂时要求返回数据长度为0x40。

2、给这个新接上的设备分配地址。

3、设置地址成功后,对新地址发送获取设备描述符命令,此时已经知道了它的长度,直接按这个长度即可。

4、在得到设备描述符后,我们再发获取配置描述符命令。

5、从上一步,我们可以得到设备支持的接口数及端点数,此时再发一次得到配置描述符命令,把数据长度改大,数据长度我们可以从wTotallLength中读取,但我们一般在这里设为0xFF。

6、如果有字符串描述符,在这里可以发命令读取。接下来再一次发命令完整读取设备描述符和配置描述符。

7、在这里发送设置配置命令,到此,我们已经完整地得到了设备的信息。枚举过程结束。

我说说我对枚举的理解哈,

其实枚举不应作为数据类型,

枚举就是[组团]定义了一堆有[递增趋势]的[int][常数变量]

比如

enum x{x1,x2,x3=-3,x4,x5=210000000,x6},

则,x1,x2没指明则,默认x1=0,x2=1,

x3=-3,则x4=-2,

x5=210000000,则x6=210000001;

这个声明和

#define x1 0

#define x2 1

#define x6=210000001

效果差不多,

不过枚举只能定义int常量,

仅此而已

这样x1到x6就可以像其他常变量使用了

比如你又定义了一个

#define x9 521

则,你就可以这样使用

int y1=x9;

int y2=x3;

printf("%d %d\n",y1,y2);

甚至可以这样

printf("%d %d\n",x4,x9);

而就现在而言,枚举作为一种数据类型,是没有意义的

比如你定义

enuem x y3;

这并不能限制y3只能取x1~x6的值

而只能确定 y3是int型的

y3=324;

程序会正常工作,

俺是c初学者,不懂腻这个仿真什么的,

我电脑codeblock环境下完全没你这问题,

你在函数体外声明这个枚举试试,

因为全局变量是静态存储的,系统会在程序运行开始时就初始化的,

而函数体内部定义的可以看作是局部变量,局部变量是动态存储的,系统不会初始化的,

如果不初始化,这些变量的值 就是一些乱七八糟的东西了,

我觉得完全可以指明每个值,

为什么偷了下懒,换来不确定性呢,

可以这样定义

enum week

{

mon=0,

tues=1,

wednes=2,

thurs=3

};

1

因11CM为底边,所以另两边的和一定要大于11CM才能组成一个三角形,所以有以下20个不同的三角形:2+10,3+9,3+10,4+8,4+9,4+10,5+7,5+8,5+9,5+10,6+7,6+8,6+9,6+10,7+8,7+9,7+10,8+9,8+10,9+10

2

算盘中下面一排的珠子1个表示1,上面的珠子1个表示的是5,这个三位数是

百位一颗,十位没有,个位两颗的是:102,106,502,506

百位一颗,十位一颗,个位一颗的是:111,115,151,155,511,515,551,555

百位一颗,十位两颗,个位没有的是:120,160,520,560

百位两颗,十位没有,个位一颗的是:201,205,601,605

百位两颗,十位一颗,个位没有的是:210,250,610,650

百倍三颗,十位没有,个位没有的是:300,700

3

单个法码能称的重量是1g,2g,4g,7g,13g

两个法码能称的重量是1+2=3g,1+4=5g,1+7=8g,1+13=14g,2+4=6g,2+7=9g,2+13=15g,4+7=11g,4+13=17g,7+13=20g

三个法码能称的重量是1+2+4=7g,1+2+7=10g,1+2+13=16g,2+4+7=13g,2+4+13=19g,4+7+13=24g

四个法码能称的重量是1+2+4+7=14g,1+2+4+13=20g,2+4+7+13=26g

五个法码能称的重量是1+2+4+7+13=27g

因为其中7g,13g,14g,20g均有重复,所以能称的重量有21种,分别是:1g,2g,3g,4g,5g,6g,7g,8g,9g,10g,11g,13g,14g,15g,16g,17g,19g,20g,24g,26g,27g

4

由题可知小明第一天和第四天都是做语文,所以第二天和第三天都不做语文,

若第二天做数学的话,第三天可做英语或科学,

若第二天做英语的话,第三天可做数学或科学,

若第二天做科学的话,第三天可做数学或英语

所以这4天的作业安排有6种,分别是语+数+英+语,语+数+科+语,语+英+数+语,语+英+科+语,语+科+数+语,语+科+英+语。

我当初学KMP的时候,有一个比较通俗的理解。

首先,可以肯定的是,next是模式串的事,跟主串无关。。。

模式串(对齐)abaabcac

下标序号分别为01234567

next[i]的值,为模式串0~i-1的前缀串中,前next[i]个字符,与后next[i]个字符,组成的串完全相等的,最大的值。当然,next[i]是小于整个前缀串长度的。。。

我用程序跑出来,这个模式串的next如下:

下标 字符 next[i]

0 a -1

1 b 0

2 a 0

3 a 1

4 b 1

5 c 2

6 a 0

7 c 1

对于next[0]与next[1],无意义

next[2],看前两个字符ab,前1与后1不同,故取0。

next[3],对于aba,前1与后1相同,但取长度2就不同了,故next[3]=1。

以此类推,手算的话,就是枚举i-2~0的长度值,截取前缀串进行比较。

楼主所说的next[6]=3是不是算错了。。。- -

以上就是关于C#中的枚举,结构,数组怎么理解啊全部的内容,包括:C#中的枚举,结构,数组怎么理解啊、在64位系统中,怎样枚举出所有的进程、c语言中 ,枚举类型enum 的枚举值,可以是什么类型的值 一定是 int型吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9300790.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存