在dos下写程序,用的是borland c++ 4.5,读取大于64K文件时出现错误,相当的郁闷。谁能救救我?

acneyouth 2006-12-26 12:16:10
问题的表现:程序完了以后,buf中只有文件的最后一小部分,长度大概就是len / readLen那么长,前边读取的部分应该是被覆盖了。
问题应该就出在memcpy上,可能是它不支持远指针(far *),但是我不知道应该用什么函数来替换它。
也可能是工程的内存模式的问题,我用的是huge模式,这里 是第二个问题:为什么我用large模式时,<iostream.h>中 的函数都会在build的时候出现link error:undefined symbol错误?

可怜可怜我吧!调试了很多天啦!

typedef unsigned char * puchar ;
typedef unsigned char _FAR * fpuchar ;

unsigned long mread(int fHandle , fpuchar buf , unsigned long len)
{
unsigned int readLen = UINT_MAX - 1 ;
int count = len / readLen ;
int lastRead = len % readLen ;
unsigned long pos = 0 ;
unsigned char * catche = new unsigned char[UINT_MAX - 1] ;
for(int i = 0 ; i <= count ; i ++)
{
if(i == count) readLen = lastRead ;
try
{
read(fHandle , catche , readLen) ;
memcpy(buf + pos , catche , readLen) ;
}
catch(...)
{
return 0 ;
}
pos += readLen ;
}
return pos ;
}
...全文
216 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
BenLeak(摇摆人) 能不能说的详细一点?如何申请使用ems?memcpy如何拷贝ems内存?
BenLeak 2006-12-26
  • 打赏
  • 举报
回复
在MS DOS 下不能申请超过 64k 的一页内存
16 位系统的限制
可以考虑使用 EMS 操作,每次操作 16k 是可以的
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
做个备份磁盘的东东,只能用dos了
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
别叹气,为什么要用dos程序处理呢?用32位系统就不存在这个问题了!
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
唉~~~
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
那就是说,直接小段读取文件,再处理,再读取,还是比较可行的办法?
===========================================================================
这是最好的办法,因为巨型指针不是所有函数都支持的。
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
那就是说,直接小段读取文件,再处理,再读取,还是比较可行的办法?
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
谁知道怎么把远指针中的内容传到常规内存?
================================================================================
不要误会,far和huge指针的内容也是常规内存,我上面说的是扩展内存和扩充内存需要传输到常规内存处理。
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
之所以把这么大(其实也就200K以下)的文件装进内存是为了处理方便,而且没写过dos程序,不知道这么罗嗦。我要处理的文件可能是单字节的文本,也可能是双字节的文本。处理双字节文本的时候如果不预处理成单字节的内容,处理起来就很麻烦,一点一点的读进来再处理速度可能也比较慢。

谁知道怎么把远指针中的内容传到常规内存?maozefa(阿发伯) 应该知道吧?
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
即使使用ems或者xms也只能解决装入问题,要分析文件内容,也得分批传输到常规内存才行。
阿发伯 2006-12-26
  • 打赏
  • 举报
回复
不明白楼主把那么大的文件一股脑儿的装入内存干什么?即使huge* 能解决函数通过,可怎么使用这个指针里的内容也是个问题。一楼的也说了,DOS下的内存是分段的,64K是极限。
acneyouth 2006-12-26
  • 打赏
  • 举报
回复
我把_FAR * 改成 huge *,这个函数里的问题是解决了,不过其它函数有问题了。huge*的东西拷贝到near指针中有没有什么特别的函数啊?
wohow 2006-12-26
  • 打赏
  • 举报
回复
看不出catche有什么用,只会增加麻烦。
没有用过Borland C++,不知道一块内存最大能有多大。
TurboC memcpy函数每种编译模式都有相应的版本,相信Borland C++也是,问题多半不是memcpy引起的,应该是buf引起的
i_love_pc 2006-12-26
  • 打赏
  • 举报
回复
不懂,帮顶!
内容概要:本文围绕“阶梯碳下考虑P2G-CCS与供需灵活响应的IES优化调度”展开,基于Matlab平台构建综合能源系统(IES)在阶梯式碳交易机制下的优化调度模型。研究深度融合电制气(P2G)与碳捕集、利用与封存(CCS)技术,结合需求侧灵活响应机制,旨在提升系统的低碳运行能力与经济性。通过建立多能流耦合的优化模型,协调电力、天然气、热力等多种能源形式的协同调度,有效降低系统碳排放强度,并借助YALIMIP工具包调用求解器进行高效求解。文档提供了完整的代码实现、模型构建流程与结果分析方法,涵盖从问题建模到仿真实现的全过程,具备较强的可复现性与科研参考价值。; 适合人群:具备电力系统、能源系统或优化建模相关背景的研究生、高校教师及工程技术人员,尤其适合从事综合能源系统、碳减排策略、P2G与CCS技术集成研究的专业人员,需熟练掌握Matlab编程与基本的数学规划知识。; 使用场景及目标:①用于研究阶梯式碳交易政策下综合能源系统的低碳经济调度策略;②支撑P2G-CCS技术与需求响应机制在IES中的仿真集成与性能评估;③作为撰写高水平学术论文(如EI/SCI收录)的技术基础与复现资源,推动碳中和背景下能源系统优化方向的创新研究。; 阅读建议:建议结合百度网盘提供的完整代码与资料包,按照模块逐步调试程序,重点理解目标函数的设计逻辑、碳交易成本的建模方式、约束条件的数学表达及求解器的配置方法,同关注多能耦合设备的建模细节,配合公众号“荔枝科研社”获取持续的技术支持与案例拓展。
内容概要:本文系统研究了基于卷积神经网络(CNN)与支持向量机(SVM)融合的CNN-SVM混合模型在数据分类预测中的应用,尤其聚焦于工业故障识别领域。通过Matlab平台实现,该方法首先利用CNN强大的多层次特征提取能力对原始输入数据进行深度特征学习,自动捕获关键局部模式与空间结构信息,随后将提取的高层特征作为输入传递至SVM分类器,借助SVM在高维空间中小样本条件下卓越的分类性能与泛化能力完成最终判别任务。文中详尽阐述了模型的整体架构设计、网络参数配置、训练优化流程及特征迁移机制,充分结合了深度学习在特征表达上的优势与传统机器学习在分类决策上的稳健性。实验部分通过实际故障数据集验证了该混合模型相较于单一CNN或SVM模型在分类准确率、鲁棒性和抗过拟合能力方面的显著提升,证明了其在复杂故障诊断任务中的有效性与先进性; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事故障诊断、模式识别、智能制造、电力系统监控或工业数据分析等相关领域的研究生、科研人员及工程技术开发者; 使用场景及目标:① 应用于旋转机械、电力设备、航空航天等领域的多类别故障识别与状态监测;② 掌握深度特征提取与传统分类器融合的技术路径,提升小样本、高噪声环境下数据分类的精度与可靠性;③ 为撰写高水平学术论文、开展科研项目或工程实践提供可复现的算法框架与完整代码支持; 阅读建议:读者应深入理解CNN与SVM的协同工作机制,重点分析特征提取层与分类层之间的接口设计,建议动手运行并调试所提供的Matlab代码,尝试在不同数据集上进行迁移实验与参数调优,以全面掌握该混合模型的应用技巧与优化策略。

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧