返回首页

日记简介
否,与atof函数没有错。什么是错的,是我的代码中使用它。我想这个小故事,将你一些有趣的和有趣的,所以我决定我的文章数更多的文章,写这一点的论述,揭露自己给你,亲爱的读者,你的嘲笑和大笑。
现在,有很多CP上的优秀文章,当然,我作出了贡献,但似乎很少有(如果有的话 - 当然,我没有找到任何,但话又说回来,我没"T看起来很辛苦)我们一天到一天的考验和磨难,我们做蠢事的文章。因此,我再次设置一个对所有人都难以启齿,害怕或智能写的东西写在CP的先例。在字里行间,你可能会发现触动心灵的东西(或您需要一个瓷总线上的自旋)。
了一些错误,实际上并没有愚蠢和说明,即使有最好的单元测试,我们不能每应急测试。这是一个故事我是如何搞砸了一段代码,工作了一个月,直到有一天,我们从供应商的发票,好,过大,我的软件来处理的金额。设置舞台

你们当中有些人知道我的两个船厂在"税我"的状态,否则作为康涅狄格,一些合同工作。在康涅狄格州的一切征税,并有一切费用 - 连的海滩。事实上,总督罗兰,刚刚连任,是因为项目1,500,000,000元,为明年的赤字国家的汽车办事处部的一半。现在,这一切,做我的错误或本文,除了一个非常大的数额特别特点。出人头地,但我自己。
会计职能之一,要求供应商的发票,并核对采购订单进入系统的运费。邮政署在这一点上,可以关闭和客户(S)的部件和任何运费由船厂的费用帐单。因此,运费怎么得到分布,你可能会问?好了,运费是基于一个项目的数量*整个发票金额的一部分成本的百分之分布。有没有其他方式,这样做是因为我们不知道的东西的重量,这实在是如何收取运费。因此,它意味着一个家伙买了$ 5,000元雷达是要支付大部分货运时,有另一个人购买为5雄鹿队在同一张发票的铅镇流器500磅块。没有人说,生活是公平的。没有人说我的例子有任何现实的关系。
现在,注意在这个画面拍摄,这是检查的问题事发后,而对供应商的成本是$这部分(这是顺便说一个12V泵)162.88,我的软件有计算认为,保理业务在运费37.56,部分实际成本高达$ 1,304.86!
噢,我的。这是不好的。船厂保持"调整成本"这是一个移动平均线的一部分,加上运费的实际价格为每个存货项目。移动平均每个部分是购买时进场。调整后的成本计算4/5th"目前的成本,加上新的成本1/5th小号。这样,我们可以慢慢修改我们的库存成本。现在,这162元的部分,我已经添加了存货价值1300元以上。
不用说,我们的会计师不开心。跟我来。图形用户界面和数据采集
所以,让我们跟踪到这是如何发生。
首先,显示在屏幕上的信息的GUI看起来像这样(这是一块):GUI:ReceiveCheckTabDLG nosize真DLG标题"过程的供应商Invoicequot;字体("MS无Serifquot;,8)结束。在(0,20)的大小(100,15)字体静S1 (二)"的MS Sans Serifquot;,8,标题"选择部分:"结束。ListControl的lcCheckItems(0,35)的大小(465,120) 存储rcvCheckIdx 列表存储rcvCheckList 头("确定quot;:40C, ID:0 partID:0 "WO / Deptqu​​ot;:70 "鬻。 #quot;:80 "Qtyquot;:50 费用$":65R,quot; "共有":70R, AdjustedCost:0 MSRPCost:0 MarkupOption:0 标记:0 ... ...) 与选项(可编辑网格) 选择ScriptMgr.RunMacro(dp_macroName,SelectRcvCheckItem) 双击ScriptMgr.RunMacro(dp_macroName,RcvShowPartInfo2)结束。... ...按钮btnClosePO在大小(480,220)(100,20)标题quot;关闭POquot;  0; 选择ScriptMgr.RunMacro(dp_macroName,ClosePO)结束。... ...GUIEND
不看起来像你见过的GUI,它呢?嗯,这是因为它是我,我为我所有的C项目使用的C / MFC中的应用自动化层的一部分。我相信聪明的读者可以在截图中提出的到GUI ListControl的关联规范。
现在,这里的数据库查询,加载rcvCheckList矩阵:DBMgr.QueryMultiRow(dp_DB,MYDB,"选择 a.CHECKED, 60; a.ID, a.PARTNUM_ID, g.WO_NUMBER,& #160; f.VENDOR_PARTNUM, a.QTY, a.VENDOR_COST, VAL(a.QTY)* VAL(a.VENDOR_COST) b.ADJUSTED_COST, b.MSRP_COST, b.MARKUP_OPTION, b.MARKUP, a.PROBLEM_FLAG, f.ID, g.WO_NUMBER, a.COMMENT, 0 &# 160; "每"a.BASE_QTY'h.NAME "放养单位为"i.NAME h.ID, i.ID,  60;0 0 0从 PO_ITEM Å,  0;存货b, 销售商C PURCHASE_ORDER ð  0; VENDOR_PART f WORKORDER克, H室  60; 单元I其中 b.ID = a.PARTNUM_ID和d.ID = a.PO_ID和c.ID = d.VENDOR_ID和d.ID = {rcvID} g.ID = a.WO_ID和f.PARTNUM_ID = a.PARTNUM_ID VAL(f.BASE_QTY)= VAL(a.BASE_QTY) f.VENDOR_ID = d.VENDOR_ID和a.UNIT_ID = f.UNIT_ID h.ID = f.UNIT_ID和i.ID = b.STOCKING_UNIT_ID为了 a.IDquot;,rcvCheckList)
其次是一些数据的调整和列表控件:... ...DataMatrix.Iterate(dp_iterateMatrix,rcvCheckList,我,AdjustCheckList,0)Number.CommaFormat({rcvCheckTotal} dp_formatNumber,rcvCheckTotal,0.2%LF)WinMgr.SetListControlEditStyle(dp_EditStyle ReceiveCheckTab,lcCheckItems,0,YESNO)WinMgr.UpdateAllControls(dp_viewName,ReceivePartsTab)... ...宏:AdjustCheckListMath.RPN(dp_RPN,"{rcvCheckTotal} {rcvCheckList(7 {I})} rcvCheckTotal STOquot;)Number.Format(dp_formatNumber,rcvCheckList(6 {I}),{rcvCheckList(6 {I})},%0.4 LF)Number.Format(dp_formatNumber,rcvCheckList(7 {I}),{rcvCheckList(7 {I})},%0.2 LF)Number.Format(dp_formatNumber,rcvCheckList(8 {I}),{rcvCheckList(8 {I})},%0.4 LF)Number.Format(dp_formatNumber,rcvCheckList(9 {I}),{rcvCheckList(9 {I})},%0.4 LF)Number.Format(dp_formatNumber rcvCheckList(10,{I}),{rcvCheckList(10,{I})},0.4%LF)Number.Format(dp_formatNumber rcvCheckList(11,{I}),{rcvCheckList(11,{I})},0.4%LF)结束。MACROEND
对于那些你不熟悉我的AAL的脚本语言(和大家),在大括号{}的事返回自己的价值。例如,{rcvCheckList(6 {I})}返回rcvCheckList矩阵第i行第6列的值。 "RPN"是指"逆波兰表示法",这是一个基于堆栈的处理器,著名的惠普计算器。
现在,你有,精明的读者,已经实现了我的愚蠢的错误,并都在笑我吗??如果没有,请继续阅读。关闭邮政署
当按下"关闭PO"按钮,程序开始执行以下脚本:宏观:ClosePOScriptMgr.VerifySelection(dp_verifySelection ClosePO,{rcvID},-1,"请选择一个PO.quot;)DBMgr.QuerySingleRow(dp_DB,MYDB "选择货运验证,有一个采购订单操作。然后它当前的采购订单运费,然后遍历上PO的项目,跳过已处理(处理延期交货)的项目,然后计算应该为特定的行项目分布货运收费:宏:GetLineItemFreight跳过已计费项目(处理延期交货)DBMgr.QuerySingleRow(dp_DB,MYDB "选择处理LT; billedgt; PO_RECEIVE其中PO_ITEM_ID = {rcvCheckList(1,{I})} RECEIVE_DATE递减,RECEIVE_TIME descquot秩序;)ScriptMgr.VerifySelection(dp_verifySelection,GetLineItemFreight,{嘴},1,"")共有= SUM(数量*费用),项目= {rcvCheckTotal}每个行项目:ItemFreight = TotalFreight *(数量*成本)/ TotalCostMath.RPN(dp_RPN,"{totalFreight} 60; {rcvCheckList(7 {I})} {rcvCheckTotal} / * itemFreight STOquot;)WinMgr.Message(dp_message "Infoquot; &# 160; "totalFreight = {totalFreight}, 7,I = {rcvCheckList(7 {I})}, rcvCheckTotal = {rcvCheckTotal}, itemFreight = {itemFreight}")
对于我们的名单中的第一项:totalFreight = 37.56 数量*成本= 162.88  0;采购订单总额(rcvCheckTotal)= 1,987.03

据测算,这应指派了3.08美元的运费的项目。相反,我们得到一个运费$ 6117.77,说明我们的小调试信息!这是因为如果宝总= 1美元,我们只是乘以运费和项目的成本! (clue!)下一站,RPN功能。RPN功能
的RPN功能实在是微不足道,不值得评论。所有的运营商是从一个基类,和实际执行的操作的方法的派生,围棋是一个虚拟的method.void的RPN:转到(无效){ (RPN [0]) { AutoString令牌= GetToken(RPN); RPNOperator * OPER = FindOperator(令牌); & #160; (歌剧) {   ; AutoString结果;   ; 开关(OPER - GT; GetNumParams())  60; { 案例一: {  0; AutoString V = valueStack.top();  0; valueStack.pop(); & #160; =操作GT;转到(V); & #160; 打破;   ; } 案例二: { AutoString V1 = valueStack.top();  0; valueStack.pop(); & #160; AutoString V2 = valueStack.top();   ; valueStack.pop(); &# 160; =操作GT;转到(V1,V2);  0; 打破; &# 160; }  60;} (结果="";)  0; {   ; valueStack.push(结果); &# 160; } } 其他 60; { valueStack.push(令牌); } }}
现在让我们来看看一个特定的功能,在这种情况下的分工功能:AutoString RPNOperatorDivide:围棋(AutoStringamp; V1常量,常量AutoStringamp; V2){ 返回AutoString(atof(V2)/ atof(V1)); }可以简单吗?跟踪到这,我们发现:V1 ="1,987.03 quot;V2 ="; 162.88quot";
别急!!的BUG!
atof函数是太简单了!鉴于"1,987.03",它返回1.0000!!
为什么我们不能看到这之前呢?那么,一个测试,这个代码是低于1000美元的发票上。其次,我后来在修改剧本以逗号格式的数字。第三,船厂并没有得到太多发票超过1000美元,因此,我们去了好一阵子沿这个问题发生之前。"修复
不管你信不信,我正是此之前相同的错误,但修复它的权利,而不是我选择了不同的解决方案,具体到手头的问题,从而得到了相同的错误位再次。一般的解决方法是修复在RPN代码剥离出来的逗号。当然,这需要改变方法的签名,因为他们是const引用before.AutoString RPNOperatorDivide:GO(AutoString V1,AutoString V2){ v1.Replace("",""); v2.Replace("",""); &# 160;返回AutoString(atof(V2)/ atof(V1));}结论
本美,AAL的技术,现在这个问题是永远在我所有的书面申请,与AAL的固定。因为RPN功能mathAtmtn.dll,我只需要更新DLL,而不是重新编译每次我使用该技术的书面申请。
现在,有另一个在这段代码中的错误。护理猜测它是什么?后记
我的女友是给了我一个真正的硬时间。我告诉她我没有拼写检查这篇文章,她说:"马克克利夫顿!你怎么敢!"后,你得到其他人的情况下拼写检查!"当然,她马上发现了拼写错误! "你不会得到一个5,"她说。

回答

评论会员:colison 时间:2011/11/29
不要写评论
。本文的重点是什么
评论会员:?特里德纳姆 时间:2011/11/29
你知道为什么写评论时编码 SQL设计是编程的一部分,所以在SQL评论设计师和读者非常有帮助。ESP。当有大量的SQL写。