| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 837 人关注过本帖
标题:很简单的一个程序不知是哪出了问题?
只看楼主 加入收藏
粘土
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-9-4
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:10 
很简单的一个程序不知是哪出了问题?
下面是一个小程序,程序运行点击Command1总是会报错,不知是什么原因,请指正.谢谢!

Private Type typeDayvol
    fDate As Long                        
    Volume As Long                       
End Type                                  后面要读取的文件"C:\aple.Vol"格式

Private Function funDayvolume(ByVal dFileName As String) As Long
  Dim tFileNum As Long
  Dim tFileRecs As Long
  Dim i As Long
  Dim j As Long
  Dim Data As typeDayvol
  Dim Volumeday As Long
  Dim tPos As Long
  On Error Resume Next
  If Len(Dir(dFileName, vbNormal)) = 0 Then           '判断该文件是否存在
     funDayvolume = 0                                 '文件不存在取0
  Else
     tFileNum = FreeFile
     Open dFileName For Binary Access Read As tFileNum
     tFileRecs = LOF(tFileNum) / 8                   '文件8字节一条记录
     If tFileRecs >= 20 Then
       j = 20
     Else
       j = tFileRecs
     End If                                       最多读取文件20条记录
     Volumeday = 0
     For i = 1 To j
     tPos = (tFileRecs - i) * 8 + 1                  '从文件的最后一条记录开始取值
     Get tFileNum, tPos, Data
     Volumeday = Volumeday + Data.Volume
     Next i
     funDayvolume = Volumeday
ErrPos:
  MsgBox "调用函数出错", 48
  End If
  Close tFileNum
End Function
Private Sub Command1_Click()
Dim vFileName As String
Dim zero As Long
vFileName = "C:\aple.Vol"
zero = funDayvolume(vFileName)
Text1.Text = zero
End Sub
搜索更多相关主题的帖子: 原因 
2010-07-14 11:02
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
收藏
得分:0 
请说清楚到底是哪一行出错,出错信息是什么?
2010-07-14 11:44
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 

     tPos = (tFileRecs - i) * 8 + 1                  '从文件的最后一条记录开始取值
这里错了.

tFileRecs 是文件总记录条数.
j=20 或 总条数
i 是 1 to 20

倒数 第i条 记录的位置是:
(tFileRecs - j + i - 1) * 8 + 1


      

授人于鱼,不如授人于渔
早已停用QQ了
2010-07-14 12:40
粘土
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-9-4
收藏
得分:0 
程序编译没有错误,是程序中有个On Error Resume Next语句扑捉错误,程序运行就出现  MsgBox弹出窗口
2010-07-14 15:25
粘土
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-9-4
收藏
得分:0 
回复 2楼 jiashie
程序编译没有错误,是程序中有个On Error Resume Next语句扑捉错误,程序运行就出现  MsgBox弹出窗口
2010-07-14 15:30
粘土
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-9-4
收藏
得分:0 
回复 3楼 风吹过b
假如tFileRecs=50,文件就是有400字节,肯定j=20,按照(tFileRecs - j + i - 1) * 8 + 1,读取最后一条记录的位置是(50-20+1-1)*8+1=241?
2010-07-14 15:37
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
收藏
得分:0 
ErrPos:
  MsgBox "调用函数出错", 48
  End If
  Close tFileNum


改成:
程序代码:
close tFileNum
End If
exit function
ErrPos:
  MsgBox "调用函数出错", 48

就这么几行代码,逻辑真够乱的
1、文件open与close位置不配对
2、ErrPos貌似根本没有作用
3、errPos放的位置也不对。
2010-07-14 16:41
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
以下是引用粘土在2010-7-14 15:37:22的发言:

假如tFileRecs=50,文件就是有400字节,肯定j=20,按照(tFileRecs - j + i - 1) * 8 + 1,读取最后一条记录的位置是(50-20+1-1)*8+1=241?

你还是算错了。
最后一条时 i=20
(tFileRecs - j + i - 1) * 8 + 1

那么这个式子是: ( 50-20+20 -1 )* 8 + 1 = 49 * 8 + 1 = 393
而文件长度是 400 字节  50*8=800  , 393 到 400 ,连头带尾正好是 8 个字节。

倒数第 20 条记录 才是你算的那种的  241 开始读 8 字节。





授人于鱼,不如授人于渔
早已停用QQ了
2010-07-14 20:03
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
也许 需要从倒序读起。如果是这样,就当我没说过。


---------------------------
  On Error Resume Next

这行命令的意思就是:
如果出现错误,返回到 出现错误的下一条继续执行。

  On Error goto ErrPos:         '出现错误,跳转到指定行继续执行

   exit Function               '正常状态的代码执行后,如果下面是错误处理,那么必须增加这句,以免陷入错误处理中
ErrPos:
  MsgBox "调用函数出错", 48
'  End If                       'end if 闭合必须在 错误处理之外,除非是 错误处理中的 if
  Close tFileNum                '关闭文件,最好增加一句,针对出现错误而返回一个错误的结果给调用者。 你文件没找到是 返回 0 ,那么错误时,可以选择返回 -1
End Function

授人于鱼,不如授人于渔
早已停用QQ了
2010-07-14 20:16
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
Private Function funDayvolume(ByVal dFileName As String) As Long
  Dim tFileNum As Long
  Dim tFileRecs As Long
  Dim i As Long
  Dim j As Long
  Dim Data As typeDayvol
  Dim Volumeday As Long
  Dim tPos As Long
  On Error goto ErrPos:
  If Len(Dir(dFileName, vbNormal)) = 0 Then           '判断该文件是否存在
     funDayvolume = 0                                 '文件不存在取0
  Else
     tFileNum = FreeFile
     Open dFileName For Binary Access Read As tFileNum
     tFileRecs = LOF(tFileNum) / 8                   '文件8字节一条记录
     If tFileRecs >= 20 Then
       j = 20
     Else
       j = tFileRecs
     End If                                       最多读取文件20条记录
     Volumeday = 0
     For i = 1 To j
       tPos = (tFileRecs - i) * 8 + 1                  '从文件的最后一条记录开始取值
       Get tFileNum, tPos, Data
       Volumeday = Volumeday + Data.Volume
     Next i
     funDayvolume = Volumeday
   End If
   Exit Function
ErrPos:
  MsgBox "调用函数出错", 48
  funDayvolume = -1                                 '出现错误,-1
  Close tFileNum
End Function

授人于鱼,不如授人于渔
早已停用QQ了
2010-07-14 20:18
快速回复:很简单的一个程序不知是哪出了问题?
数据加载中...
 
   



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

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