??xml version="1.0" encoding="utf-8" standalone="yes"?>美国一级片在线免费观看视频,中文字幕亚洲专区,国产亚洲欧美色http://www.aygfsteel.com/poower/zh-cnFri, 20 Jun 2025 00:44:10 GMTFri, 20 Jun 2025 00:44:10 GMT60今天开始写博客http://www.aygfsteel.com/poower/archive/2010/02/25/313951.htmlpoowerpoowerThu, 25 Feb 2010 13:29:00 GMThttp://www.aygfsteel.com/poower/archive/2010/02/25/313951.htmlhttp://www.aygfsteel.com/poower/comments/313951.htmlhttp://www.aygfsteel.com/poower/archive/2010/02/25/313951.html#Feedback0http://www.aygfsteel.com/poower/comments/commentRss/313951.htmlhttp://www.aygfsteel.com/poower/services/trackbacks/313951.html

poower 2010-02-25 21:29 发表评论
]]>
oracle 备䆾与恢?/title><link>http://www.aygfsteel.com/poower/archive/2009/12/11/305553.html</link><dc:creator>poower</dc:creator><author>poower</author><pubDate>Fri, 11 Dec 2009 05:57:00 GMT</pubDate><guid>http://www.aygfsteel.com/poower/archive/2009/12/11/305553.html</guid><wfw:comment>http://www.aygfsteel.com/poower/comments/305553.html</wfw:comment><comments>http://www.aygfsteel.com/poower/archive/2009/12/11/305553.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/poower/comments/commentRss/305553.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/poower/services/trackbacks/305553.html</trackback:ping><description><![CDATA[#!/bin/ksh<br /> DATE=`date +%Y%m%d`<br /> <br /> export ORACLE_HOME=/oracle/app/db<br /> export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"<br /> <br /> <br /> DATE=`date +%Y%m%d`<br /> <br /> /oracle/app/db/bin/exp boss_v2/ owner=boss_v2 compress=n direct=y recordlength=65535 file=./boss_v2$DATE.dmp log=./log/boss_v2$DATE.log<br /> if [ -f boss_v2$DATE.dmp ]<br /> then<br />   rm -f old.dmp<br />   mv new.dmp old.dmp<br />   mv boss_v2$DATE.dmp new.dmp<br /> fi    <br /> <img src ="http://www.aygfsteel.com/poower/aggbug/305553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/poower/" target="_blank">poower</a> 2009-12-11 13:57 <a href="http://www.aygfsteel.com/poower/archive/2009/12/11/305553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>firefox收藏?/title><link>http://www.aygfsteel.com/poower/archive/2009/11/20/303108.html</link><dc:creator>poower</dc:creator><author>poower</author><pubDate>Fri, 20 Nov 2009 13:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/poower/archive/2009/11/20/303108.html</guid><wfw:comment>http://www.aygfsteel.com/poower/comments/303108.html</wfw:comment><comments>http://www.aygfsteel.com/poower/archive/2009/11/20/303108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/poower/comments/commentRss/303108.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/poower/services/trackbacks/303108.html</trackback:ping><description><![CDATA[另外Q?span class="relatedlinks-highlight">FireFox</span>?span class="relatedlinks-highlight">收藏?/span>Q书{)也可以通过菜单选项直接导出Q具体方法是Q打开<span id="wmqeeuq" class="relatedlinks-highlight">Firefox</span>Q点?#8220;书签 -> 书签理”启动书签理器,点击“文g -> 导出”来备份现有的书签。在另一台机器上Q再用书{“导入”功能把备份的书签导入到新?span class="relatedlinks-highlight">Firefox</span>的配|中卛_? <img src ="http://www.aygfsteel.com/poower/aggbug/303108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/poower/" target="_blank">poower</a> 2009-11-20 21:34 <a href="http://www.aygfsteel.com/poower/archive/2009/11/20/303108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>L面试扑ֈ理想员工Q非官方的面试技术指?/title><link>http://www.aygfsteel.com/poower/archive/2008/11/04/238702.html</link><dc:creator>poower</dc:creator><author>poower</author><pubDate>Tue, 04 Nov 2008 13:29:00 GMT</pubDate><guid>http://www.aygfsteel.com/poower/archive/2008/11/04/238702.html</guid><wfw:comment>http://www.aygfsteel.com/poower/comments/238702.html</wfw:comment><comments>http://www.aygfsteel.com/poower/archive/2008/11/04/238702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/poower/comments/commentRss/238702.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/poower/services/trackbacks/238702.html</trackback:ping><description><![CDATA[<div class="wmqeeuq" id="maincontent"> <h1>L面试扑ֈ理想员工Q非官方的面试技术指?/h1> <div id="wmqeeuq" class="pullquote"> <p>q?</p> <p>本文作者Joel Spolsky 是纽U市一家Y件公司Fog Creek Software的创始h。他毕业于耉大学Q曾分别在美国微软、Viacom、Juno{公怓Q软g设计师、经理职位。本文来自于《祖儿谈软g》,文章原名为《轻N试找到理惛_工——非官方的面试技术指南》,作者最初本意是?/p></p> </div> <p class="submenu"><a href="file:///C:/">??/a> > <a >嵌入式开?/a> > <a >语言与工?/a> </p> <p>作?周思博 (Joel Spolsky   更新日期:2005-05-22<br /> 来源:chinese.joelonsoftware.com   览ơ数: <script src="http://www.upsdn.net/view.php?id=495" type="text/javascript"></script></p> <p><font color="#808080" size="2">译: Chen Bin    ~辑Q?Rick Ju    2000q??3?/font><br /> </p> <p>雇䄦合适的人对于Fog Creek软g公司来说是非常关键的。在我们q个领域Q有三类人可以挑选。在一个极? 是哪些؜q来? 甚至~Z最基本的工作技? 只要问这cMh两三个简单的问题Q再M下他们的历,可以轻易地剔除他们。另一个极端的cd?<a target="_blank">才华横溢的超U明?/a> q些Z仅ؓ了好玩就用汇~语a为Palm PilotQ一U手掌电脑)写了一个LispQ一Uh工智能编E语aQ编译器。在q两U极端类型中间的是一大群不能定水^的候选者,也许他们中的某些q些什么?q里的关键是明白明星和那一大堆属于中间cd的h的区别,因ؓFog Creek软g公司只雇佣超U明星。下面我要介l一些找U明星的技巧?</p> <p>Fog Creek公司最重要的雇佣标准是: </p> <blockquote><strong> <p>有头? q且<br /> 完成工作</p> </strong></blockquote> <p>是q些了。符合这h准的人就是我们公叔R要的员工了?Cq条标准?每天上床前背诵这条标准。我们公司的目标之一是雇䄦拥有q样?em>潜质</em>的hQ而不是雇佣懂某些技术的人。Q何h所拥有的某些具体技术都会在几年内过Ӟ所以,雇䄦有能力学习新技术的人,要比雇䄦那些只在q一分钟知道SQL~程是怎么回事的h对公司更划算一炏V?/p> <p><strong>有头?/strong>实是一个很隑֮义的品质。但是让我们看一些在面试时能提问的一些问题,通过q些提问Q我们可以找出拥有这U品质的人?strong>完成工作</strong>非常关键。看h<strong>有头?/strong>但是不能<strong>完成工作</strong>的hl常拥有博士学位Q在大公司工作过Q但是在公司中没有h听他们的Q因Z们是完全q实际的。比起准时交zdQ他们宁愿对于一些学院派的东西沉思。这些h׃下特性而可以识别出来。他们L爱指Z个根本不同的概念间的怼性。例如,他们会说“Spreadsheets是一U特D的~程语言”,然后׃个礼拜写一动人的Q智慧的白皮书。这白皮书了,作ؓ一个编E语aQspreadsheet关于计算语言Ҏ的Ҏ面面。聪明,但是没用?/p> <p>现在Q我们来谈谈<strong>完成工作</strong>但是没有<strong>头脑</strong>的h。他们爱做蠢事。从来也没有考虑q将来得靠他们自己或者别的什么h来亡补牢。通过刉新的工作,他们成ؓ了公司的<em>负?/em>而不是资产。因Z们不仅没有ؓ公司贡献价|q浪费了好员工的旉。这些h通常到处_脓大堆的代码,而不愿意写子E序。他们是完成了工作,但是不是以最聪明的方式完成工作?/p> <p>面试时最重要的法则是: </p> <blockquote><strong></strong> <p><strong>做决?/strong></p> </blockquote> <p>在面试结束时Q对于被面试者,你不得不做一个直截了当的军_。这个决定只有两个结果:<strong>雇䄦</strong>或?strong>不雇?/strong>. 回到你的电脑前,立刻用电子邮仉知招聘负责Z的决定。电子邮件的主题应该?strong>雇䄦</strong>或?strong>不雇?/strong>。接着你需要在正文中写两段来支持你的决?</p> <p>没有其他的答案?em>永远不要</em>_“雇䄦你,但是不能在我的团队中”。这是非常粗鲁的Q因Z在暗C应试者没有聪明到能有和你一起工作的资格Q但是以他的头脑适合q入那些天生输家队伍。如果你发觉自己被诱惑,惌出那?#8220;雇䄦你,但是不能在我的队伍中”Q那么就单的把这句话变成“不雇?#8221;再说出口。这样就没事了。甚臛_果某个h在特定领域很能干Q但是在别的队伍中将会表C好,也是<strong>不雇?/strong>。事物变化的如此之快Q我们需要的是在M地方都能成功的h。如果某些情况下你发C一个白痴专Ӟ拥有某些Ҏ能力的白_Q这个专家对于SQL非常Q非常,非常的精通,但是除此之外什么也学不会,<strong>不雇?/strong>。在Fog Creek公司他们没有来?/p> <em></em> <p><em>永远不要</em>_“也许Q我吃不?#8221;。如果你吃不准,意味着<strong>不雇?/strong>。看Q比你想象的Ҏ的多。吃不准Q就说不Q同P如果?em>不能作出军_</em>Q那意味着<strong>不雇?/strong>。不要说Q?#8221;嗯,雇䄦Q我xq样的。但是关?..Q我想知?...”。这U情况就?strong>不雇?/strong>?/p> <p>最重要的是Cq点Q放弃一个可能的好h要比招进一个坏人强Q译者按Q中国有位哲q,宁可错杀一千,不可放过一个,呵呵Q。一个不合格的求职者如果进入了公司Q将要消耗公司大量的金钱和精力。其他优U员工的还要浪Ҏ间来修复q个人的错误。如果现在你q在犹UQ?strong>不雇?/strong>?/p> <p>如果你是Fog Creek公司的面试官Q当你拒l了大量的应聘者时Q不要ؓFog Creek公司因此雇不到MZ而忧虑。这不是你的问题。这是招聘负责h的问题。这是h力资源部的问题。这是JoelQ译者注: Fog Creek公司的老板Q本文作者)的问题。但<em>不是</em>你的问题。不停地问自己,哪种情况更糟p?一U情冉|我们变成了一个庞大的Q糟p的软g公司Q充斥着许多脑袋I空如可可果壳的家伙Q另一U情冉|我们是一个小而高品质的公司。当Ӟ扑ֈ优秀的应聘者(q聘用他们)是很重要的。找到有头脑而且完成工作的h是公怸的每个员工的日常工作之一。但是当你作为Joel Creek公司的一员真的开始面试一个应聘者时Q要装作现在正有很多优秀的hx破头挤进Fog Creek公司。MQ无论找C个不错的应聘者是多么的难Q永q不要降低你的标准?/p> <p>但是你如何作出雇佣或者不雇䄦q样艰难的决定?你只要在面试q程中不停地问自己:<em>q个?strong>有头?/strong>吗?</em>q个<em><strong>完成工作</strong>吗?</em>要作出正的回答Q在面试时你必须问对问题?/p> <p>开个玩W,下面我要问个有史以来最差的面试问题: “Oracle 8i中的数据cdvarchar和varchar2有什么区?#8221;q是一个可怕的问题。掌握这U琐的技术细节和Fog Creek公司想雇佣你之间没有M联系。谁会去记这U东西?如果有在U帮助,你可以在15U内扑ֈ{案?/p> <p>实际上,q有更差的问题,{会儿我会谈到的?/p> <p>现在我们要谈到有的部分了:面试时提哪些问题。我的面试问题清单来自于我去微Y公司扄一份工作的l历。这里实际上有几百个微Y面试问题。每个h都有偏爱的问题。你也可以发展一套自q面试问题以及面试的个人风|q样你就可以比较ҎC?strong>雇䄦/不雇?/strong>的决定。以下是我成功用过的一些面试技巧,</p> <p>在面试前Q我M遍应试者的历,然后在一张纸片上随便写以下我?em>面试计划</em>。这个计划实际上是我要问的问题清单。以下是一个例子(用来面试E序员的Q:</p> <ol> <ol><strong> <li>介绍 <li>应试者参加过的项? <li>无法回答的问? <li>C语言函数 <li>你满意吗Q? <li>设计问题 <li>挑战 <li>你还有什么问题? </strong></li> </ol> </ol> <p>在面试前Q我非常Q非常当心,避免自己先入Z。如果在面试前你已l想当然地认为,一个麻省理工的博士一定是一个有头脑的h。那么在接下来的一时的面试时间内Q无论那个麻省理工的博士说什么都不能改变你的最初印象。如果在面试前你p个应试者是个傻瓜,那么他面试时说什么也无济于事。面试就象一个非常精巧的天^。一时的面试结束后p对一个h下结论是不容易的Q但是你又必d面试l束后得出结论)。一些不L的细节可能会影响最后的l论。如果你在面试开始前对于应试者有了一点了解的话,好比天q的某一端加上了重重的砝码。这样面试本w就会变得没有用处了。以前有一ơ在面试前,一个招聘负责h跑进我的戉K_“你肯定会׃q个家伙?" 对一个男? 天哪Q这直让我发疯。我本来应该_“嗯,如果你这么确定我会喜Ƣ他Qؓ什么你不干脆雇佣他,何必让我费旉来面试?”但是那时我还太年dE? 所以还是面试了那个人。当q个家伙开始说一些蠢话时Q我对自pQ?#8220;哇塞Q这应该是个例外情况Q也许是大智若愚?#8221;我开始带着玫瑰色眼镜看他了。于是我以说<strong>“雇䄦”</strong>l束了面试,虽然他是一个糟p的面试者。接下来发生了什么事Q除了我Q其他的面试官都_<strong>不要雇䄦</strong>q个人。教训是Q不要听别的人的话,在面试应试者前不要四处打探q个面试者的情况。最重要的是不要和别的面考官谈论应试者,除非你们都已l作Z独立的判断。这才是U学的做法?/p> <p>作ؓ面试步骤的第一步,<em>介绍</em>的目的是让应试者放L。我通常?0U钟Q讲一下我是谁Q接下来面试会如何进行。我L使得应试者确信,我们兛_的是他(她)<em>如何</em>解决问题的,而不是他Q她Q的最l答案是对还是错。顺便说一下,面试Ӟ你不要和应试者隔着一个桌子坐着Q否则在你和面试者之间就有了一个障,q且暗示着一U比较正式严肃的气氛Q这样应试者就很难放松了。更好的办法是把桌子靠墙攄Q或者和应试者坐在桌子的同一边,q样有助于应试者放松。只有应试者不会因为紧张而表现失常,你才能更有效的进行面?</p> <p>W二步的内容是问应试者最q做了些什么项目。对刚毕业的学生, 如果有论文就问问论文, 没有的话, 问问他们做q什么很喜欢的大作业.例如Q有时候我会问一下,“你最喜欢上学期哪门课E?不一定要和计机相关的?#8221;事实上,如果应试者回{的评和计机没有关系Q我会比较高兴。有时候你会发现这个计机pd届生选择了尽可能的计算机相兌E,但是却选修了很多和音乐相关的课E。但是他Q她Q却说最喜欢的课E是《面向对象数据库》。哼|不错? 不过如果你直接承认你喜欢音乐胜于计算? 而不是在q儿胡说八道的话, 我会更高兴一炏V?/p> <p>当面试有工作l验的hӞ你可以让他们谈一下前一份工作?/p> <p>我问q个问题的目的是在寻找一样品质:<em>热情</em>。在应试者谈CQ她Q最q做q的目Ӟ你观察到以下q象都是不错的: </p> <ul> <li>谈到他们做过的项目时变得热情z溢Q他们的语速更快,语言更生动活泹{这说明他们Ҏ些东西有兴趣Q有热情Q因为现实中有许多hҎ做的目Ҏ漠不兛_呢)。即使他们激动地表达对做q的目的负面感情,q也是一个好的信受?#8220;我曾lؓ上一个老板安装Foo Bar Mark IIQ但他是个傻瓜!”表现出热情的人就是我们要雇䄦的h。差的应试者对工作Ҏ׃兛_Q所以根本不会激动。一个非常好的信h当应试者很Ȁ动地谈论上一份工作,以至于暂时忘C他们正在被面试。有时候应试者刚开始面试时表现的很紧张 -- q是很正常的现象Q所以我通常忽略不计。但是当他们谈到单色计算艺术QComputational Monochromatic ArtQ时Q这个家伙变得极端兴? 一炚w不紧张了。不错,我喜Ƣ这L应试者,因ؓ他们兛_他们做的事。(什么是单色计算艺术Q拔掉你的电脑显C器的电源就可以看到了) <li>能认真地去解释事情。某些h被我拒掉的原因就是他们不会用普通h能明白的语言去解释他们做q的目。很多工U专业的人L以ؓ所有h都知道Bates理论Q译者注: Bates TheoremQ一U经学的理论)或者Peano公理l(译者注: Peano's AxiomsQ数Z的一些定理)是什么。如果应试者开始满口行话了Q让他们停一停,然后你说Q?#8220;能帮我个忙吗Q就是ؓ了练习一下,你能把刚才说的用我老祖母也能理解的话说一遍吗Q?#8221;但即便如? 有些是l用那些术语, 而且Ҏ没法让h明白他们在说什么。天哪! <li>如果q个目是一个团队项目,看看他们是否在有承担领导责Q的迹象?一个应试者可能会_“我们用的是XҎQ但是老板说应该是YQ而客戯应该是Z?#8221;我会问,“那么<em>?/em>怎么做的Q?#8221;一个好的回{可能是“我设法和团队中别的h开了个会,然后一hZ办法...”坏的回答看v来象Q?#8220;嗯,我什么也<em>不能</em>做。这L问题我解决不了?#8221;CQ?strong>聪明q且能完成工?/strong>。要搞清楚某人是否能<strong>完成工作</strong>的一个办法就是看看他Q她Q过L否們֐于完成Q务。事实上Q你可以d要求他们l你个例子证明他们能担Q领导作用Q完成Q务。-例如克服公司的陈规陋习?</li> </ul> <p>现在我们谈谈清单上的W三ƾ,<em>无法回答的问?/em>。这很有。这个主意的关键在于问一些不可能有答案的问题Q就是想看一下应试者怎么办?#8220;襉K图有多少眼科ȝQ?#8221;“华盛纪늢有多重?”“z杉机有多少加a站?”“U约有多钢琴调韛_Q?#8221;</p> <ul> <li>聪明的应试者猜C不是要测验他们的专业知识Q他们会U极地给Z个估计?#8220;嗯,z杉机的人口是七百万Q每个hq_拥有2.5辆?..”当然如果他们的估计完全错误了也没有关pR重要的是他们能U极地试着回答问题。他们可能会试着搞清楚每个加油站的储量?#8220;嗯,需要四分钟l一个储油罐加满油,一个加油站有十个a泉|天运行十八个时...”他们也可能试着从占地面U来估计。有? 他们的想法的创造力让你吃惊. 而有? 他们直接要一个LA的黄去查。这都是好迹象? <li>不聪明的应试者则被难住了。他们目瞪口呆地望着你,好像你来自火星。你不得不提C:“嗯,如果你想建立一个象z杉机那么大的城市,你需要徏立多个加a站?”你还可以提示他们Q?#8220;加满一个储油罐要多长时_”不过Q这些榆木疙瘩脑袋还是只会坐在那里发呆,你得拖着他们往前走才行。这cMh不会解决问题Q我们可不要q样的h?</li> </ul> <p>关于~程问题Q我通常要求应试者用C语言写一些小函数。以下是我通常会出的题目: </p> <ol> <li>一个字W串逆序 <li>一个链表(linked listQ逆序 <li>计算一个字节(byteQ里有多bit被置1 <li>搜烦l定的字节(byteQ? <li>在一个字W串中找到可能的最长的子字W串Q该字符串是由同一字符l成? <li>字符串{换成整数 <li>整数转换成字W串Q这个问题很不错Q因为应试者要用到堆栈或者strev函数Q?</li> </ol> <p>注意Q通常你不会希望他们写的代码多?行,因ؓ你没有时间理解太长的代码?/p> <p>现在我们来详l看一看其中几个问? W一个问? 逆序一个字W串。我q辈子还没有见过那个面试者能把这题目一ơ做寏V所有的应试者都试图动态生成缓冲区Q然后将逆序的字W串输出到该~冲Z。问题的关键在于Q谁负责分配q个~冲区?谁又负责释放那个~冲区?通过q个问题Q我发现了一个有的事实Q就是大多数认ؓ自己懂C的h实际上不理解指针和内存的概念。他们就是不明白。这真叫人吃惊,无法惌q种Z能做E序员。但他们真的是Q这个问题可以从多个角度判断应试者:<br /> </p> <ul> <li>他们的函数运行快吗?看一下他们多此调用?em>strlen</em>函数。我曄看到应试者写的strrev的算法竟然只有O(n^2) 的效率,而标准的法效率应该是O(n)Q效率如此底下的原因是因Z们在循环中一ơ又一ơ调?em>strlen</em>函数? <li>他们使用指针q算吗(译者按Q原文ؓpointer arithmeticQ指的是加减指针变量的|Q用指针运是个好现象。许多所谓的“CE序?#8221;竟然不知道如何用指针运(pointer arithmeticQ。当Ӟ我在前文说过我不会因为应试者不掌握一U特定的技巧而拒l他。但是,理解C语言中的指针不是一U技巧,而是一U与生俱来的才能。每q一所大学要招q?00多个计算机系的新生,所有这些小孩子4岁就开始用BASIC语言在Atari 800s写冒险游戏了。在大学里他们还学Pascal语言Q学得也很棒。直到有一天他们的教授讲了指针的概念,H然Q?em>他们开始搞不懂?/em>。他们就是不能再理解C语言中的M东西了。于?0%的计机pd生{pd学政d。ؓ了挽回面子,他们告诉朋友Q他们之所以{pL因ؓ他们计算机系׃貌美的异性太。许多h注定脑子里就没有理解指针的那根u。所以说理解指针是一U与生俱来的品质Q而不是一U单U的技巧。理解指针需要脑子{好几个弯Q某些h天生不擅长{q几个弯?/li> </ul> <p>W三个问题可以考考面试者对C的位q算的掌握,但这是一U技巧,不是一U品质,所以你可以帮助他们。有的{他们徏立了一个子函数用来计算byte中ؓ1的位的数目,然后你要求他们优化这个子函数Q尽量加快这个函数的q行速度。聪明的应试者会使用查表法Q毕竟这个表只有 256个元素,用不了多内存)Q整个表只需要徏立一ơ。跟聪明的应试者讨Z下提高时_I间效率的不同策略是十分有意思的事情. q一步告诉他们你不想在程序启动时初始化查询表。聪明的面试者可能会使用~冲机制Q对于一个特定的byteQ只有在W一ơ被查询时进行计,然后计算l果会被攑օ查询表。这样以后再被查询时直接查表p了。而特别特别聪明的面试q会试有没有徏立查询表的捷径,如一个byte和它的置1的bitC间有没有规律可@Q?nbsp;</p> <p>当你观察应试者写C代码Ӟ以下一些技巧会对你有帮助: </p> <ul> <li>事先向应试者说明,你完全理解,没有一个好的编辑器光在U怸写代码是困难的,所以你不在乎他们手写的代码是否看上M整洁。你也完全明白没有好的编译器和调试器Q很隄一ơ就写出完全没有bug的程序,所以请他们不必为此担心? <li>好程序员的标志:好程序员写完“{”W号后,通常立刻跟上“}”W号Q然后再在当中填上代码。他们也們֐于用命名规则,虽然q个规则可能很原始。如果一个变量用作@环语句的索引Q好E序员通常使用可能少的字Wؓ它命名。如果他们的循环语句的烦引变量的名字是CurrentPagePositionLoopCounterQ显而易见他们写代码的经验还不够多。偶,你会看到一个CE序员写下象<strong>if (0==strlen(x))</strong>一L代码Q?em>帔R</em>被放?=的左辏V这是非常好的现象。这说明他因为L把=和=Q搞P已经自己Lq种习惯以避免犯错? <li>好的E序员在写代码前会订一个计划,特别是当他们的代码用C指针时。例如,如果你要求逆序一个链表,好程序员通常会在U的一边画上链表的草图Qƈ表明法中的索引指针当前Ud到的位置。他们不得不q样做。正思h是不可能不借助草图开始写一个逆序链表的程序的。差的程序员立刻开始写代码?</li> </ul> <p>不可避免的,你会在他们的E序中发现bugQ于是我们现在来CW五个问题:<strong>你对代码满意吗?</strong> 你可能想问,“好吧Qbug在哪里?”q是来自地狱的一针见血的问题,要回{这个问题可要大费口舌。所有的E序员都会犯错误Q这不是问题。但他们必须能找到错误。对于字W串操作的函敎ͼ他们通常会忘记在输出~冲区加上字W串l束W。所有的函数Q他们都会犯off-by-one错误Q译者按Q指的是某个变量的最大值和最值可能会和正常值差1)。他们会忘掉正常的C语句l尾的分受如果输入是雉度字W串Q他们的函数会运行错误。如果malloc调用p|而他们没有ؓ此写好错误处理代码,E序会崩溃。一ơ就能把所有事情做对的E序员非?非常,非常地少.不过要是真的C一个的? 提问更有意思了. 你说,"q有Bug"。他们会再仔l地查一遍代码。这个时? 观察一下他们内心是否开始动摇了, 只是表面上勉强坚持说代码没有问题。MQ在E序员写完代码后Q问一下他们是否对代码满意是个好主意。就像Regis那样问他们!Q译者按QRegis Philbin是美国ABC电视|的游戏电视节目L人,他的口头是“q是你的最后的{案吗?”Q?/p> <p>W六部分Q关于设计的问题。让应试者设计某样东ѝJabe BlumenthalQExcel的原始设计者,喜欢让应试者设计房子。Jabe_曄有一个应试者跑到白板前Q画了一个方块,q就是他的全部设计。天哪,一个方块!立刻<strong>拒绝</strong>q样的家伙。你喜欢问什么样的设计问题?</p> <ul> <li>好的E序员会问更多的信息。房子ؓ谁造的Q我们公司的政策是,我们不会雇䄦那些在设计前不问设计的h。通常Q我会很烦恼我得打断他们的设计,?#8220;事实上,你忘记问q个房子是给谁设计的了。这个房子是l一长颈鹿造的?#8221; <li>W笨的应试者认计就像画画,你想M么就M么。聪明的应试者明白设计的q程是一pd艰难的权衡。一个很的设计问题是:设计一个放在街角的垃圾。想一想你得做多少权衡Q垃圄必须易于清空Q但是很难被偯Q易于放q垃圾,但是到狂风大作Q里面的垃圾不会被吹出来Q垃圄必须坚固而便宜。在某些城市Q垃圄必须特别设计Q以防恐怖分子在里面藏一个定时炸式V? <li>有创造力的应试者会l出有趣而独特的设计。我最喜欢的问题之一?em>为盲计一个放调味品的架子</em>Q译者按Q原文ؓspice rackQ老外的厨戉K有个专门放调呛_的架?上面放了很多罐|,里面装了各种各样的调料)通常许多应试者的是把布莱叶文Q一U盲Z用的文字Q刻在放调料的罐子上Q这h字会卯v来而变形。我到一个应试者,他的设计是把调料攑֜抽屉里,因ؓ他觉得水q_感知布莱叶文比垂直地做更方便。(试试看!Q这个答案这h创意Q我震惊!我面试了有一打得E序员,从来没有人想到过cM的答案。这h创意的答案确实跃q了普通h考虑问题的条条框框。仅仅因个答案太有创意了Q而且应试者别的方面还q得去,我雇佣了q个应试者,他现在已l成为Excel团队中一个优U的项目经理了Q译者按Q本文作者曾在微软工作过Q? <li>L争取一?em>定的了l?/em>。这也是<strong>完成工作</strong>的特质的一部分。有时候应试者会犹犹豫U不能作出一个决?试图回避困难的问题,留着困难的问题不作决定就直接向下q行,q很不好。好的应试者有一U推动事情自然地前进的們֐Q即使你有意把他们拖回来。如果关于某个话题的讨论开始原地打转变得没有意义了Q好的应试者会_“嗯,我们可以整天谈论q个Q但是我们得做点什么。ؓ什么我们不开?..” </li> </ul> <p>于是我们来到了第七部分,<strong>挑战</strong>。这部分很好玩。在面试中留心一? 当面试者的回答l对的百分之百毫无争议时, 你可以说: " ? {一下等一?" 然后׃两分钟玩一下魔鬼的游戏Q译者按Q原文ؓdevil's advocateQ魔ga人指的是q背自己的良知,为错误邪恶的观点辩护Q? C一定要在你可以肯定他正时和他争论?/p> <pre wrap="">q个很有意? <br /> </pre> <ul> <li>软弱的应试者会屈服。那我就和他?strong>拜拜</strong>了? <li>坚定的应试者会扑ֈ一个办法说服你。他们会以肯D_ȝ的口才来说服你,“也许我误会了你的意思,”他们q样开_但是正文仍是坚定地站E立场。这L人我?strong>雇䄦</strong>?</li> </ul> <p>不得不承认,面试双方的地位ƈ不是q等的。有可能应试者由于害怕你的权力而不敢于你争辩?strong>但是</strong>Q好的应试者有_的热情和勇气坚持正确的观点,他们׃热切希望说服你而会暂时忘记正在被面试。这L人就是我们要雇䄦的h?/p> <p>最后,可以问一下应试者有什么想问的。一些h喜欢看看应试者这时是否会问一些聪明的问题。这是市面上行的面试书c的标准技巧。我个h不在乎应试者问什么,因ؓq时我已l做了决定。麻烦在于,应试者也许已l见??个hQ进行了好几轮面试,他们可能很篏了,以至于不能ؓ每轮面试都准备一个聪明而独特的问题。所以如果他们没有可问的Q没关系?/p> <p>我L留下面试的最?分钟来推销我的公司。这很重要?em>即我不打算雇䄦眼前q个应试者?/em>如果你幸q的扑ֈ一个很的应试者,你当然愿意做M事情说服他(她)来你的公司。即使他们不是好的应试者,你也要尽力让他们为Fog Creek公司Ȁ动,q样面试l束时他们会对Fog Creek公司留下一个很好的印象。记住,应试者ƈ不仅仅是可能的雇员,他们也是֮Q也是我们公司的推销员。如果他们觉得我们的公司很棒Q他们也怼推荐朋友来面试?/p> <p>啊哈Q我记得我说q我会给Z些应该避免的非常不好的反面的试题例子?</p> <p>首先Q避免不合法的问题。有关种族,宗教Q性别Q出生国Q年龄,服役记录Q是否老兵Q性取向,生理障碍的问题都?strong>不合法的</strong>。即使他们的历说他们1990q在军中服役Q也不要问有关问题。也许这会让他们愉快地谈论在h战争中的l历。但是你的问题还是不合法的。如果简历上写着他们上过Technion in Haifa, 不要问他们是否是以色列h, 即只是Z闲谈, 因ؓq是q法? 下面有一个很好的不合法的例子?a >点击q里</a>有很多关于什么是q法的讨论。(但是q个|站的其余问题够愚蠢的。)</p> <p>其次Q不要在问题中给予应试者暗C,我们公司喜欢或者不喜欢什么样的员工。我能想到的一个例子是问应试者是否有孩或者是否结婚了。应试者也怼x们不喜欢有家庭拖累的员工?/p> <p>最后,不要问那些脑{急{弯的题目Q例?根火柴怎么拼出4个三角Ş。象q样的灵Z动的问题是不能看出应试者是否有“有头?完成工作”的品质?/p> <p>面试与其说是U学不如说是艺术。但是只要你C<strong>有头?完成工作</strong>q个原则Q你可以应对自如。有Z问问你的同事他们喜Ƣ的面试问题和答案。这是我们公司员工午饭时热衷的话题之一?/p> <p><font color="#808080"><font size="2"><span style="font-family: SimSun">本文最先用英文出版Q题?/span> </font></font><a ><font size="2">The Guerrilla Guide to Interviewing</font></a></p> <p>作者简?nbsp;  <span style="font-family: SimSun"><font color="#808080" size="2">Joel Spolsky 是纽U市一家小软g公司Q?/font><a ><font size="2">Fog Creek Software</font></a><font color="#808080"><font size="2">, 的创始h。他毕业于耉大学Q曾在美国微软公司,Viacom,  Juno 任Y件设计师及经理? <p> </p> </font></font></span><font size="2"></font> <p> </p> <a title="Print It" >[昄打印版本]</a> <h3 class="break">相关文章</h3> <ul> <li>No Relative Articles. </li> </ul> <h3 class="break">相关评论   <a onclick="window.open('/reply.html?495','reply','width=400,height=300,top=0,left=0');" href="javascript:void(0);">发表评论</a> </h3> <ul> <li>No Comments </li> </ul> </div> <img src ="http://www.aygfsteel.com/poower/aggbug/238702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/poower/" target="_blank">poower</a> 2008-11-04 21:29 <a href="http://www.aygfsteel.com/poower/archive/2008/11/04/238702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>x为嵌入式E序员应知道?x10个基本问?/title><link>http://www.aygfsteel.com/poower/archive/2008/11/04/238701.html</link><dc:creator>poower</dc:creator><author>poower</author><pubDate>Tue, 04 Nov 2008 13:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/poower/archive/2008/11/04/238701.html</guid><wfw:comment>http://www.aygfsteel.com/poower/comments/238701.html</wfw:comment><comments>http://www.aygfsteel.com/poower/archive/2008/11/04/238701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/poower/comments/commentRss/238701.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/poower/services/trackbacks/238701.html</trackback:ping><description><![CDATA[<div class="wmqeeuq" id="wrapper"> <div class="wmqeeuq" id="maincontent"> <h1>x为嵌入式E序员应知道?x10个基本问?/h1> <div id="wmqeeuq" class="pullquote"> <p>q?</p> <p>q是嵌入式CE序员的基本知识。作者在Embedded Systems Programming杂志上发表了很多嵌入式系l开发方面的文章?/p> </div> <p class="submenu"><a href="file:///C:/">??/a> > <a >嵌入式开?/a> > <a >语言与工?/a> </p> <p>作?Jones Nigel   更新日期:2005-04-08<br /> 来源:internet   览ơ数: <script src="http://www.upsdn.net/view.php?id=423" type="text/javascript"></script></p>         C语言试是招聘嵌入式pȝE序员过E中必须而且有效的方法。这些年Q我既参加也l织了许多这U测试,在这q程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外Q撇开面试的压力不谈,q种试也是相当有趣的?br />         从被面试者的角度来讲Q你能了解许多关于出题者或监考者的情况。这个测试只是出题者ؓ昄其对ANSI标准l节的知识而不是技术技巧而设计吗Q这是个愚蠢的问题吗Q如要你{出某个字符的ASCII倹{这些问题着重考察你的pȝ调用和内存分配策略方面的能力吗?q标志着出题者也许花旉在微Z而不是在嵌入式系l上。如果上qCQ何问题的{案??的话Q那么我知道我得认真考虑我是否应该去做这份工作?br />         从面试者的角度来讲Q一个测试也许能从多斚w揭示应试者的素质Q最基本的,你能了解应试者C语言的水q뀂不怎么P看一下这人如何回{他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择Q还是只是瞎蒙呢Q当应试者在某个问题上卡住时是找借口呢,q是表现出对问题的真正的好奇心,把这看成学习的机会呢Q我发现q些信息与他们的试成W一h用?br />         有了q些xQ我军_Z些真正针对嵌入式pȝ的考题Q希望这些o人头痛的考题能给正在扑ַ作的Z点帮助。这些问题都是我q些q实际碰到的。其中有些题很难Q但它们应该都能l你一点启q?br />         q个试适于不同水^的应试者,大多数初U水q的应试者的成W会很差,l验丰富的程序员应该有很好的成W。ؓ了让你能自己军_某些问题的偏好,每个问题没有分配分数Q如果选择q些考题Z所用,误行按你的意思分配分数?br /> <br /> <span style="font-weight: bold">预处理器</span>QPreprocessorQ?br /> <br /> 1 . 用预处理指o#define 声明一个常敎ͼ用以表明1q中有多秒Q忽略闰q问题)<br />         <span style="color: rgb(0,128,128)"> #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL</span><br /> 我在q想看到几g事情Q?br /> 1) #define 语法的基本知识(例如Q不能以分号l束Q括L使用Q等{)<br /> 2)懂得预处理器ؓ你计常数表辑ּ的|因此Q直接写Z是如何计一q中有多秒而不是计出实际的|是更清晰而没有代L?br /> 3) 意识到这个表辑ּ一?6位机的整型数溢出-因此要用到长整型W号L,告诉~译器这个常数是的长整型数?br /> 4) 如果你在你的表达式中用到ULQ表C无W号长整型)Q那么你有了一个好的v炏V记住,W一印象很重要?br /> <br /> 2 . 写一?标准"宏MIN Q这个宏输入两个参数q返回较的一个?br />         <span style="color: rgb(0,128,128)">#define MIN(A,B) Q(AQ?<= (B) ? (A) : (B)) </span><br /> q个试是ؓ下面的目的而设的:<br /> 1) 标识#define在宏中应用的基本知识。这是很重要的。因为在 <span style="color: rgb(102,51,102)"> 嵌入(inline)操作W?/span> 变ؓ标准C的一部分之前Q宏是方便生嵌入代码的唯一ҎQ对于嵌入式pȝ来说Qؓ了能辑ֈ要求的性能Q嵌入代码经常是必须的方法?br /> 2)三重条g操作W的知识。这个操作符存在C语言中的原因是它使得~译器能产生比if-then-else更优化的代码Q了解这个用法是很重要的?br /> 3) 懂得在宏中小心地把参数用括号括v?br /> 4) 我也用这个问题开始讨论宏的副作用Q例如:当你写下面的代码时会发生什么事Q?br />         least = MIN(*p++, b);<br /> <br /> 3. 预处理器标识#error的目的是什么?<br /> 如果你不知道{案Q请看参考文?。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去扑և象这U问题的{案。当然如果你不是在找一个书呆子Q那么应试者最好希望自׃要知道答案?br /> <br /> <br /> <span style="font-weight: bold">d@?/span>QInfinite loopsQ?br /> <br /> 4. 嵌入式系l中l常要用到无限@环,你怎么LC~写d@环呢Q?br /> q个问题用几个解x案。我首选的Ҏ是:<br /> <br /> while(1)<br /> {<br /> <br /> }<br /> <br /> 一些程序员更喜Ƣ如下方案:<br /> <br /> for(;;)<br /> {<br /> <br /> }<br /> <br /> q个实现方式让我为难Q因个语法没有确切表辑ֈ底怎么回事。如果一个应试者给个作为方案,我将用这个作Z个机会去探究他们q样做的基本原理。如果他们的基本{案是:"我被教着q样做,但从没有惛_qؓ什么?q会l我留下一个坏印象?br /> <br /> W三个方案是?goto<br /> Loop:<br /> ...<br /> goto Loop;<br /> 应试者如l出上面的方案,q说明或者他是一个汇~语aE序员(q也许是好事Q或者他是一个想q入新领域的BASIC/FORTRANE序员?br /> <br /> <br /> <span style="font-weight: bold">数据声明</span>QData declarationsQ?<br /> <br /> 5. 用变量al出下面的定?br /> a) 一个整型数QAn integerQ?<br /> b)一个指向整型数的指针( A pointer to an integerQ?<br /> c)一个指向指针的的指针,它指向的指针是指向一个整型数Q?A pointer to a pointer to an integeQr <br /> d)一个有10个整型数的数l( An array of 10 integersQ?<br /> e) 一个有10个指针的数组Q该指针是指向一个整型数的。(An array of 10 pointers to integersQ?<br /> f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integersQ?<br /> g) 一个指向函数的指针Q该函数有一个整型参数ƈq回一个整型数QA pointer to a function that takes an integer as an argument and returns an integerQ?<br /> h) 一个有10个指针的数组Q该指针指向一个函敎ͼ该函数有一个整型参数ƈq回一个整型数Q?An array of ten pointers to functions that take an integer argument and return an integer Q?br /> <br /> {案是: <br /> a) int a; // An integer <br /> b) int *a; // A pointer to an integer <br /> c) int **a; // A pointer to a pointer to an integer <br /> d) int a[10]; // An array of 10 integers <br /> e) int *a[10]; // An array of 10 pointers to integers <br /> f) int (*a)[10]; // A pointer to an array of 10 integers <br /> g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer <br /> h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer <br /> <br /> Zl常声称q里有几个问题是那种要翻一下书才能回答的问题,我同意这U说法。当我写q篇文章ӞZ定语法的正性,我的查了一下书。但是当我被面试的时候,我期望被问到q个问题Q或者相q的问题Q。因为在被面试的q段旉里,我确定我知道q个问题的答案。应试者如果不知道所有的{案Q或臛_大部分答案)Q那么也没有ؓq次面试做准备,如果该面试者没有ؓq次面试做准备,那么他又能ؓ什么出准备呢?<br /> <br /> <span style="font-weight: bold">Static</span> <br /> <br /> 6. 关键字static的作用是什么?<br /> q个单的问题很少有h能回{完全。在C语言中,关键字static有三个明昄作用Q?br /> 1)在函CQ一个被声明为静态的变量在这一函数被调用过E中l持其g变?br /> 2) 在模块内Q但在函C外)Q一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量?br /> 3) 在模块内Q一个被声明为静态的函数只可被这一模块内的其它函数调用。那是Q这个函数被限制在声明它的模块的本地范围内用?br /> <br /> 大多数应试者能正确回答W一部分Q一部分能正回{第二部分,同是很少的h能懂得第三部分。这是一个应试者的严重的缺点,因ؓ他显然不懂得本地化数据和代码范围的好处和重要性?br /> <br /> <br /> <span style="font-weight: bold">Const</span> <br /> <br /> 7Q关键字const有什么含意?<br /> 我只要一听到被面试者说Q?const意味着常数"Q我q道我正在和一个业余者打交道。去qDan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什?如果你从没有d那篇文章Q只要能说出const意味着"只读"可以了。尽这个答案不是完全的{案Q但我接受它作ؓ一个正的{案。(如果你想知道更详l的{案Q仔l读一下Saks的文章吧。)<br /> 如果应试者能正确回答q个问题Q我问他一个附加的问题Q?br /> 下面的声明都是什么意思?<br /> <br /> const int a;<br /> int const a;<br /> const int *a;<br /> int * const a;<br /> int const * a const;<br /> <br /> /******/<br /> 前两个的作用是一Pa是一个常整型数。第三个意味着a是一个指向常整型数的指针Q也是Q整型数是不可修改的Q但指针可以Q。第四个意思a是一个指向整型数的常指针Q也是_指针指向的整型数是可以修改的Q但指针是不可修改的Q。最后一个意味着a是一个指向常整型数的常指针(也就是说Q指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答q些问题Q那么他q我留下了一个好印象。顺带提一句,也许你可能会问,即不用关键?constQ也q是能很Ҏ写出功能正确的程序,那么我ؓ什么还要如此看重关键字const呢?我也如下的几下理由:<br /> 1) 关键字const的作用是为给M代码的h传达非常有用的信息,实际上,声明一个参Cؓ帔R是ؓ了告诉了用户q个参数的应用目的。如果你曾花很多旉清理其它人留下的垃圾Q你׃很快学会感谢q点多余的信息。(当然Q懂得用const的程序员很少会留下的垃圾让别人来清理的。)<br /> 2) 通过l优化器一些附加的信息Q用关键字const也许能生更紧凑的代码?br /> 3) 合理C用关键字const可以使编译器很自然地保护那些不希望被改变的参敎ͼ防止其被无意的代码修攏V简而言之,q样可以减少bug的出现?br /> <br /> <br /> <span style="font-weight: bold">Volatile</span> <br /> <br /> 8. 关键字volatile有什么含?q给Z个不同的例子?br /> 一个定义ؓvolatile的变量是说这变量可能会被意想不到地改变,q样Q编译器׃会去假设q个变量的g。精地说就是,优化器在用到q个变量时必Lơ都心地重新读取这个变量的|而不是用保存在寄存器里的备份。下面是volatile变量的几个例子:<br /> 1) q行讑֤的硬件寄存器Q如Q状态寄存器Q?br /> 2) 一个中断服务子E序中会讉K到的非自动变?Non-automatic variables)<br /> 3) 多线E应用中被几个Q务共享的变量<br /> <br /> 回答不出q个问题的h是不会被雇䄦的。我认ؓq是区分CE序员和嵌入式系l程序员的最基本的问题。搞嵌入式的家伙们经常同g、中断、RTOS{等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难?br /> 假设被面试者正地回答了这是问题(嗯,怀疑是否会是这PQ我稍微深I一下,看一下这家伙是不是直正懂得volatile完全的重要性?br /> 1)一个参数既可以是constq可以是volatile吗?解释Z么?br /> 2); 一个指针可以是volatile 吗?解释Z么?br /> 3); 下面的函数有什么错误:<br /> <br /> int square(volatile int *ptr)<br /> {<br />         return *ptr * *ptr;<br /> }<br /> <br /> 下面是答案:<br /> 1)是的。一个例子是只读的状态寄存器。它是volatile因ؓ它可能被意想不到地改变。它是const因ؓE序不应该试囑֎修改它?br /> 2); 是的。尽这q不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时?br /> 3) q段代码有点变态。这D代码的目的是用来返指针*ptr指向值的qxQ但是,׃*ptr指向一个volatile型参敎ͼ~译器将产生cM下面的代码:<br /> <br /> int square(volatile int *ptr) <br /> {<br />     int a,b;<br />     a = *ptr;<br />     b = *ptr;<br />     return a * b;<br /> }<br /> <br /> ׃*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,q段代码可能q不是你所期望的^方|正确的代码如下:<br /> <br /> long square(volatile int *ptr) <br /> {<br />     int a;<br />     a = *ptr;<br />     return a * a;<br /> }<br /> <br /> <span style="font-weight: bold">位操?/span>QBit manipulationQ?<br /> <br /> 9. 嵌入式系lL要用户对变量或寄存器q行位操作。给定一个整型变量aQ写两段代码Q第一个设|a的bit 3Q第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变?br /> 对这个问题有三种基本的反?br /> 1)不知道如何下手。该被面者从没做qQ何嵌入式pȝ的工作?br /> 2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同~译器之间是不可UL的,同时也保证了的你的代码是不可重用的。我最q不q看?Infineon为其较复杂的通信芯片写的驱动E序Q它用到了bit fields因此完全Ҏ无用Q因为我的编译器用其它的方式来实现bit fields的。从道dԌ永远不要让一个非嵌入式的家伙_实际硬件的辏V?br /> 3) ?#defines ?bit masks 操作。这是一个有极高可移植性的ҎQ是应该被用到的Ҏ。最佳的解决Ҏ如下Q?br /> <br /> #define BIT3 (0x1 << 3)<br /> static int a;<br /> <br /> void set_bit3(void) <br /> {<br />     a |= BIT3;<br /> }<br /> void clear_bit3(void) <br /> {<br />     a &= ~BIT3;<br /> }<br /> <br /> 一些h喜欢|和清除D定义一个掩码同时定义一些说明常敎ͼq也是可以接受的。我希望看到几个要点Q说明常数、|=?amp;=~操作?br /> <br /> <br /> <span style="font-weight: bold">讉K固定的内存位|?/span>QAccessing fixed memory locationsQ?<br /> <br /> 10. 嵌入式系l经常具有要求程序员去访问某特定的内存位|的特点。在某工E中Q要求设|一l对地址?x67a9的整型变量的gؓ0xaa66。编译器是一个纯_的ANSI~译器。写代码d成这一d?br /> q一问题试你是否知道ؓ了访问一l对地址把一个整型数强制转换QtypecastQؓ一指针是合法的。这一问题的实现方式随着个h风格不同而不同。典型的cM代码如下Q?br />     int *ptr;<br />     ptr = (int *)0x67a9;<br />     *ptr = 0xaa55;<br /> <br />  A more obscure approach is: <br /> 一个较晦ӆ的方法是Q?br /> <br />     *(int * const)(0x67a9) = 0xaa55;<br /> <br /> 即你的品味更接q第二种ҎQ但我徏议你在面试时使用W一U方案?br /> <br /> <span style="font-weight: bold">中断</span>QInterruptsQ?<br /> <br /> 11. 中断是嵌入式pȝ中重要的l成部分Q这D了很多编译开发商提供一U扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码׃用了__interrupt关键字去定义了一个中断服务子E序(ISR)Q请评论一下这D代码的?br /> <br /> __interrupt double compute_area (double radius) <br /> {<br />     double area = PI * radius * radius;<br />     printf("\nArea = %f", area);<br />     return area;<br /> }<br /> <br /> q个函数有太多的错误了,以至让h不知从何说v了:<br /> 1)ISR 不能q回一个倹{如果你不懂q个Q那么你不会被雇用的?br /> 2) ISR 不能传递参数。如果你没有看到q一点,你被雇用的机会等同第一V?br /> 3) 在许多的处理?~译器中QQ点一般都是不可重入的。有些处理器/~译器需要让额处的寄存器入栈Q有些处理器/~译器就是不允许在ISR中做点q算。此外,ISR应该是短而有效率的,在ISR中做点q算是不明智的?br /> 4) 与第三点一脉相承,printf()l常有重入和性能上的问题。如果你丢掉了第三和W四点,我不会太为难你的。不用说Q如果你能得到后两点Q那么你的被雇用前景来光明了?br /> <br /> <br /> <span style="font-weight: bold">代码例子</span>QCode examplesQ?br /> <br /> 12 . 下面的代码输出是什么,Z么?<br /> <br /> void foo(void)<br /> {<br />     unsigned int a = 6;<br />     int b = -20;<br />     (a+b > 6) ? puts("> 6") : puts("<= 6");<br /> }<br /> q个问题试你是否懂得C语言中的整数自动转换原则Q我发现有些开发者懂得极这些东ѝ不如何,q无W号整型问题的答案是输出?">6"。原因是当表辑ּ中存在有W号cd和无W号cd时所有的操作数都自动转换为无W号cd。因?20变成了一个非常大的正整数Q所以该表达式计出的结果大?。这一点对于应当频J用到无W号数据cd的嵌入式pȝ来说是丰帔R要的。如果你{错了这个问题,你也到了得不到q䆾工作的边~?br /> <br /> 13. 评h下面的代码片断:<br /> <br /> unsigned int zero = 0;<br /> unsigned int compzero = 0xFFFF; <br /> /*1's complement of zero */<br /> <br /> 对于一个int型不?6位的处理器ؓ_上面的代码是不正的。应~写如下Q?br /> <br /> unsigned int compzero = ~0;<br /> <br /> q一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的l验里,好的嵌入式程序员非常准确地明白硬件的l节和它的局限,然而PC机程序往往把硬件作Z个无法避免的烦恼?br /> Cq个阶段Q应试者或者完全垂头气了或者信心满满志在必得。如果显然应试者不是很好,那么q个试在q里l束了。但如果昄应试者做得不错,那么我就扔出下面的追加问题,q些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提些问题,我希望更多看到应试者应付问题的ҎQ而不是答案。不如何,你就当是q个׃?..<br /> <br /> <br /> <span style="font-weight: bold">动态内存分?/span>QDynamic memory allocationQ?<br /> <br /> 14. 管不像非嵌入式计算机那么常见,嵌入式系l还是有从堆QheapQ中动态分配内存的q程的。那么嵌入式pȝ中,动态分配内存可能发生的问题是什么?<br /> q里Q我期望应试者能提到内存片Q碎片收集的问题Q变量的持行旉{等。这个主题已l在ESP杂志中被q泛地讨了(主要?P.J. Plauger, 他的解释q远过我这里能提到的Q何解释)Q所有回q头看一下这些杂志吧Q让应试者进入一U虚假的安全感觉后,我拿么一个小节目Q?br /> 下面的代码片D늚输出是什么,Z么?<br /> <br /> char *ptr;<br /> if ((ptr = (char *)malloc(0)) == NULL) <br />     puts("Got a null pointer");<br /> else<br />     puts("Got a valid pointer");<br /> <br /> q是一个有的问题。最q在我的一个同事不l意?gl了函数mallocQ得C一个合法的指针之后Q我才想到这个问题。这是上面的代码,该代码的输出?Got a valid pointer"。我用这个来开始讨L一问题Q看看被面试者是否想到库例程q样做是正确。得到正的{案固然重要Q但解决问题的方法和你做军_的基本原理更重要些?br /> <br /> <span style="font-weight: bold">Typedef </span><br />  <br /> 15 Typedef 在C语言中频J用以声明一个已l存在的数据cd的同义字。也可以用预处理器做cM的事。例如,思考一下下面的例子Q?br /> <br /> #define dPS struct s *<br /> typedef struct s * tPS;<br /> <br /> 以上两种情况的意N是要定义dPS ?tPS 作ؓ一个指向结构s指针。哪U方法更好呢Q(如果有的话)Z么?<br /> q是一个非常微妙的问题QQ何h{对q个问题Q正当的原因Q是应当被恭喜的。答案是Qtypedef更好。思考下面的例子Q?br /> <br /> dPS p1,p2;<br /> tPS p3,p4;<br /> <br /> W一个扩展ؓ<br /> <br /> struct s * p1, p2;<br /> .<br /> 上面的代码定义p1Z个指向结构的指,p2Z个实际的l构Q这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针?br /> <br /> <br /> <br /> <span style="font-weight: bold">晦ӆ的语?/span><br /> <br /> 16 . C语言同意一些o人震惊的l构,下面的结构是合法的吗Q如果是它做些什么?<br /> <br /> int a = 5, b = 7, c;<br /> c = a+++b;<br /> <br /> q个问题做个测验的一个愉快的l尾。不你怸怿Q上面的例子是完全合乎语法的。问题是~译器如何处理它Q水q不高的~译作者实际上会争个问题,Ҏ最处理原则Q编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:<br /> <br /> c = a++ + b;<br /> <br /> 因此, q段代码持行后a = 6, b = 7, c = 12?br /> 如果你知道答案,或猜出正答案,做得好。如果你不知道答案,我也不把q个当作问题。我发现q个问题的最大好处是q是一个关于代码编写风|代码的可L,代码的可修改性的好的话题?br /> <br /> <br /> <font class="f14" id="zoom">好了Q伙计们Q你现在已经做完所有的试了。这是我出的C语言试题,我怀着愉快的心情写完它Q希望你以同L心情d它。如果是认ؓq是一个好的测试,那么量都用C的找工作的过E中d。天知道也许q个一两年Q我׃做现在的工作Q也需要找一个?br /> <br /> <span style="font-weight: bold">作者介l?</span><br />         Nigel Jones 是一个顾问,现在住在MarylandQ当他不在水下时Q你能在多个范围的嵌入项目中扑ֈ他?他很高兴能收到读者的来信Q他的email地址? <a href="mailto:NAJones@compuserve.com">NAJones@compuserve.com</a><br /> <br /> </font><font class="f14" id="zoom"><span style="font-weight: bold">参考文?/span><br /> 1) Jones, Nigel, "In Praise of the #error directive," Embedded Systems Programming, September 1999, p. 114.<br /> 2) Jones, Nigel, " Efficient C Code for Eight-bit MCUs ," Embedded Systems Programming, November 1998, p. 66.<br /> <br /> <br type="_moz" /> </font><a title="Print It" >[昄打印版本]</a> <h3 class="break">相关文章</h3> <ul> <li>No Relative Articles. </li> </ul> <h3 class="break">相关评论   <a onclick="window.open('/reply.html?423','reply','width=400,height=300,top=0,left=0');" href="javascript:void(0);">发表评论</a> </h3> <ul> <li> <p class="replyer">leslie  [2005-04-08]</p> <p>验基本知识?/p> </li> </ul> </div> </div> <img src ="http://www.aygfsteel.com/poower/aggbug/238701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/poower/" target="_blank">poower</a> 2008-11-04 21:27 <a href="http://www.aygfsteel.com/poower/archive/2008/11/04/238701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyPianohttp://www.aygfsteel.com/poower/archive/2008/07/02/212140.htmlpoowerpoowerWed, 02 Jul 2008 08:35:00 GMThttp://www.aygfsteel.com/poower/archive/2008/07/02/212140.htmlhttp://www.aygfsteel.com/poower/comments/212140.htmlhttp://www.aygfsteel.com/poower/archive/2008/07/02/212140.html#Feedback0http://www.aygfsteel.com/poower/comments/commentRss/212140.htmlhttp://www.aygfsteel.com/poower/services/trackbacks/212140.html #include "conio.h"
#include <dos.h>
#include<graphics.h>
/*****
Key struct:
    position:x1,y1,x2,y2
    State:isdown
    white or black key:iswhite
    nearby key:lwbk,rwbk
*******/

typedef struct _Key{
    int x1;
    int y1;
    int x2;
    int y2;
    int isdown;
    int iswhite;
    int lwbk;
    int rwbk;
} Key;

/*****
static grobal Variables statement:
    7 white keys:wk[7]
    5 black keys:bk[5]
    width,height:kw,kh
    frequant:frequ[8]
    pcfrequant:pcfre
    keynum
    count
*******/
static wknum=14;
static Key wk[14];
static bknum=10;
static Key bk[10];
static int kw=32,kh=160;
static int leftwidth=2*32;
int frequ[8]={262, 294, 330, 349, 392, 440, 494, 524};
static long int pcfre=1190000;
static int keyindex;
static int count;

/*****
function statement:
    makesound():
    initkey();
    change key state:setup(),setdown()
    initdrawkey();
*******/


void makesound();
Key set(int x1,int w,int h);
void setup(Key *k);
void setdown(Key *k);
void keyinit();
void initdrawkey();

/*initkey*/
Key initset(int x1,int w,int h,int isw,int lwbk,int rwbk){
    Key k;
    k.x1=x1;
    k.y1=0;
    k.x2=x1+w;
    k.y2=h;
    k.isdown=0;
    k.iswhite=isw;
    k.lwbk=lwbk;
    k.rwbk=rwbk;

    return k;
}
/*keyinit()*/
void keyinit(){

    wk[0]=initset(leftwidth+0*kw,kw,kh,1,-1,0);
    wk[1]=initset(leftwidth+1*kw,kw,kh,1,0,1);
    wk[2]=initset(leftwidth+2*kw,kw,kh,1,1,-1);
    wk[3]=initset(leftwidth+3*kw,kw,kh,1,-1,2);
    wk[4]=initset(leftwidth+4*kw,kw,kh,1,2,3);
    wk[5]=initset(leftwidth+5*kw,kw,kh,1,3,4);
    wk[6]=initset(leftwidth+6*kw,kw,kh,1,4,-1);
    wk[7]=initset(leftwidth+7*kw,kw,kh,1,-1,6);
    wk[8]=initset(leftwidth+8*kw,kw,kh,1,6,7);
    wk[9]=initset(leftwidth+9*kw,kw,kh,1,7,-1);
    wk[10]=initset(leftwidth+10*kw,kw,kh,1,-1,8);
    wk[11]=initset(leftwidth+11*kw,kw,kh,1,8,9);
    wk[12]=initset(leftwidth+12*kw,kw,kh,1,9,10);
    wk[13]=initset(leftwidth+13*kw,kw,kh,1,10,-1);


    bk[0]= initset(leftwidth+kw-kw/4,kw/2,kh/2,0,0,1);
    bk[1]= initset(leftwidth+kw*2-kw/4,kw/2,kh/2,0,1,2);
    bk[2]= initset(leftwidth+kw*4-kw/4,kw/2,kh/2,0,3,4);
    bk[3]= initset(leftwidth+kw*5-kw/4,kw/2,kh/2,0,4,5);
    bk[4]= initset(leftwidth+kw*6-kw/4,kw/2,kh/2,0,5,6);

    bk[5]= initset(leftwidth+kw*8-kw/4,kw/2,kh/2,0,7,8);
    bk[6]= initset(leftwidth+kw*9-kw/4,kw/2,kh/2,0,8,9);
    bk[7]= initset(leftwidth+kw*11-kw/4,kw/2,kh/2,0,10,11);
    bk[8]= initset(leftwidth+kw*12-kw/4,kw/2,kh/2,0,11,12);
    bk[9]= initset(leftwidth+kw*13-kw/4,kw/2,kh/2,0,12,13);
}

/*draw black key*/
void drawblackkey(Key *k){
     if(!(*k).isdown){
        setfillstyle(SOLID_FILL,DARKGRAY);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);

    }
    else{
        setfillstyle(SOLID_FILL,LIGHTBLUE);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);

    }
   
}
/*draw white key*/
void drawwhitekey(Key *k){
    if(!(*k).isdown){
        setfillstyle(SOLID_FILL,WHITE);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        setcolor(DARKGRAY);
        rectangle((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        /*draw nearby key*/
        if(!(*k).lwbk>-1){
           drawblackkey(&bk[(*k).lwbk]);
        }
        if(!(*k).rwbk>-1){
           drawblackkey(&bk[(*k).rwbk]);
        }
    }
    else{
        setfillstyle(SOLID_FILL,LIGHTBLUE);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        setcolor(DARKGRAY);
        rectangle((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        /*draw nearby key*/
        if(!(*k).lwbk>-1){
           drawblackkey(&bk[(*k).lwbk]);
        }
        if(!(*k).rwbk>-1){
           drawblackkey(&bk[(*k).rwbk]);
        }
    }
}
/*setdown() and setup()*/
void setdown(Key *k){
    (*k).isdown=1;
    if((*k).iswhite)
        drawwhitekey(k);
    else
        drawblackkey(k);
}
void setup(Key *k){
   (*k).isdown=0;
   if((*k).iswhite)
        drawwhitekey(k);
    else
        drawblackkey(k);
}

 /*initdrawkey()*/
void initdrawkey(){
    int gdriver,gmode,i;

    gdriver=DETECT;
    initgraph(&gdriver,&gmode,"c:\\tc");
    setbkcolor(YELLOW);
    cleardevice();

    for(i=0;i<wknum;i++){
        setfillstyle(SOLID_FILL,WHITE);
        bar(wk[i].x1,wk[i].y1,wk[i].x2,wk[i].y2);
        setcolor(DARKGRAY);
        rectangle(wk[i].x1,wk[i].y1,wk[i].x2,wk[i].y2);

    }
    for(i=0;i<bknum;i++){
        setfillstyle(SOLID_FILL,DARKGRAY);
        bar(bk[i].x1,bk[i].y1,bk[i].x2,bk[i].y2);
    }
}
 /*makesound()*/
void makesound(){
    count=(int)(pcfre/frequ[keyindex]);
    asm mov al, 10110110b
    asm out 43h, al

    asm mov ax,count

    asm out 42h, al
    asm mov al, ah
    asm out 42h, al

    asm in  al, 61h
    asm or  al, 03h
    asm out 61h, al

    delay(0xfffff000);
   
    asm in  al, 61h
    asm and al, 11111100b
    asm out 61h, al
}


void main(){
    keyinit();
    initdrawkey();

    settextstyle(4, 0, 10);
    outtextxy(200, 230, "Interface Principle Course Design");
    outtextxy(200, 250, "------------Piano----------------");
    outtextxy(200, 270, "-------Input 1...7 Play----------");
    outtextxy(200, 290, "-------Input CTRL+C Exit---------");
    outtextxy(200, 310, "-------Auther:Ying Wenjie--------");
    outtextxy(200, 340, "---------Date:2008-7-3-----------");
    while(1){
        keyindex=getch();
        if(keyindex==3)
            break;

        keyindex=keyindex-0x30;
        if(keyindex<1||keyindex>8)
            continue;
        keyindex--;
        setdown(&wk[keyindex]);

        makesound();
        setup(&wk[keyindex]);
    }
}


poower 2008-07-02 16:35 发表评论
]]>
java 用jni的用?/title><link>http://www.aygfsteel.com/poower/archive/2008/06/30/211581.html</link><dc:creator>poower</dc:creator><author>poower</author><pubDate>Mon, 30 Jun 2008 02:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/poower/archive/2008/06/30/211581.html</guid><wfw:comment>http://www.aygfsteel.com/poower/comments/211581.html</wfw:comment><comments>http://www.aygfsteel.com/poower/archive/2008/06/30/211581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/poower/comments/commentRss/211581.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/poower/services/trackbacks/211581.html</trackback:ping><description><![CDATA[<p>author: scruffybear</p> <p>release time: 28/10/2006</p> <p>company: Watchdata</p> <p>如有转蝲Q请注明出处Qƈ保持文章的完整性,谢谢Q?/p> <p>    做java卡开发需要用到JNI,也就是本地化接口,说白了javaE序要用到其它语a代码,q样可以用JNI来进行达到调用的目的,暂时理解到这?q没有时间细I。网上看C一很好的介绍JNI的文章《JNI入门介绍上》、《JNI入门介绍下》,只研I了前一,q行了实践,后一实践觉得写得不好,没有花时间进行实c?br /> <br /> <font style="font-size: small; line-height: 1.3em"><wbr></wbr><font size="3">1Q简?/font></font><wbr></wbr><br />   <br />   JNI是Java Native Interface的羃写,它的设计目的是:<br />   <br />   The standard Java class library may not support the platform-dependent features needed by your application.<br />   <br />   You may already have a library or application written in another programming language and you wish to make it accessible to Java applications.<br />   <br />   You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions<br />   <br /> <font style="font-size: small; line-height: 1.3em"><wbr></wbr><font size="3">2QJNI的书写步?/font></font><wbr></wbr><br />   <br />   ~写带有native声明的方法的javac?br />   <br />   使用javac命o~译所~写的javac?br />   <br />   使用javah -jni javacd生成扩展名ؓh的头文g<br />   <br />   使用C/C++实现本地Ҏ<br />   <br />   C/C++~写的文件生成动态连接库<br />   <br />   ok<br />   <br /> 1) ~写javaE序Q?br />   <br />   q里以HelloWorldZ?br />   <br />   代码1Q?br />   <br />   class HelloWorld {<br />   public native void displayHelloWorld();<br />   <br />   static {<br />   System.loadLibrary("hello");<br />   }<br />   <br />   public static void main(String[] args) {<br />   new HelloWorld().displayHelloWorld();<br />   }<br />   }<br />   <br />     声明nativeҎQ如果你惛_一个方法做Z个本地方法的话,那么你就必须声明Ҏ法ؓnative的,q且不能实现。其中方法的参数和返回值在后面讲述?br />   <br />   Load动态库QSystem.loadLibrary("hello");加蝲动态库Q我们可以这L解:我们的方法displayHelloWorld()没有实现Q但是我们在下面q接用了Q所以必d使用之前对它q行初始化)q里一般是以static块进行加载的。同旉要注意的是System.loadLibrary();的参?#8220;hello”是动态库的名字?br />   <br />   main()Ҏ<br />   <br />   2) ~译没有什么好说的?br />   <br />   javac HelloWorld.java<br /> <br />     q里是运行不了的Q因时候目录下面没有hello.dll文g供调用,如果输入java HelloWorld会出C下错误:<br />    C:\Documents and Settings\huilin.xiong\桌面>java HelloWorld<br />    Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path<br />         at java.lang.ClassLoader.loadLibrary(Unknown Source)<br />         at java.lang.Runtime.loadLibrary0(Unknown Source)<br />         at java.lang.System.loadLibrary(Unknown Source)<br />         at HelloWorld.<clinit>(HelloWorld.java:5)<br /> <br />     下面qc语言生成hello.dll文g供java语言来调用。如下:<br />   <br /> 3) 生成扩展名ؓh的头文g<br />   <br />   javah -jni HelloWorld<br /> <br />     在这里自动生成文件名为HelloWorld.h的头文g?br />   <br />   头文件的内容Q?br />   /* DO NOT EDIT THIS FILE - it is machine generated */<br />   #include <br />   /* Header for class HelloWorld */<br />   <br />   #ifndef _Included_HelloWorld<br />   #define _Included_HelloWorld<br />   #ifdef __cplusplu*<br />   **tern "C" {<br />   #endif<br />   /*<br />   * Class:   HelloWorld<br />   * Method:  displayHelloWorld<br />   * Signature: ()V<br />   */<br />   JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld<br />   (JNIEnv *, jobject);<br />   <br />   #ifdef __cplusplus<br />   }<br />   #endif<br />   #endif<br />   <br />   Q这里我们可以这L解:q个h文g相当于我们在java里面的接口,q里声明了一个Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);ҎQ然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++E序的时候所使用的方法名必须和这里的一_?br />   <br /> 4) ~写本地Ҏ<br />   <br />   实现和由javah命o生成的头文g里面声明的方法名相同的方法?br />   <br />   代码2Q?br />   <br />   #include <jni.h><br />   #include "HelloWorld.h"<br />   #include <stdio.h><br />   JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj)<br />   {<br />   printf("Hello world!\n");<br />   return;<br />   }<br />   <br />   注意代码2中的W?行,需要将jni.hQ该文g可以?JAVA_HOME%/include文g夹下面找刎ͼ文g引入Q因为在E序中的JNIEnv、jobject{类型都是在该头文g中定义的Q另外在W?行需要将HelloWorld.h头文件引入(我是q么理解的:相当于我们在~写javaE序的时候,实现一个接口的话需要声明才可以Q这里就是将HelloWorld.h头文仉面声明的Ҏ加以实现。当然不一定是q样Q。然后保存ؓHelloWorldImpl.cok了?br />   <br />   5) 生成动态库<br />   <br />   q里以在Windows中ؓ例,需要生成dll文g。在保存HelloWorldImpl.c文g夹下面,使用VC的编译器cl成?br />   <br />   cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll<br />   <br />   注意Q生成的dll文g名在选项-Fe后面配置Q这里是helloQ因为在HelloWorld.java文g中我们loadLibary的时候用的名字是hello。当然这里修改之后那里也需要修攏V另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上Q因为在W四步里面编写本地方法的时候引入了jni.h文g?br />     <br />     q里在实际的操作中找不到头文?lt;stdio.h>Q找不出原因Q检查了我的环境变量讄也没有错Q没办法Q只有从目录D:\Software\Microsoft Visual Studio .NET\Vc7\include目录下拷贝过来,另外又找不到stdarg.hQ一q拷贝过来。头文g都找不到后,又出C找不到好几个LIB文gQ分别ؓlibcmt.libQoldnames.libQkernel32.libQ检查环境变量也没错Q没办法Q只能从D:\Software\Microsoft Visual Studio.NET\Vc7\lib拯q来。最后在目录下生成了q样几个文gQHelloWorldImpl.objQhello.dllQhello.expQhello.libQ当Ӟ只有hello.dll是有用的Q它是被HelloWorld.class所调用?br />   <br />   6) q行E序<br />   <br />   java HelloWorldQ输Z大?#8220;Hello world!”?-)<br /> <br /> /************************************************************************<br /> 转至:http://blog.csdn.net/scruffybear/archive/2007/12/01/1910418.aspx</p> <img src ="http://www.aygfsteel.com/poower/aggbug/211581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/poower/" target="_blank">poower</a> 2008-06-30 10:00 <a href="http://www.aygfsteel.com/poower/archive/2008/06/30/211581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言调用汇编-电子?/title><link>http://www.aygfsteel.com/poower/archive/2008/06/30/211579.html</link><dc:creator>poower</dc:creator><author>poower</author><pubDate>Mon, 30 Jun 2008 01:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/poower/archive/2008/06/30/211579.html</guid><wfw:comment>http://www.aygfsteel.com/poower/comments/211579.html</wfw:comment><comments>http://www.aygfsteel.com/poower/archive/2008/06/30/211579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/poower/comments/commentRss/211579.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/poower/services/trackbacks/211579.html</trackback:ping><description><![CDATA[<p>/*sound.h*/ <br /> /*http://blog.csdn.net/scs2000/archive/2006/09/14/1221079.aspx*/<br /> #include <stdio.h><br /> #include <conio.h><br /> #define NOO 1450<br /> int music1[8][6]={<br />     {262,262,294,262,349},<br />     {330,262,262,294,262},<br />     {392,349,262,262,523},<br />     {440,349,262,262,466},<br />     {466,440,262,392,349}<br /> };<br /> int time1[8][6]={<br />     {100,100,200,200,200},<br />     {200,200,100,100,200},<br />     {200,200,200,200,200},<br />     {200,200,200,200,200},<br />     {100,200,200,200,200}<br /> };<br /> int music2[3][10]={<br />     {330,392,330,294,330,392,330,294,330,330},<br />     {330,392,330,294,262,294,330,392,294,294},<br />     {262,262,220,196,196,220,262,294,332,262}<br /> };<br /> int time2[3][11]={<br />     {200,200,200,100,100,200,100,100,200,200},<br />     {200,200,100,100,200,200,100,100,200,200},<br />     {200,100,100,200,100,100,200,100,100,400}<br /> };<br /> int music3[4][11]={<br />     {441,393,330,393,131,441,393,441,441,1450,1450},<br />     {330,393,441,393,330,262,882,393,330,294,294},<br />     {294,330,393,393,441,330,294,262,262,1450,1450},<br />     {393,330,294,262,882,262,786,786,786,1450,1450}<br /> };<br /> int time3[4][11]={<br />     {200,100,200,200,200,100,100,200,200,0,0},<br />     {200,100,100,200,200,100,100,100,100,200,200},<br />     {200,100,200,100,100,200,200,200,200,0,0},<br />     {200,100,100,100,100,100,200,200,200,0,0}<br /> };<br /> const char * process_file[]={<br />                    " ",<br />                    "┌───┬┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┬───?,<br />                    "?nbsp;    ├接┤├口┤├技┤├术┤├课┤├E┤├设┤├计┤     ?,<br />                    "├───┴┴┘└┴┘└┴┘└┴┘└┴┘└┴┘└┴┘└┴┴───?,<br />                    "?nbsp;                    《音乐发生器?nbsp;                      ?,<br />                    "├──────────────────────────────?,<br />                    "?nbsp;                                                          ?,<br />                    "├──────────────────────────────?,<br />                    "?nbsp;                                                          ?,<br />                    "?nbsp;                  A.播放W一首音?nbsp;                      ?,<br />                    "?nbsp;                  B.播放W二首音?nbsp;                      ?,<br />                    "?nbsp;                  C.播放W三首音?nbsp;                      ?,<br />                    "?nbsp;                  Q.退E序                           ?,<br />                    "?nbsp;                                                          ?,<br />                    "├──────────────────────────────?,<br />                    "?nbsp;  制作Q王?nbsp;                                            ?,<br />                    "?nbsp;  日期Q年月日                                    ?,<br />                    "?nbsp;                                                           ?,<br />                    "└──────────────────────────────?};<br /> const char * end_file[]={<br />                    " ",<br />                    "┌─────?nbsp;  ┌─┐┌─?nbsp;    ┌─┐┌─?nbsp;  ┌─────?,<br />                    "│★★★★★├☆☆┤个││h├☆☆☆┤简││介├☆☆┤★★★★★?,<br />                    "├─────?nbsp;  └─┘└─┘☆└─┘└─?nbsp;  └─────?,<br />                    "├───────────────☆───────────────?,<br />                    "│姓名:王康                                                   ?,<br />                    "├───────────────────────────────?,<br />                    "│性别Q男                                                     ?,<br />                    "├───────────────────────────────?,<br />                    "│班U:                                                        ?,<br />                    "├───────────────────────────────?,<br />                    "│电话:--XXXXXXXX                                          ?,<br />                    "├───────────────────────────────?,<br />                    "│QQP                                                ?,<br />                    "├───────────────────────────────?,<br />                    "│邮:wkjs@163.com                                            ?,<br />                    "├───────────────────────────────?,    <br />                    "?nbsp;                       谢谢您的使用                        ?,<br />                    "└───────────────────────────────?};<br /> void light(int a)<br /> {<br />     asm MOV DX,283H<br />     asm MOV AL,80H<br />     asm OUT DX,AL<br />     asm MOV DX,280H<br />     asm MOV AL,0H;<br />     asm OUT DX,AL<br />     switch(a)<br />     {<br />     case 262:<br />     case 131:<br />         asm MOV AL,01H<br />         asm OUT DX,AL<br />         break;<br />     case 294:<br />         asm MOV AL,03H<br />         asm OUT DX,AL<br />         break;<br />     case 330:<br />         asm MOV AL,07H<br />         asm OUT DX,AL<br />         break;<br />     case 350:<br />         asm MOV AL,0FH<br />         asm OUT DX,AL<br />         break;<br />     case 393:<br />     case 786:<br />         asm MOV AL,1FH<br />         asm OUT DX,AL<br />         break;<br />     case 441:<br />     case 882:<br />         asm MOV AL,3FH<br />         asm OUT DX,AL<br />         break;<br />     case 495:<br />         asm MOV AL,7FH<br />         asm OUT DX,AL<br />         break;<br />     };<br /> }<br /> void sound_A(int a,int b)<br /> {               <br />         int i=0;<br />         asm MOV DI,a    /*选择可数器Q先写低字节Q后写高字节Q选择工作方式Q二q制*/<br />         asm MOV AL,10110110B<br />         asm MOV DX,12H <br />         asm MOV AX,34DEH<br />         asm DIV DI<br />         asm OUT 42H,AL /*先送低字节到号计数?/<br />         asm MOV AL,AH   /*取高字节送AL*/<br />         asm OUT 42H,AL /*后送高字节到号计数?/<br />         asm IN AL,61H   /*d的PB口原输出?/<br />         asm MOV AH,AL   <br />         asm OR AL,3     /*8255的PB0口PB1口输出有?/<br />         asm OUT 61H,AL<br />         /*调用灯亮函数*/<br />         light(a);<br />         /*旉延迟*/<br />         for(i=0;i<b;i++)<br />         {<br />             delay(2000);<br />         }<br />         /*关闭扬声?/<br />         asm MOV AL,AH<br />         asm OUT 61H,AL<br /> }<br /> void sound(char a)<br /> {<br />     int i,j;<br />     if(a=='a')<br />     {<br />         for(i=0;i<5;i++)<br />         {<br />             for(j=0;j<5;j++)<br />             {<br />                 sound_A(music1[i][j],time1[i][j]);<br />             }<br />         }<br />     }<br />     else if(a=='b')<br />     {<br />         for(i=0;i<3;i++)<br />         {<br />             for(j=0;j<11;j++)<br />             {<br />                 sound_A(music2[i][j],time2[i][j]);<br />             }<br />         }<br />     }<br />     else if(a=='c')<br />     {<br />         for(i=0;i<4;i++)<br />         {<br />             for(j=0;j<11;j++)<br />             {<br />                 sound_A(music3[i][j],time3[i][j]);<br />             }<br />         }<br />     }<br />     else<br />     {<br />         printf("\t对不P没有该音乐!\n");<br />     }<br /> }<br /> void face()<br /> {<br />     int i;<br />     system("cls");<br />     for(i=0;i<19;i++)<br />     {<br />         printf("\t%s\n",process_file[i]);<br />         delay(20000);<br />     }<br />     printf("\t误入您的指令:");<br /> }<br /> void endface()<br /> {<br />     int i;<br />     system("cls");<br />     for(i=0;i<19;i++)<br />     {<br />         printf("\t%s\n",end_file[i]);<br />         delay(20000);<br />     }<br />     printf("\t");<br /> }<br /> void operate()<br /> {<br />     char a;<br />     face();<br />     while(1)<br />     {<br />         a=getche();<br />         switch(a)<br />         {<br />         case 'a':<br />         case 'A':<br />             sound('a');<br />             printf("\n\t音乐播放l束Q谢谢你的收听,点Q意键l箋Q?);<br />             getch();<br />             face();<br />             break;<br />         case 'b':<br />         case 'B':<br />             sound('b');<br />             printf("\n\t音乐播放l束Q谢谢你的收听,点Q意键l箋Q?);<br />             getch();<br />             face();<br />             break;<br />         case 'c':<br />         case 'C':<br />             sound('c');<br />             printf("\n\t音乐播放l束Q谢谢你的收听,点Q意键l箋Q?);<br />             getch();<br />             face();<br />             break;<br />         case 'q':<br />         case 'Q':<br />             endface();<br />             exit(1);<br />             break;<br />         default:<br />             printf("\t您的输入有误,h实,谢谢Q?);<br />             getch();<br />             face();<br />             break;<br />         }<br />     }<br /> }<br />  /*sound.c*/</p> <p>void main()<br /> {<br />     operate();<br /> }<br /> </p> <img src ="http://www.aygfsteel.com/poower/aggbug/211579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/poower/" target="_blank">poower</a> 2008-06-30 09:58 <a href="http://www.aygfsteel.com/poower/archive/2008/06/30/211579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大数q算http://www.aygfsteel.com/poower/archive/2008/06/13/207648.htmlpoowerpoowerFri, 13 Jun 2008 05:36:00 GMThttp://www.aygfsteel.com/poower/archive/2008/06/13/207648.htmlhttp://www.aygfsteel.com/poower/comments/207648.htmlhttp://www.aygfsteel.com/poower/archive/2008/06/13/207648.html#Feedback0http://www.aygfsteel.com/poower/comments/commentRss/207648.htmlhttp://www.aygfsteel.com/poower/services/trackbacks/207648.html public class bigadd {

    /**
     * @param args
     */
    //***********************两个相等数相?*********************************88
    public static String add(String s){
        char c[]=s.toCharArray();
        for(int i=0;i<c.length/2;i++){
            char t=c[i];
            c[i]=c[c.length-1-i];
            c[c.length-1-i]=t;
        }
        int r[]=new int[c.length+1];
        int carry=0;
        for(int i=0;i<c.length;i++){
            int t=Integer.parseInt(c[i]+"")+Integer.parseInt(c[i]+"")+carry;
            carry=t/10;
            r[i]=t%10;
        }
        r[c.length]=carry;
        String sr;
        if(r[c.length]==0)
            sr="";
        else
            sr="1";
        for(int j=r.length-2;j>=0;j--){
            sr+=r[j];
        }
        return sr;
    }
    //*******************************两个不同数相?****************************************
    public static String adddif(String s1,String s2){
        char c1[] ;
        char c2[] ;
        if (s1.length() >= s2.length()) {
            c1 = s1.toCharArray();
            c2 = s2.toCharArray();
        }
        else{
            c2 = s1.toCharArray();
            c1 = s2.toCharArray();
        }
        for(int i=0;i<c1.length/2;i++){
            char t=c1[i];
            c1[i]=c1[c1.length-1-i];
            c1[c1.length-1-i]=t;
        }
        for(int i=0;i<c2.length/2;i++){
            char t=c2[i];
            c2[i]=c2[c2.length-1-i];
            c2[c2.length-1-i]=t;
        }
       
        int r[]=new int[c1.length+1];
        int carry=0;
        for(int i=0;i<c2.length;i++){
            int t=Integer.parseInt(c1[i]+"")+Integer.parseInt(c2[i]+"")+carry;
            carry=t/10;
            r[i]=t%10;
        }
        for(int i=c2.length;i<c1.length;i++){
            int t=Integer.parseInt(c1[i]+"")+carry;
            carry=t/10;
            r[i]=t%10;
        }
        r[c1.length]=carry;
        String sr;
        if(r[c1.length]==0)
            sr="";
        else
            sr="1";
        for(int j=r.length-2;j>=0;j--){
            sr+=r[j];
        }
        return sr;
    }
    //*************************?的Nơ幂*********************************8
    public static String pow(int n){
        if(n==0)
            return "1";
        else if(n==1)
            return "2";
        else
            return add(pow(n-1));       
    }
   
    public static String sumpow(int p1,int n,int q){
        String sum="";
        String pre=pow(p1);
        for(int i=p1;i<=n;i=i+q){
            sum=adddif(sum,pre);
            for(int j=1;j<=2;j++)               
                pre=add(pre);
        }
        return sum;
    }
    //************************************相减***********************************
    public static String minus(String s1,String s2){
        char c1[] ;
        char c2[] ;
        if (s1.length() >= s2.length()) {
            c1 = s1.toCharArray();
            c2 = s2.toCharArray();
        }
        else{
            c2 = s1.toCharArray();
            c1 = s2.toCharArray();
        }
        for(int i=0;i<c1.length/2;i++){
            char t=c1[i];
            c1[i]=c1[c1.length-1-i];
            c1[c1.length-1-i]=t;
        }
        for(int i=0;i<c2.length/2;i++){
            char t=c2[i];
            c2[i]=c2[c2.length-1-i];
            c2[c2.length-1-i]=t;
        }
       
        int r[]=new int[c1.length];
        int carry=0;
        for(int i=0;i<c2.length;i++){
            int t=Integer.parseInt(c1[i]+"")-Integer.parseInt(c2[i]+"")-carry;
            if(t<0){
                r[i]=Integer.parseInt(c1[i]+"")-Integer.parseInt(c2[i]+"")+10-carry;
                carry=1;
            }
            else{
                r[i]=t;
                carry=0;
            }
        }
        for(int i=c2.length;i<c1.length;i++){
            int t=Integer.parseInt(c1[i]+"")-carry;
            if(t<0){
                carry=1;
                r[i]=9;
            }
            else{
                r[i]=t;
                carry=0;
            }
        }
        String str;
        if(r[c1.length-1]==0){
            str="";
        }
        else{
            str=""+r[c1.length-1];
        }
        for(int j=r.length-2;j>=0;j--){
            str+=r[j];
        }
        return str;
       
    }
    //**********************************?****************************************
    public static String minus1(String s){
        char c[]=s.toCharArray();
        int i;
        for(i=0;i<c.length/2;i++){
            char t=c[i];
            c[i]=c[c.length-1-i];
            c[c.length-1-i]=t;
        }
        int t=0;
        for(i=0;i<c.length;i++){
            t=Integer.parseInt(c[i]+"");
            if(t>0){
                t=t-1;
                break;
            }           
        }
        c[i]=(t+"").charAt(0);
        System.out.println(t+" "+i);
        String str;
        if(c[c.length-1]=='0')
            str="";
        else
            str=c[c.length-1]+"";
       
        for(int j=c.length-2;j>=i;j--)
            str=str+c[j];
        for(int j=i-1;j>=0;j--)
            str+=9;
        return str;
    }
    //*************************************?************************************
    public static String add1(String s){
        char c[]=s.toCharArray();
        int i;
        for(i=0;i<c.length/2;i++){
            char t=c[i];
            c[i]=c[c.length-1-i];
            c[c.length-1-i]=t;
        }
        int t=0;
        for(i=0;i<c.length;i++){
            t=Integer.parseInt(c[i]+"");
            if(t<9){
                t=t+1;
                break;
            }   
        }
        String str;
        if(i==c.length)
            str="1";
        else{
            c[i]=(t+"").charAt(0);
            str="";
        }
        for(int j=c.length-1;j>=i;j--)
            str=str+c[j];
        for(int j=i-1;j>=0;j--)
            str+=0;
        return str;
    }
   
    public static void main(String[] args) {
        // TODO 自动生成Ҏ存根
        //System.out.println(pow(1000));
        //System.out.println(pow(999));
        //System.out.println(adddif(pow(999),pow(999)));
        //System.out.println(adddif("19","999"));
        System.out.println(sumpow((4-3),(1000-3),2));
        //System.out.println(minus(pow(1000),pow(999)));
        //System.out.println(add1(pow(1000)));
    }

}




poower 2008-06-13 13:36 发表评论
]]>
DP法求组合数http://www.aygfsteel.com/poower/archive/2008/06/11/207010.htmlpoowerpoowerTue, 10 Jun 2008 16:58:00 GMThttp://www.aygfsteel.com/poower/archive/2008/06/11/207010.htmlhttp://www.aygfsteel.com/poower/comments/207010.htmlhttp://www.aygfsteel.com/poower/archive/2008/06/11/207010.html#Feedback0http://www.aygfsteel.com/poower/comments/commentRss/207010.htmlhttp://www.aygfsteel.com/poower/services/trackbacks/207010.html 如果用算法实现的?N也要先做一q串的乘?然后再相除吗? 比如: C5,2 = (5*4*3*2)/(3*2)

如果数很大的?又是乘又做除?多牛的计机才能搞定?

先看看简单的:
2个数??共有1U方?br /> 3个数??共有3U方?br /> 4个数??共有6U方?br /> n个数??共有多少U方?

F(n,2) = F(n-1,2) + F(n-1,1) //q样写看的更清楚?

那么N个数选M出来,有多种选择?
F(N,M) = F(N-1,M) + F(N-1,M-1)
到此?DP的递归解空间已l出来了.

F(N,M) = 1                                          M=0 or N=0 or N=M
F(N,M) = N                                          M=1
F(N,M) = F(N-1,M) + F(N-1,M-1)         M!=N 当然N>M


剩下的工作就是程序实C.但是q有个小问题,是在DPq代的过E中是否需要记?在这个算法当焉要记?

实现的过E中,可以做些优?比如N=5 M=3 可以求C5,2的组合数是要少递归几次.

#include "stdafx.h"
#include <iostream>
using namespace std;

__int64 Aug[200][200] = {0};

__int64 getComposite(int m,int n)
{
    __int64 preResult0;
    __int64 preResult1;

    if (m==0 || n== 0 || m== 1 || m == n)
        return 1;
    if (Aug[m][n] != 0)
        return Aug[m][n];
    else
    {
        preResult0    = getComposite(m-1,n);
        Aug[m-1][n]   = preResult0;
        preResult1    = getComposite(m-1,n-1);
        Aug[m-1][n-1] = preResult1;
    }
    return preResult0 + preResult1;
}
int main()
{
    int count;
    int m,n;
    int m0,n0;

    cin >> n >> m;
    m0 = m >= n ? m : n;
    n0 = m >= n ? n : m;
    n0 = m0 - n0 >= n0 ? n0 : m0-n0;
    cout << getComposite(m0,n0) << endl;

    return 0;
}
//*********************************************************************************
?其实我没看明?.....


poower 2008-06-11 00:58 发表评论
]]>
վ֩ģ壺 կ| ԣ| ˮ| | ͨ| | | | | | ̶| | ǹ| | | ʯ| γ| | Զ| ʡ| ̳| ī񹤿| ƽ| ӳ| | | ̩| Ӻ| | | Ϫ| ½| п| Ϫ| ̽| ˮ| | Ϫ| | ½| |