| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 765 人关注过本帖
标题:有关参数很多的涵数的问题如何有效得到想要的值?
只看楼主 加入收藏
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
结帖率:54.55%
收藏
已结贴  问题点数:10 回复次数:9 
有关参数很多的涵数的问题如何有效得到想要的值?
比如得到系统时间的函数。这个结构有好多个成员。。

我用以下方法得到这个时间,但是要设这么多变量,有别的方法么?

还有这个默认是dd型,若是其它字型之类的一定要转成dd么?

比如下面这个。我用push压栈的话,我用什么函数来读成?这个push是压的16位的吧?

那个数值的读取是否只有wspritf这个函数?????

_sjproc proc   _hWnd,uMsg,_idEvent,_dwTime
        local @stTimer:SYSTEMTIME
        local @year,@mon,@day,@hour,@min,@sec  ;默认是DWORD类型
pushad
        invoke RtlZeroMemory,addr @stTimer,sizeof @stTimer
        invoke GetLocalTime,addr @stTimer
        movzx eax,@stTimer.wYear
        mov @year,eax
        movzx eax,@stTimer.wMonth
        mov @mon,eax
        movzx eax,@stTimer.wDay
        mov @day,eax
        movzx eax,@stTimer.wHour
        mov @hour,eax
        movzx eax,@stTimer.wMinute
        mov @min,eax
        movzx eax,@stTimer.wSecond
        mov @sec,eax
        invoke wsprintf,addr szBuffer,addr szFmat,@year,@mon,@day,@hour,@min,@sec
        invoke SetDlgItemText,hMain,IDC_ETIME,addr szBuffer
popad
ret
_sjproc endp
搜索更多相关主题的帖子: 参数 
2009-09-21 08:41
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:3 
有些东西就是很麻烦~~~

那个数值的读取是否只有wspritf这个函数?????

是 输出 罢~

win32压栈只能压32位的 所以~~~ 这个时间的函数一直很麻烦

aogo上的一个高手写过一个宏 比较方便 不过 用宏不大好~
2009-09-21 12:33
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
程序代码:
嗯。。。不过aogo那个论坛怎么看的?随便看一下,太难看了。。。闪了。

对了。还有比如判断是星期几。
szx1 db '星期一',0 
szx2 db '星期二',0 
szx3 db '星期三',0 
szx4 db '星期四',0 
szx5 db '星期五',0 
szx6 db '星期六',0 
szx7 db '星期日',0



    movzx eax,@stTimer.wDayOfWeek 
        mov @dday,eax 
        .if @dday==1 
            mov @dday,offset szx1 
        .endif 
         
        .if @dday==2 
            mov @dday,offset szx2 
        .endif

invoke wsprintf,addr szBuffer,addr szFmat,@dday
我这样设置呢。
有简单一点的么?
2009-09-21 15:48
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
   
程序代码:
     movzx eax,@stTimer.wYear 
        mov @year,eax 
        movzx eax ,@stTimer.wMonth
        mov @mon,eax 
        movzx eax,@stTimer.wDay 
        mov @day,eax 
        movzx eax,@stTimer.wHour 
        mov @hour,eax 
        movzx eax,@stTimer.wMinute 
        mov @min,eax 
        movzx eax,@stTimer.wSecond 
        mov @sec,eax 
上面的代码没有任何必要,太罗嗦了。
因为你已经声明了一个结构变量local @stTimer:SYSTEMTIME。所以直接对其成员访问即可。

invoke RtlZeroMemory,addr @stTimer,sizeof @stTimer
invoke GetLocalTime,addr @stTimer 
invoke wsprintf,addr szBuffer,addr szFmat,@stTimer.wYear ,@stTimer.wMonth,@stTimer.wDay 
程序代码:
szx1 db '星期一',0  
szx2 db '星期二',0  
szx3 db '星期三',0  
szx4 db '星期四',0  
szx5 db '星期五',0  
szx6 db '星期六',0  
szx7 db '星期日',0 
改为:

程序代码:
szx1 db '星期一',0,0                ;对齐
szx2 db '星期二',0,0   
szx3 db '星期三',0,0   
szx4 db '星期四',0,0   
szx5 db '星期五',0,0   
szx6 db '星期六',0,0   
szx7 db '星期日',0,0 

这样,对字符串的匹配就简单了:

movzx ecx,@stTimer.wDayOfWeek       ;索引 
.if (eax >= 1) && (ecx <= 7)
   dec ecx                             ;以 0 为基
   mov eax,0ffset szx1                 ;基址 
   invoke wsprintf,addr szBuffer,addr szFmat,[eax + ecx * 8]    ;基址 + 偏移(索引 * 比例),\"\"
.endif



[ 本帖最后由 东海一鱼 于 2009-9-21 20:20 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-21 20:00
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
谢谢。。学习了。
呃 。我一直以为那个wsprintf也是要dd 型才行的。
2009-09-22 07:58
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
程序代码:
szx1 db '星期一',0,0                ;对齐 
szx2 db '星期二',0,0    
szx3 db '星期三',0,0    
szx4 db '星期四',0,0    
szx5 db '星期五',0,0    
szx6 db '星期六',0,0    
szx7 db '星期日',0,0  
 
这样,对字符串的匹配就简单了: 
 
movzx ecx,@stTimer.wDayOfWeek       ;索引  
.if (eax >= 1) && (ecx <= 7) 
   dec ecx                             ;以 0 为基 
   mov eax,0ffset szx1                 ;基址  
   invoke wsprintf,addr szBuffer,addr szFmat,[eax + ecx * 8]    ;基址 + 偏移(索引 * 比例)


很巧妙。。。。。。。的方法。学习。。。这方便好多了。。。。

不过ecx<=7这个有必要么/?因为movzx ecx,..这里本身就是在0-6的范围'
搜了下原型getlocaltime好像是viod型所以是没返回值,这个eax》=1是那来的呢?
看上去不用这个.if语句就行了。。。不知是否这样?


2009-09-22 08:19
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
error A2114: INVOKE argument type mismatch : argument : 0
不知为什么会报错?????
2009-09-22 09:07
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
.if (eax >= 1) && (ecx <= 7)

eax >= 1 因该是 ecx >=1, 我的手误。

目的就是判断值范围的合法性,这是‘防御性’编程的一种手段。防止GetLocalTime失败,@stTimer.wDayOfWeek可能会有意想不到的数值。      

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-22 11:19
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
嗯。不过若是要排错。应直接》0 《6哦。若是》1的话因为ecx等于0时就显不出来了。

invoke wsprintf,addr szBuffer,addr szFmat,[ebx + edx * 8]
会报错啊。[]这里的面的寄存器我换了好多个。。

error A2114: INVOKE argument type mismatch : argument : 0
2009-09-23 14:40
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:7 
mov eax,[eax + ecx * 8]

invoke wsprintf,addr szBuffer,addr szFmat,eax

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-23 20:15
快速回复:有关参数很多的涵数的问题如何有效得到想要的值?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013470 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved