The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          #

          如果仍然使用缺省的類加載策略:PARENT_FIRST,  由于BSF自身加載類,導致使用org.eclipse.osgi.framework.internal.core.BundleLoader裝載器來裝載,在這個裝載器級別,似乎發現不了JavaScriptEngine類,實際上JavaScriptEngine和BSFManager同在一個包中。

          一個可行的解決方法是,將該baf.jar(JavaScriptEngine類所在jar包)拷貝到jre/lib/ext目錄下,則org.eclipse.osgi.framework.internal.core.BundleLoader類裝載器一定能找到,因為該JDK加載順序在org.eclipse.osgi.framework.internal.core.BundleLoader之先。

          然而,系統管理員處于安全的考慮,不同意在jre下放置bsf.jar包。看來只得另尋他法。通過閱讀下面的文章,理解WAS6.1的加載方式,可知創建應用程序共享庫可以解決這一問題。參考:在應用程序服務器級別使用共享庫。注意:在應用程序級別使用共享庫并不能解決這個問題,如果該類沒有使用自己的ClassLoader則應可行。

          詳細操作步驟:

          1、打開WAS6.1控制臺,創建共享庫



          2、在應用程序服務器級別使用共享庫


          新建類裝載器,注意,這里選 類已裝入且是先使用應用程序裝載器 選項

          保存

          類裝載器創建完成

          新建共享庫的引用

          選擇已經配置好的共享庫

          這是配置完的樣子





          以下為參考文章

          -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

           

          理解WAS 6.1的類加載(4)

          2008-12-3

            12.5.2步驟2:添加一個EJB模塊和工具JAR

            下面,往應用程序中添加一個EJB,它也依賴VersionChecker JAR文件。在此,在EAR的根目錄添加一個VersionCheckerV2.jar文件。在這個JAR文件中的VersionChecker類返回了Version 2.0。為了保證擴展類加載中的工具JAR可用,在EJB模塊的manifest文件中添加一個引用,如例12-8:

            例12-8更新EJB模塊的MANIFEST.MF文件

            Manifest-Version: 1.0

            Class-Path: VersionCheckerV2.jar

            現在的結果是:有一個Web模塊,在它的WEB-INF/classes目錄下面有一個servlet,在WEB-INF/lib目錄下面有VersionCheckerV1.jar文件。還有一個EJB模塊引用了EAR根目錄下面的VersionCheckerV2.jar工具JAR。你期望Web模塊裝入VersionChecker類文件的版本是什么?是WEB-INF/lib下的Version 1.0還是工具JAR下面的Version 2.0?測試結果如例12-9:

            例12-9類加載例2

            VersionChecker called from Servlet

            VersionChecker is v2.0.

            Loaded bycom.ibm.ws.classloader.CompoundClassLoader@26282628

          Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

          l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\WebSphere\AppServ

          er\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\ClassloaderExample

          .ear\VersionCheckerV2.jar

          Delegation Mode: PARENT_FIRST

          VersionChecker called from EJB

          VersionChecker is v2.0.

          Loaded bycom.ibm.ws.classloader.CompoundClassLoader@26282628

            Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\WebSphere\AppServ

          er\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\ClassloaderExample

          .ear\VersionCheckerV2.jar

            Delegation Mode: PARENT_FIRST

            正如所看到的,當同時調用EJB模塊和Web模塊,VersionChecker是Version 2.0。當然,原因是:WAR類加載器將請求委托給了父類加載器而不是他自己,所以工具JAR就被同一個類加載器加載,而無需考慮請求是來自于servlet還是EJB。

            12.5.3步驟 3:改變WAR類加載的委托模式

            現在是否希望Web模塊使用WEB-INF/lib目錄下面的VersionCheckerV1.jar文件?為了這個目的,需要先將類加載委托模式從parent first改為parent last。
           
            設置委托模式為PARENT_LAST,使用如下步驟:

            1. 在向導欄選擇Enterprise Applications;

            2. 選擇ClassloaderExample應用程序;

            3. 在模塊部分選擇Manage modules ;

            4. 選擇ClassloaderExampleWeb模塊;

            5. 將類加載順序修改成應用程序類加載優先(PARENT_LAST)。記住,這個條目應該稱為WAR類加載優先,參見 “類加載/委托模式”;

            6. 單擊OK.

            7. 保存配置;

            8. 重新啟動應用程序。

            WEB-INF/lib下的VersionCheckerV1返回version of 1.0。可以在例12-10中看到:

            例12-10類加載例3

            VersionChecker called from Servlet

            VersionChecker is v1.0.

            Loaded bycom.ibm.ws.classloader.CompoundClassLoader@4d404d40

            Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

          l\ClassloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\classes;C:\W

            ebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\Cl

          assloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\lib\VersionCheck

            erV1.jar;C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8

            Node02Cell\ClassloaderExample.ear\ClassloaderExampleWeb.war

            Delegation Mode: PARENT_LAST

            VersionChecker called from EJB

            VersionChecker is v2.0.

            Loaded bycom.ibm.ws.classloader.CompoundClassLoader@37f437f4

            Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

            l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\WebSphere\AppServ

            er\profiles\AppSrv02\installedApps \kcgg1d8Node02Cell\ClassloaderExample

          .ear\VersionCheckerV2.jar

            Delegation Mode: PARENT_FIRST

            如果你使用類加載器的搜索功能,搜索*VersionChecker*,會得到圖12-9:

            圖12-9類加載查看器搜索功能

            例12-11顯示源代碼

            例12-11類加載查看器搜索功能

            WAS Module Compound Class Loader (WAR class loader):

            file: / C: / WebSphere / AppServer / profiles / AppSrv02 /

            installedApps / kcgg1d8Node02Cell / ClassloaderExample.ear /

            ClassloaderExampleWeb.war / WEB-INF / lib / VersionCheckerV1.jar

            WAS Module Jar Class Loader (Application class loader):

            file: / C: / WebSphere / AppServer / profiles / AppSrv02 /

            installedApps / kcgg1d8Node02Cell / ClassloaderExample.ear /

            VersionCheckerV2.jar

            12.5.4步驟4:使用共享庫共享工具JAR

            在此之前,只有一個應用程序使用VersionCheckerV2.jar文件。是否希望多個應用程序能夠共享它?當然,你可以在每個EAR文件中把這個文件打包進去。但是如果需要修改這個工具JAR,那需要重新部署所有的應用程序。為了避免這個麻煩,你可以使用共享庫全局共享這個JAR文件。

            共享庫可以定義在單元、節點、應用程序服務器和集群。一旦你定義了共享庫,必須將它跟應用程序服務器的類加載器或者單獨的Web模塊關聯起來。根據共享庫指派的目的地不同,WebSphere會使用匹配的類加載器加載共享庫。

            只要愿意,可以定義多個共享庫。也可以為應用程序、Web模塊或者應用程序服務器指派多個共享庫。

            在應用程序級別使用共享庫

            定義一個名為VersionCheckerV2_SharedLib的共享庫,并把它跟ClassloaderTest應用程序關聯起來,步驟如下:

            1. 在管理控制臺,選擇Environment→Shared Libraries;

            2. 選擇共享庫的作用域,比如單元,單擊New;

            3. 如圖12-10:

            圖12-10共享庫配置

            –Name: 輸入VersionCheckerV2_SharedLib;

            –Class path: 輸入類路徑中的條目,每個條目之間用回車隔開。如果提供絕對路徑,建議是用WebSphere環境變量,比如%FRAMEWORK_JARS%/VersionCheckerV2.jar,確定你已經定義了一個和共享庫相同作用域的變量。

            –Native library path: 輸入JNI代碼使用的DLLs和.so文件列表。

            4. 單擊OK;

            5.選擇Applications → Enterprise Applications;

            6. 選擇應用程序ClassloadersExample ;

            7. 在引用選項,選擇Shared library references ;

            8. 在應用程序列選擇ClassloaderExample ;

            9. 單擊Reference shared libraries;

            10. 選擇VersionCheckerV2_SharedLib,單擊>>按鈕將選中的移動到Selected列,如下圖12-11:

            圖12-11指定一個共享庫

            11.單擊OK ;

            12.ClassloaderExample應用程序共享庫配置窗口如下圖12-12:

            圖12-12將共享庫指派給應用程序ClassloaderExample

            13.單擊OK,保存配置。

            如果我們現在從EAR文件的根目錄將VersionCheckerV2.jar刪除,在EJB模塊的manifest文件中也把引用刪除,重新啟動應用服務器,看到例12-12的結果。記住,Web模塊的類加載順序依然是應用程序類加載優先(PARENT_LAST)。

            例12-12類加載例4

            VersionChecker called from Servlet

            VersionChecker is v1.0.

            Loaded bycom.ibm.ws.classloader.CompoundClassLoader@2e602e60

            Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

          l\ClassloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\classes;C:\W

            ebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\Cl

            assloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\lib\VersionCheck

            erV1.jar;C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8
           
            Node02Cell\ClassloaderExample.ear\ClassloaderExampleWeb.war

            Delegation Mode: PARENT_LAST

            VersionChecker called from EJB

            VersionChecker is v2.0.

            Loaded bycom.ibm.ws.classloader.CompoundClassLoader@19141914

          Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

          l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\henrik\VersionChe

          ckerV2.jar

            Delegation Mode: PARENT_FIRST

            正如預料的,由于Web模塊的委托模式,當servlet需要VersionChecker類,VersionCheckerV1.jar文件被加載。當EJB需要VersionChecker的類的時候,就會從指向C:\henrik\VersionCheckerV2.jar的共享庫中加載它。如果你希望Web模塊也使用共享庫,只需要將類加載順序恢復成缺省值,Web模塊的類加載是父類加載優先。

            在應用程序服務器級別使用共享庫

            共享庫也可以跟應用程序服務器關聯起來。在這個服務器上的部署的所有應用程序都能夠看到共享庫的代碼列表。要把共享庫跟應用程序服務器關聯起來,首先要為應用程序服務器創建一個附加的類加載器,步驟如下:

            1. 選擇應用程序服務器;

            2. 在應用程序基礎結構部分,展開Java and Process Management,選擇Class loader;

            3. 選擇New,為這個類加載器選擇類加載順序,父類加載優先(PARENT_FIRST)或者應用程序類加載優先(PARENT_LAST),單擊Apply;

            4. 單擊剛剛創建的類加載器;

            5. 單擊Shared library references;

            6. 單擊Add,選擇希望跟應用程序服務器關聯的庫。重復選擇操作,將多個庫跟這個類加載器關聯。比如選擇VersionCheckerV2_SharedLib條目;

            7. 單擊OK;

            8. 保存配置;

            9. 重新啟動應用程序服務器,修改才會生效。

            將VersionCheckerV2共享庫跟應用程序服務器關聯起來,就得到例12-13的結果。

            例12-13類加載例5

            VersionChecker called from Servlet

            VersionChecker is v1.0.

            Loaded bycom.ibm.ws.classloader.CompoundClassLoader@40c240c2

            Local ClassPath:

            C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

          l\ClassloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\classes;C:\W

          ebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\Cl

          assloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\lib\VersionCheck

          erV1.jar;C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8

          Node02Cell\ClassloaderExample.ear\ClassloaderExampleWeb.war

          VersionChecker called from EJB

          VersionChecker is v2.0.

            Loaded bycom.ibm.ws.classloader.ExtJarClassLoader@7dee7dee

            Local ClassPath: C:\henrik\VersionCheckerV2.jar

            Delegation Mode: PARENT_FIRST

            我們定義的新的名為ExtJarClassLoader類加載器,在EJB模塊請求時,它裝入VersionCheckerV2.jar文件。由于委托模式,WAR類加載器繼續裝入自己的version。

            12.6類加載器問題診斷

            JVM 5.0提供了一些配置,可以讓我們查看詳細的類裝入,比如JVM參數 -verbose:dynload、-Dibm.cl.verbose=<name>。

            在實際開發過程中,如果使用不當,會出現很多類加載相關的問題。當遇到類加載問題時,可以查看WAS的相關日志,在日志中出現如下異常,可以認為是類加載器出現了問題:

            ClassCastException

            ClassNotFoundException

            NoClassDefFoundError

            NoSuchMethodError

            IllegalArgumentException

            UnsatisfiedLinkError

            VerifyError

            關于問題診斷,將在下一篇文章《WAS 6.1類加載問題診斷》詳細闡述。

            總結

            本文針對WAS6.1版本,詳細介紹了類加載的概念以及如何客戶化,并通過幾個例子向大家講述了影響類加載的選項的使用。雖然WAS 6.1允許根據需要修改類加載策略,比如將父類優先改成應用程序優先,但是不推薦這么使用。筆者曾經就遇到因為修改策略,導致應用程序無法啟動。原因是WAS中 的組件和應用程序使用的某些類是一致的,加載策略選擇不正確,就會導致類加載錯誤。

          posted @ 2014-03-04 11:10 Eric_jiang 閱讀(1606) | 評論 (0)編輯 收藏

          <%@ page import="java.security.Provider"%>
          <%@ page import="java.security.Security"%>
          <%@ page import="java.util.Set"%>
          <%@ page import="java.util.Iterator"%>
          <%
          Provider[] providers = Security.getProviders();
          for (int i = 0; i < providers.length; i++) {
          Provider provider = providers[i];
          %> 
            Provider name:  <%=provider.getName()%><br/>
            Provider information:  <%=provider.getInfo()%> <br/>
            Provider version:  <%=provider.getVersion()%><br/>
          <%
          Set entries = provider.entrySet();
          Iterator iterator = entries.iterator();
          while (iterator.hasNext()) {
          %>
          Property entry:<%=iterator.next()%><br/><br/><br/>
          <%
          }
          }
          %> 
           
          posted @ 2014-02-27 14:26 Eric_jiang 閱讀(270) | 評論 (0)編輯 收藏

          OA應用程序的性能測試包括了benchmarking test(基準測試),capacity test(容量測試)和soak test(浸泡測試)三個主要測試階段。  

          基準測試(Benchmarking Test)

          基于SOA的性能測試第一階段是基準測試,基準測試是用來確定被測應用程序是否存在性能衰退,并且收集可重復性能測試結果以作為性能基準。基準測試的最好方法是每次測試只改變一個參數。基準測試包括了相應時間驅動的測試和吞吐量驅動的測試。

          響應時間驅動測試

          對于web service的應用程序,其中響應時間定義為發送一個服務請求到收到服務響應的時間間隔。響應時間驅動的測試主要用來測試單個service的性能。首先加一個虛擬用戶作為負載量,然后對同一測試用例按照比例的增加并發虛擬用戶數,并分別記錄下測試結果,最后計算出這些測試結果的平均值作為平均響應時間。

          下圖為某個web服務在不同并發虛擬用戶數下平均響應時間曲線圖,由圖可看出,平均響應時間隨著并發虛擬用戶數的增加而增加。在用戶數從50到100,平均響應時間開始比較大幅度地增長,此時很有可能某個系統資源出現了瓶頸,當然前提條件是在被測應用程序沒有出現錯誤的情況下。此時可以進行調優,但要保證每次只改動一個參數值,然后再次執行相同測試用例,并與之前的結果進行對比,選取結果最優的參數配置。(圖略)

          吞吐量驅動測試

          吞吐量被定義為在單元時間內能夠成功處理的服務請求的數量。吞吐量驅動的測試主要是基于一組連續web服務形成一個或多個測試場景,來測量應用在單位時間內能夠處理的事務數量。

          這是針對一個業務場景進行的性能測試用例,同樣首先加一個虛擬用戶作為負載量,然后對同一測試用例按比例的增加并發虛擬用戶數,最后記錄下不同虛擬用戶數下的吞吐量。

          下圖為不同并發虛擬用戶數下吞吐量的曲線圖,與響應時間一樣,吞吐量也隨著并發虛擬用戶數的增長而增長,但不同的是吞吐量在達到某一最高點后,再增加并發虛擬用戶時吞吐量則保持與最高值接近。這是由于當用戶數較少時,單位時間內發出的服務請求較少,所以測出的吞吐量較小,當用戶數增加,發出的服務請求增加,所以吞吐量也隨之增加,當吞吐量達到最高值表明被測應用在測試的硬件環境下達到處理事務的最高能力。最后同樣要做性能調優,以選取最優的吞吐量最大值時的配置情況。(圖略)

          容量測試(Capacity Test)

          容量測試的目標是要看被測應用在一定測試環境下能夠達到的最大處理能力。容量測試將模擬更加接近真實用戶使用的環境,并且用更為真實的用戶負載來測試 SOA應用程序的capacity scale。具體地說,一般容量測試是為了檢測在達到一定響應時間或吞吐量的前提下被測應用能夠支持的并發用戶數。其中容量測試包括了以下幾方面內容:
          • 定義訪問系統的并發虛擬用戶數
          • 定義虛擬用戶的think time,也就是發出兩個連續請求之間的時間間隔。
          • 用ramp-up run的方式增加負載量進行測試,得到被測應用能夠支持的虛擬用戶數的范圍。
          • 在應用支持的用戶數地范圍內,采用flat run的方式進行測試,以得到更為精確性能結果。

          浸泡測試(Soak Test)

          Soak test是在一個穩定的并發用戶上進行的long run測試,用來測試SOA應用程序的健壯性。通過soak test往往可以發現內存泄露,頻繁 GC 等嚴重性能問題。進行soak test需要注意以下兩點:
          • Soak test需要在一定適中的用戶負載量下進行,最好低于應用支持最大的負載量。
          • 在執行long run測試時,采用幾種不同用戶組,并且每個用戶組織性不同的業務流程。

          Soak test實際上比較簡單的性能測試,測試最好能夠運行幾天,以真正得到一個健壯的應用。確保應用測試是貼近真實世界,盡量與實際使用情況接近。
          posted @ 2014-02-26 11:06 Eric_jiang 閱讀(322) | 評論 (0)編輯 收藏

          ed2k://|file|00.引論篇.單片機技術概論--力天手把手教你學單片機之引論篇(ED2000.COM).rar|116198953|04993919cda266c7ae254d9e1f16a754|h=r4yybdb755ei5y6wwr3deuokjv32sz2o|/
          ed2k://|file|測板視頻(ED2000.COM).rar|87174303|738bb1def1745290005db57f0b45be17|h=rwj2egwwlkfzmz3h54jh6ija3pkuvoim|/
          ed2k://|file|F1.附錄一.LT-Super51開發板測板視頻--力天手把手教你學單片機之附錄篇(ED2000.COM).rar|87252539|e7bed47466fd582d9f712516fe5c780f|h=2nolsdwfhqgmc3ihfn7s5rcss32oz2bz|/
          ed2k://|file|F2.附錄二.Keil軟件與仿真芯片簡介--力天手把手教你學單片機之附錄篇(ED2000.COM).rar|40071996|54570a6a528a95a3c59973257abb4482|h=3bjcz2jgakgnrt4xzf5cxw4h6ukuuu7o|/
          ed2k://|file|01.第一講.個人電腦使用入門上--力天手把手教你學單片機之入門篇(ED2000.COM).rar|70706563|1dd4a35ee3c8cc9096c8dd68cc38bfaf|h=meh5uqabezlzrp72c2tvccj3wxkmk3su|/
          ed2k://|file|02.第一講.個人電腦使用入門下--力天手把手教你學單片機之入門篇(ED2000.COM).rar|44356449|4e6b68176a38bdcb8b8e789e4c0928c7|h=ykdppuumqfqaienrwdefofi6lrbsrrfl|/
          ed2k://|file|03.第二講.硬件技術基本知識上--力天手把手教你學單片機之入門篇(ED2000.COM).rar|92332119|81290b5c6055fca5485e32309c3acf8e|h=qqq4uzd6ir2thkia47rnscrzob36ppmf|/
          ed2k://|file|04.第二講.硬件技術基礎知識下--力天手把手教你學單片機之入門篇(ED2000.COM).rar|106525273|040e88a053ef869c38491c0872a8f464|h=hshxdsyg2raofwf36qtffh6kadrf7qzl|/
          ed2k://|file|05.第三講.數字電路基礎知識上--力天手把手教你學單片機之入門篇(ED2000.COM).rar|87904764|22e07a3ff94a4a93b9eeaa55cd79b6d4|h=pf3yntcv7xteagoenrwwsdi3tps7cz5q|/
          ed2k://|file|06.第三講.數字電路基礎知識下--力天手把手教你學單片機之入門篇(ED2000.COM).rar|190036276|3eda75d4beda8f7c818858077d4b7391|h=fwbupymnho2yttdmswxny7pmngnngqvn|/
          ed2k://|file|07.第四講.C語言基礎知識--力天手把手教你學單片機之入門篇(ED2000.COM).rar|56984538|a1e21c8b5f08a878d07dec4bffce0913|h=dtl2mkwexowopvegullkzvzzlwsri5vu|/
          ed2k://|file|08.第五講.51單片機最小系統上--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|113912150|494f52ec21225b7a5f5484dad67a36a5|h=buxo3bdu6rh6ivjli4ujxu272y4fdvdw|/
          ed2k://|file|09.第五講.51單片機最小系統下--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|71018952|5495edfcafaec2cc811d78084b58e70c|h=tecyreeeeyrr2gj2i4mnu7tgkr7iquq7|/
          ed2k://|file|10.第六講.C語言數據類型及表達式上--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|78411079|1affbd3650cb88686f8b7ccfd9ff3f48|h=sc526w36iirl54vixluliyi4bg2oizas|/
          ed2k://|file|11.第六講.C語言數據類型及表達式下--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|74736608|586c2f433542f51e8da7e2fe3a62c435|h=vhtzevx4guf7tqlc2t7cr2ua5jc4corq|/
          ed2k://|file|12.第七講.C語言的三種語句結構上--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|92409556|58a2fbbdbbe5e3ec7b70e03ab65613a3|h=5jfvo7w7me6tppcw4rioelkfkax3lndr|/
          ed2k://|file|13.第七講.C語言的三種語句結構中--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|81186040|8a8530338be5ff1c9c3cce9129f2d2f2|h=tpcxswdr4735f6vfjgkwc6peaep5dxi7|/
          ed2k://|file|14.第七講.C語言的三種語句結構下--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|119030765|2cc7fbb81468cbd11413579a33517d8a|h=zxtp2o373qlmf5jxfaplcwgmr56qwwsm|/
          ed2k://|file|15.第八講.C語言函數與預處理上--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|104871043|ec7ad639bde6a516a01a8f76c0d79a86|h=koukgq2tghashva4czql5zzlvhklmrbj|/
          ed2k://|file|16.第八講.C語言函數與預處理下--力天手把手教你學單片機之基礎篇(ED2000.COM).rar|136901486|104df53529b0cb00e9460f3929b01022|h=wzluqrqpi2iui45otg64yns32qs2tg6j|/
          ed2k://|file|17.第九講.輸出型外設與51的IO口上--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|73325409|7cdb241632cbb32daf51b471d79f9eaf|h=64ds2lrbkwrb7q4m2brjqdtwifxecod7|/
          ed2k://|file|18.第九講.輸出型外設與51的IO口中--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|94226255|b41df92c7064221dd6cb7361b3b429e4|h=f6ifvjekxuqnlmqjolrcjkmukahuwxoq|/
          ed2k://|file|19.第九講.輸出型外設與51的IO口下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|153946670|f2263f26eb08e22c8f4920959e03d843|h=lp4nzrzbqhg5til5pxwcmllnjznwc5xk|/
          ed2k://|file|20.第十講.單個按鍵與中斷上--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|93598612|c2d50f545db19cb50d243fd38b5d38e0|h=wvq7smbwnlrupukyoey7gybjsdoyqoze|/
          ed2k://|file|21.第十講.單個按鍵與中斷中--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|105926905|f945adc2290b709463c893a4c712be03|h=y44dshsprqon254hsgfowdgpmi6q7y3t|/
          ed2k://|file|22.第十講.單個按鍵與中斷下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|77841692|7b119a68fb5b2af645ebfefb5afa0d0c|h=swgiwxsdral7mtltcmscrkjivi5j3fn5|/
          ed2k://|file|23.第十一講.數碼管與定時器上--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|84099347|c9e222594efe1a82943d2f231a0f46c5|h=hdexi5znisj734bszgwevtbsodh72cvz|/
          ed2k://|file|24.第十一講.數碼管與定時器中--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|143310474|6496593f40d8efb741a3cbe9b6493967|h=a2p7aftixioythhydp6bn63o3q43ofwn|/
          ed2k://|file|25.第十一講.數碼管與定時器中下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|127917403|e54d013831d33f09d89b8c9633f36d58|h=oej6awqbb7nbbsnnc6z3xedfyn3qbqau|/
          ed2k://|file|26.第十一講.數碼管與定時器下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|134759743|295368255a81b50315202678bc36f835|h=h4uk5fm7cpvkxgbhpxsk2cqt4p7fohv2|/
          ed2k://|file|27.第十二講.矩陣鍵盤上--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|96733666|6b498a4d08597e2d450e207557d613fb|h=xq74tbqfaiyhmd3hp63dru7qw2wj2fdp|/
          ed2k://|file|28.第十二講.矩陣鍵盤下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|82126983|3bf9553923cacf46ff73be2a20c5cfcf|h=o43ldxl5apxdbp4mey25scdszhhualid|/
          ed2k://|file|29.第十二講.專題一之頭文件與模塊化編程詳解上--力天手把手教你學單片機之附錄篇(ED2000.COM).rar|81946415|05f7c9d194496418bf106df0ebd7de3c|h=lpypjbkrtufogkcniz22ti7f75zeinsm|/
          ed2k://|file|30.第十二講.專題一之頭文件與模塊化編程詳解中--力天手把手教你學單片機之附錄篇(ED2000.COM).rar|100729778|feba3a57adb8006f49aa8ffc9784fad7|h=q2dehsegzka5i34qe3lkivdsy5viiv5a|/
          ed2k://|file|31.第十二講.專題一之頭文件與模塊化編程詳解下--力天手把手教你學單片機之附錄篇(ED2000.COM).rar|88298330|242d113db23dde67795bf2d9b1b5af58|h=iofeh5ssgzuwh54bonxkxfg5vs252nkb|/
          ed2k://|file|32.第十三講.異步串行通信上--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|77877845|e0e9f2b7a33371da85cced8550fc684f|h=fpgfqm2ityfkjncml3bqxwt4v2moco6k|/
          ed2k://|file|33.第十三講.異步串行通信中--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|87492573|b319aa1a4bf677bd018fe2736fe8d04b|h=yvzadbri3isxooedfgsw4xlmd67n5rrn|/
          ed2k://|file|34.第十三講.異步串行通信中下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|141727825|149484e738c7eb3de861bfe41a8c2098|h=uk3ennvddpbqo5hygdwu5bhmkksyolsl|/
          ed2k://|file|35.第十三講.異步串行通信下--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|79633620|3f0fc643164c78544f0dd19a00f3af15|h=qni3nckecwkzx66r3th3l33yr2j2sikt|/
          ed2k://|file|36.第十四講.SPI接口與DS1302一--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|84404944|0d90567cc5bc52df5dc637dd2bcf3ca9|h=pj4yerjbqwqcavqgsoxp4llvaa2j6hg2|/
          ed2k://|file|37.第十四講.SPI接口與DS1302二--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|85216414|402f81e6bdeb40e226dca416ebaf16eb|h=uohl7lgb5td2kimincmzqdnvcztipiq5|/
          ed2k://|file|38.第十四講.SPI接口與DS1302三--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|161674644|71deb074c4cd3469fae7ce5d0b725b94|h=gfi4h6dmqaanq6s4s6ozlw6eq3p5szjy|/
          ed2k://|file|39.第十四講.SPI接口與DS1302四--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|100130738|0efe0a45f00aad48f47eca8d88bce3ec|h=uiq43qi7efdxcbluldqogsb2rq77ih7h|/
          ed2k://|file|40.第十四講.SPI接口與DS1302五--力天手把手教你學單片機之實戰篇(ED2000.COM).rar|95816321|42a72c632250c01a010fda0314db4a0c|h=ywklgocdsosutegm6esr5bnpmzhmy3nn|/
          ed2k://|file|01用戶手冊【力天電子原創www.LT430.com】(ED2000.COM).rar|1367735|6fbe3deb36554dc50f35af23fae88226|h=7p6pv3y53su5nqbvw2wbsxopcev7nnby|/
          ed2k://|file|02電路圖【力天電子原創www.LT430.com】(ED2000.COM).rar|5632719|5f72617b2cbc431a3b4e6c0eb94bcf6e|h=ouyekd6ycyayod3oo4uplcbwjzl4b4qo|/
          ed2k://|file|03例程代碼【力天電子原創www.LT430.com】(ED2000.COM).rar|30874083|93933fe948eb439b228617dfa19faa1f|h=babtbvjd2dvypypnp5b2grzvt56qfgvo|/
          ed2k://|file|04數據手冊【力天電子原創www.LT430.com】(ED2000.COM).rar|15053425|30fa2af2a85c0efa121d2b6e03dd1da5|h=xevvrivdk24qjw5cua7x23hnkthh3iph|/
          ed2k://|file|05開發軟件【力天電子原創www.LT430.com】(ED2000.COM).rar|37069108|7d1efc6cc416c473c747aa116f4f67b1|h=qcptsagqatkjqpnz3wwpe77ljmdxblaq|/
          ed2k://|file|03例程代碼(ED2000.COM).rar|30765342|2afdab30d4209e97168a405956f32e91|h=lzi345qpgvchgkzroliuacvcsc4lwxge|/
          ed2k://|file|41.第十五講.SPI接口與DS1302六--力天手把手教你學單片機之實戰篇七(ED2000.COM).rar|90014503|5534fe398aa5f4d1854fa0881415b11c|h=lizwjgbuq5urc2wx4jjhdzio3tjwnirg|/
          ed2k://|file|42.第十五講.SPI接口與DS1302七--力天手把手教你學單片機之實戰篇七(ED2000.COM).rar|119435391|09de8cb0ed0b8617e42d2e7480dfa978|h=c53t2inh67vcldlnje5uiccufsqcfwuz|/
          ed2k://|file|43.第十六講.IIC接口與AT24C02一--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|88564982|4914cb676bc9d411895cd0d3bcda42fb|h=kf2e4too2dj2naxnhuihp2t7qgcwa3xp|/
          ed2k://|file|44.第十六講.IIC接口與AT24C02二--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|101793624|39e882425a20f91fdf600effcf7978d9|h=ezi6x5mvtaykkoo4czi6ix56dajyffqc|/
          ed2k://|file|45.第十六講.IIC接口與AT24C02三--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|73099158|7017886c3e8f296bb36ac700144babfe|h=oki5m7ehjxhbcixvvuqkqtb3t4e7q4ox|/
          ed2k://|file|46.第十六講.IIC接口與AT24C02四--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|98541388|75c686b408f1b301962dc458f7dd473f|h=s2ny5m3ailghiclv2nipjf6e3jvwus6t|/
          ed2k://|file|47.第十六講.IIC接口與AT24C02五--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|64191448|c7e458150320cc0f2aa0c8d17e1e0bad|h=bgkcjw5fadacmriwg5p25kiehenee62c|/
          ed2k://|file|48.第十六講.IIC接口與AT24C02六--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|84001540|3ee9e8b78970eb3e4607bc84b36d9e0f|h=omo4ps3phrht4hahp76lc4s2ksm47kwr|/
          ed2k://|file|49.第十六講.IIC接口與AT24C02七--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|87094227|dae23f6af62860c859322cb3ca71c261|h=b64ogps7o3dut3o6727pafu3dznwkmff|/
          ed2k://|file|50.第十六講.IIC接口與AT24C02八--力天手把手教你學單片機之實戰篇八(ED2000.COM).rar|38441693|2cd216ed57e839e8ae64b7839befa3a8|h=vvbeuv2ml2gyzlyorigxzbun2p7geupi|/
          ed2k://|file|51.第十七講.專題二:串行通訊與并行通訊一--力天手把手教你學單片機之實戰篇九(ED2000.COM).rar|76844269|56257589b93f82cefd1f5d8892514bc8|h=bqp3dxketimariaek5lyp7mozzhelbju|/
          ed2k://|file|52.第十七講.專題二:串行通訊與并行通訊二--力天手把手教你學單片機之實戰篇九(ED2000.COM).rar|121677398|9038a9c8b59f8f5e2105a941a6583235|h=gua2cdy7h36zghxh72ye7e3z4vdvzdhw|/
          ed2k://|file|53.第十八講.模數轉換器ADC0804一--力天手把手教你學單片機之實戰篇十(ED2000.COM).rar|94360616|219bfe8e3ae18bb61c95c051b1e3950d|h=pxhuj3ga4sxrnnvkcryta32mjxpwusy7|/
          ed2k://|file|54.第十八講.模數轉換器ADC0804二--力天手把手教你學單片機之實戰篇十(ED2000.COM).rar|88779494|7a8bdc6c88e0c98d019ef40374a1ac12|h=t7bvwua6bvs5qw5l2iy3stdbou6nfbqx|/
          ed2k://|file|55.第十八講.模數轉換器ADC0804三--力天手把手教你學單片機之實戰篇十(ED2000.COM).rar|65213047|3e47deaea1db10c234cd621d4ed08bc8|h=qehsshsi6l45wrdfixcakxqlefc6cavf|/
          ed2k://|file|56.第十八講.模數轉換器ADC0804四--力天手把手教你學單片機之實戰篇十(ED2000.COM).rar|86427611|a0177f7c349ebab87c8a021f2ae06707|h=dw3mlu6sgfglbp6r6633iuot6rojl7rt|/
          ed2k://|file|57.第十八講.模數轉換器ADC0804五--力天手把手教你學單片機之實戰篇十(ED2000.COM).rar|106459634|b5221adfc8f6e5a1d4975ff6752e69e4|h=5xf76yhei2gtuil2zo77kvbhcuybtdog|/
          ed2k://|file|58.第十八講.數模轉換器DAC0832一--力天手把手教你學單片機之實戰篇十一(ED2000.COM).rar|67479391|2779bc7f91027602141dc11d1c207b1a|h=idbd4zxnjzgkf3b7jh4mq5b7neyfgi2p|/
          ed2k://|file|59.第十八講.數模轉換器DAC0832二--力天手把手教你學單片機之實戰篇十一(ED2000.COM).rar|114120160|296b30db780d3b5b82d557b511b6e2bf|h=d7bygbkdydawnt2aohto3taopnvbtwi7|/
          ed2k://|file|60.第十八講.數模轉換器DAC0832三--力天手把手教你學單片機之實戰篇十一(ED2000.COM).rar|71594266|b8e810699e6343ba51b3184f96804673|h=eia5syqio34iqzjqy3e3gybkm36qcsaw|/
          ed2k://|file|61.第十八講.數模轉換器DAC0832四--力天手把手教你學單片機之實戰篇十一(ED2000.COM).rar|71140207|243e813469cf1f510e8b57e6ca304389|h=zintu4pjsk5iwgiwpgahb37x5d6xqe2c|/
          posted @ 2014-01-24 10:13 Eric_jiang 閱讀(489) | 評論 (0)編輯 收藏

          在linux中啟動crontab服務:

          /etc/init.d/crond  start

          crontab的命令格式

          crontab -l   顯示當前的crontab 文件(默認編寫的crontab文件會保存在 (/var/spool/cron/用戶名   例如: /var/spool/cron/roger)

          crontab -r 刪除當前的crontab (謹慎使用此方法,因為將會把所有的計劃任務全部刪除)

           

          crontab -e 使用編輯器編輯當前的crontab文件

           

          crontab 的文件格式:

           

                           minutes          hour            day-of-month           month-of-year       day-of-week            commands

          例如:

                              0                 4                     *                               *                           2,5                 /usr/bin/wall</etc/motd

          *************解釋:每周的周二和周五廣播  /etc/motd中的信息************************************************

                             */2             12-14               *                             3-6,9-12                   1-5                   bash_scripts

          *******************解釋:每年的3-6月份,以及9-12月份的周一到周五的下午12-14點,每隔兩分鐘執行一個腳本*****

           

          crontab的配置文件放在 /etc/crontab中


          第1列分鐘1~59
          第2列小時1~23(0表示子夜)
          第3列日1~31
          第4列月1~12
          第5列星期0~6(0表示星期天)
          第6列要運行的命令

          下面是crontab的格式:
          分 時 日 月 星期 要運行的命令

          這里有crontab文件條目的一些例子:

          30 21 * * * /usr/local/apache/bin/apachectl restart
          上面的例子表示每晚的21:30重啟apache。

          45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
          上面的例子表示每月1、10、22日的4 : 45重啟apache。

          10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
          上面的例子表示每周六、周日的1 : 10重啟apache。

          0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
          上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重啟apache。

          0 23 * * 6 /usr/local/apache/bin/apachectl restart
          上面的例子表示每星期六的11 : 00 pm重啟apache。

          * */1 * * * /usr/local/apache/bin/apachectl restart
          每一小時重啟apache

          * 23-7/1 * * * /usr/local/apache/bin/apachectl restart
          晚上11點到早上7點之間,每隔一小時重啟apache

          0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
          每月的4號與每周一到周三的11點重啟apache

          0 4 1 jan * /usr/local/apache/bin/apachectl restart
          一月一號的4點重啟apache



          posted @ 2014-01-22 16:54 Eric_jiang 閱讀(236) | 評論 (0)編輯 收藏

          Gdb 調試器
          調試是所有程序員都會面臨的問題。如何提高程序員的調試效率,更好更快地定位程序中的問題從而加快程序開發的進度,是大家共同面對的。就如讀者熟知的Windows下的一些調試工具,如VC自帶的如設置斷點、單步跟蹤等,都受到了廣大用戶的贊賞。那么,在Linux下有什么很好的調試工具呢?
          本文所介紹的Gdb 調試器是一款GNU 開發組織并發布的UNIX/Linux 下的程序調試工具。雖然,它沒有圖形化的友好界面,但是它強大的功能也足以與微軟的VC 工具等媲美。
          下面就請跟隨筆者一步步學習Gdb調試器。
          3.5.1 Gdb使用流程
          這里給出了一個短小的程序,由此帶領讀者熟悉一下Gdb 的使用流程。建議讀者能夠實
          際動手操作。
          首先,打開Linux 下的編輯器Vi或者Emacs,編輯如下代碼(由于為了更好地熟悉Gdb的操作,筆者在此使用Vi 編輯,希望讀者能夠參見3.3 節中對Vi 的介紹,并熟練使用Vi)。
          /*test.c*/
          #include <stdio.h>
          int sum(int m);
          int main()
          {
          int i,n=0;
          sum(50);
          for(i=1; i<=50; i++)
          {
          n += i;
          }
          printf("The sum of 1-50 is %d \n", n );
          }
          int sum(int m)
          {
          int i,n=0;
          for(i=1; i<=m;i++)
          n += i;
          printf("The sum of 1-m is %d\n", n);
          }
          在保存退出后首先使用Gcc對test.c進行編譯,注意一定要加上選項“-g”,這樣編譯出的可執行代碼中才包含調試信息,否則之后Gdb 無法載入該可執行文件。
          [root@localhost Gdb]# gcc -g test.c -o test
          雖然這段程序沒有錯誤,但調試完全正確的程序可以更加了解Gdb 的使用流程。接下來就啟動Gdb 進行調試。注意,Gdb 進行調試的是可執行文件,而不是如“.c”的源代碼,因此,需要先通過Gcc編譯生成可執行文件才能用Gdb進行調試。
          [root@localhost Gdb]# gdb test
          GNU Gdb Red Hat Linux (6.3.0.0-1.21rh)
          Copyright 2004 Free Software Foundation, Inc.
          GDB is free software, covered by the GNU General Public License, and you are
          welcome to change it and/or distribute copies of it under certain conditions.
          Type "show copying" to see the conditions.
          There is absolutely no warranty for GDB. Type "show warranty" for details.
          This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db
          library "/lib/libthread_db.so.1".
          (gdb)
          可以看出,在Gdb 的啟動畫面中指出了Gdb 的版本號、使用的庫文件等信息,接下來就進入了由“(gdb)”開頭的命令行界面了。
          (1)查看文件
          在 Gdb 中鍵入“l”(list)就可以查看所載入的文件,如下所示:
          注意
          在Gdb的命令中都可使用縮略形式的命令,如“l”代便“list”,“b”代表“breakpoint”,“p”代表“print”等,讀者也可使用“help”命令查看幫助信息。
          (Gdb) l
          1 #include <stdio.h>
          2 int sum(int m);
          3 int main()
          4 {
          5 int i,n=0;
          6 sum(50);
          7 for(i=1; i<=50; i++)
          8 {
          9 n += i;
          10 }
          (Gdb) l
          11 printf("The sum of 1~50 is %d \n", n );
          12
          13 }
          14 int sum(int m)
          15 {
          16 int i,n=0;
          17 for(i=1; i<=m;i++)
          18 n += i;
          19 printf("The sum of 1~m is = %d\n", n);
          20 }
          可以看出,Gdb 列出的源代碼中明確地給出了對應的行號,這樣就可以大大地方便代碼的定位。
          (2)設置斷點
          設置斷點是調試程序中是一個非常重要的手段,它可以使程序到一定位置暫停它的運行。因此,程序員在該位置處可以方便地查看變量的值、堆棧情況等,從而找出代碼的癥結所在。
          在 Gdb 中設置斷點非常簡單,只需在“b”后加入對應的行號即可(這是最常用的方式,另外還有其他方式設置斷點)。如下所示:
          (Gdb) b 6
          Breakpoint 1 at 0x804846d: file test.c, line 6.
          要注意的是,在Gdb 中利用行號設置斷點是指代碼運行到對應行之前將其停止,如上例中,代碼運行到第5行之前暫停(并沒有運行第5行)。
          (3)查看斷點情況
          在設置完斷點之后,用戶可以鍵入“info b”來查看設置斷點情況,在Gdb 中可以設置
          多個斷點。
          (Gdb) info b
          Num Type Disp Enb Address What
          1 breakpoint keep y 0x0804846d in main at test.c:6
          (4)運行代碼
          接下來就可運行代碼了,Gdb默認從首行開始運行代碼,可鍵入“r”(run)即可(若想從程序中指定行開始運行,可在r 后面加上行號)。
          (Gdb) r
          Starting program: /root/workplace/Gdb/test
          Reading symbols from shared object read from target memory...done.
          Loaded system supplied DSO at 0x5fb000
          Breakpoint 1, main () at test.c:6
          6 sum(50);
          可以看到,程序運行到斷點處就停止了。
          (5)查看變量值
          在程序停止運行之后,程序員所要做的工作是查看斷點處的相關變量值。在Gdb 中只需
          鍵入“p”+變量值即可,如下所示:
          (Gdb) p n
          $1 = 0
          (Gdb) p i
          $2 = 134518440
          在此處,為什么變量“i”的值為如此奇怪的一個數字呢?原因就在于程序是在斷點設置的對應行之前停止的,那么在此時,并沒有把“i”的數值賦為零,而只是一個隨機的數字。但變量“n”是在第四行賦值的,故在此時已經為零。
          小技巧
          Gdb 在顯示變量值時都會在對應值之前加上“$N”標記,它是當前變量值的引用標記,所以以后若想再次引用此變量就可以直接寫作“$N”,而無需寫冗長的變量名。
          (6)單步運行
          單步運行可以使用命令“n”(next)或“s”(step),它們之間的區別在于:若有函數調用的時候,“s”會進入該函數而“n”不會進入該函數。因此,“s”就類似于VC等工具中的
          “step in”,“n”類似與VC等工具中的“step over”。它們的使用如下所示:
          (Gdb) n
          The sum of 1-m is 1275
          7 for(i=1; i<=50; i++)
          (Gdb) s
          sum (m=50) at test.c:16
          16 int i,n=0;
          可見,使用“n”后,程序顯示函數sum的運行結果并向下執行,而使用“s”后則進入到sum函數之中單步運行。
          (7)恢復程序運行
          在查看完所需變量及堆棧情況后,就可以使用命令“c”(continue)恢復程序的正常運行了。這時,它會把剩余還未執行的程序執行完,并顯示剩余程序中的執行結果。以下是之前使用“n”命令恢復后的執行結果:
          (Gdb) c
          Continuing.
          The sum of 1-50 is :1275
          Program exited with code 031.
          可以看出,程序在運行完后退出,之后程序處于“停止狀態”。
          小知識
          在Gdb中,程序的運行狀態有“運行”、“暫停”和“停止”3種,其中“暫停”狀態為程序遇到了斷點或觀察點之類的,程序暫時停止運行,而此時函數的地址、函數參數、函數內的局部變量都會被壓入“棧”(Stack)中。故在這種狀態下可以查看函數的變量值等各種屬性。但在函數處于“停止”狀態之后,“棧”就會自動撤銷,它也就無法查看各種信息了。
          3.5.2 Gdb基本命令
          Gdb 的命令可以通過查看help 進行查找,由于Gdb 的命令很多,因此Gdb 的help 將其分成了很多種類(class),用戶可以通過進一步查看相關class找到相應命令。如下所示:
          (gdb) help
          List of classes of commands:
          aliases -- Aliases of other commands
          breakpoints -- Making program stop at certain points
          data -- Examining data
          files -- Specifying and examining files
          internals -- Maintenance commands
          Type "help" followed by a class name for a list of commands in that class.
          Type "help" followed by command name for full documentation.
          Command name abbreViations are allowed if unambiguous.
          上述列出了Gdb 各個分類的命令,注意底部的加粗部分說明其為分類命令。接下來可以
          具體查找各分類種的命令。如下所示:
          (gdb) help data
          Examining data.
          List of commands:
          call -- Call a function in the program
          delete display -- Cancel some expressions to be displayed when program stops
          delete mem -- Delete memory region
          disable display -- Disable some expressions to be displayed when program stops
          Type "help" followed by command name for full documentation.
          Command name abbreViations are allowed if unambiguous.
          至此,若用戶想要查找call命令,就可鍵入“help call”。
          (gdb) help call
          Call a function in the program.
          The argument is the function name and arguments, in the notation of the
          current working language. The result is printed and saved in the value
          history, if it is not void.
          當然,若用戶已知命令名,直接鍵入“help [command]”也是可以的。
          Gdb 中的命令主要分為以下幾類:工作環境相關命令、設置斷點與恢復命令、源代碼查看命令、查看運行數據相關命令及修改運行參數命令。以下就分別對這幾類的命令進行講解。
          1.工作環境相關命令
          Gdb中不僅可以調試所運行的程序,而且還可以對程序相關的工作環境進行相應的設定,甚至還可以使用shell 中的命令進行相關的操作,其功能極其強大。表3.10 所示為Gdb 常見工作環境相關命令。
          表3.10 Gdb 工作環境相關命令
          命令格式 含義
          set args 運行時的參數指定運行時參數,如set args 2
          show args 查看設置好的運行參數
          path dir 設定程序的運行路徑
          show paths 查看程序的運行路徑
          set enVironment var [=value] 設置環境變量
          show enVironment [var] 查看環境變量
          cd dir 進入到dir目錄,相當于shell中的cd命令
          pwd 顯示當前工作目錄
          shell command 運行shell的command命令
          2.設置斷點與恢復命令
          Gdb 中設置斷點與恢復的常見命令如表3.11 所示。
          表 3.11 Gdb 設置斷點與恢復相關命令
          命令格式  含義
          bnfo b 查看所設斷點
          break 行號或函數名 <條件表達式> 設置斷點
          tbreak 行號或函數名 <條件表達式> 設置臨時斷點,到達后被自動刪除
          delete [斷點號] 刪除指定斷點,其斷點號為“info b”中的第一欄。若缺省斷點號則刪除所有斷點
          disable [斷點號]] 停止指定斷點,使用“info b”仍能查看此斷點。同delete一樣,省斷點號則停止所有斷點
          enable  [斷點號] 激活指定斷點,即激活被disable停止的斷點
          condition [斷點號] <條件表達式> 修改對應斷點的條件
          ignore [斷點號]<num> 在程序執行中,忽略對應斷點num次
          step 單步恢復程序運行,且進入函數調用
          next 單步恢復程序運行,但不進入函數調用
          finish 運行程序,直到當前函數完成返回
          c 繼續執行函數,直到函數結束或遇到新的斷點
          由于設置斷點在Gdb 的調試中非常重要,所以在此再著重講解一下Gdb中設置斷點的方法。Gdb 中設置斷點有多種方式:其一是按行設置斷點,設置方法在3.5.1節已經指出,在此就不重復了。另外還可以設置函數斷點和條件斷點,在此結合上一小節的代碼,具體介紹后兩種設置斷點的方法。
          ① 函數斷點
          Gdb 中按函數設置斷點只需把函數名列在命令“b”之后,如下所示:
          (gdb) b sum
          Breakpoint 1 at 0x80484ba: file test.c, line 16.
          (gdb) info b
          Num Type Disp Enb Address What
          1 breakpoint keep y 0x080484ba in sum at test.c:16
          要注意的是,此時的斷點實際是在函數的定義處,也就是在16 行處(注意第16 行還未
          執行)。
          ② 條件斷點
          Gdb 中設置條件斷點的格式為:b 行數或函數名if 表達式。具體實例如下所示:
          (gdb) b 8 if i==10
          Breakpoint 1 at 0x804848c: file test.c, line 8.
          (gdb) info b
          Num Type Disp Enb Address What
          1 breakpoint keep y 0x0804848c in main at test.c:8
          stop only if i == 10
          (gdb) r
          Starting program: /home/yul/test
          The sum of 1-m is 1275
          Breakpoint 1, main () at test.c:9
          9 n += i;
          (gdb) p i
          $1 = 10
          可以看到,該例中在第8 行(也就是運行完第7 行的for 循環)設置了一個“i==0”的條件斷點,在程序運行之后可以看出,程序確實在i為10 時暫停運行。
          3.Gdb 中源碼查看相關命令
          在 Gdb 中可以查看源碼以方便其他操作,它的常見相關命令如表3.12 所示。
          表3.12 Gdb 源碼查看相關相關命令
          命令格式 含義
          list <行號>|<函數名> 查看指定位置代碼
          file [文件名] 加載指定文件
          forward-search  正則表達式源代碼前向搜索
          reverse-search  正則表達式源代碼后向搜索
          dir dir 停止路徑名
          show directories 顯示定義了的源文件搜索路徑
          info line 顯示加載到Gdb內存中的代碼
          4.Gdb 中查看運行數據相關命令
          Gdb 中查看運行數據是指當程序處于“運行”或“暫停”狀態時,可以查看的變量及表
          達式的信息,其常見命令如表3.13 所示:
          表3.13 Gdb 查看運行數據相關命令
          命令格式 含義
          print 表達式|變量查看程序運行時對應表達式和變量的值
          x <n/f/u>   查看內存變量內容。其中n為整數表示顯示內存的長度,f表示顯示的格式,u表示從當前地址往后請求顯示的字節數
          display 表達式設定在單步運行或其他情況中,自動顯示的對應表達式的內容
          5.Gdb 中修改運行參數相關命令
          Gdb 還可以修改運行時的參數,并使該變量按照用戶當前輸入的值繼續運行。它的設置方法為:在單步執行的過程中,鍵入命令“set 變量=設定值”。這樣,在此之后,程序就會按照該設定的值運行了。下面,筆者結合上一節的代碼將n的初始值設為4,其代碼如
          下所示:
          (Gdb) b 7
          Breakpoint 5 at 0x804847a: file test.c, line 7.
          (Gdb) r
          Starting program: /home/yul/test
          The sum of 1-m is 1275
          Breakpoint 5, main () at test.c:7
          7 for(i=1; i<=50; i++)
          (Gdb) set n=4
          (Gdb) c
          Continuing.
          The sum of 1-50 is 1279
          Program exited with code 031.
          可以看到,最后的運行結果確實比之前的值大了4。
          Gdb的使用切記點:
          · 在Gcc編譯選項中一定要加入“-g”。
          · 只有在代碼處于“運行”或“暫停”狀態時才能查看變量值。
          · 設置斷點后程序在指定行之前停
          posted @ 2014-01-15 15:59 Eric_jiang 閱讀(387) | 評論 (2)編輯 收藏

          3.4 Gcc 編譯器
          GNU CC(簡稱為Gcc)是GNU項目中符合ANSI C 標準的編譯系統,能夠編譯用C、C++和Object C等語言編寫的程序。Gcc不僅功能強大,而且可以編譯如C、C++、Object C、Java、Fortran、Pascal、Modula-3 和Ada 等多種語言,而且Gcc 又是一個交叉平臺編譯器,它能夠在當前CPU平臺上為多種不同體系結構的硬件平臺開發軟件,因此尤其適合在嵌入式領域的開發編譯。本章中的示例,除非特別注明,否則均采用Gcc版本為4.0.0。
          下表3.6 是Gcc支持編譯源文件的后綴及其解釋。
          表3.6 Gcc所支持后綴名解釋
          后綴名 所對應的語言             后綴名 所對應的語言
          .c C原始程序                 .s/.S  匯編語言原始程序
          .C/.cc/.cxx        C++原始程序             .h       預處理文件(頭文件)
          .m                    Objective-C原始程序  .o       目標文件
          .i 已經過預處理的C原始程序              .a/.so     編譯后的庫文件
          .ii 已經過預處理的C++原始程序
          3.4.1 Gcc編譯流程解析
          如本章開頭提到的,Gcc的編譯流程分為了4個步驟,分別為:
          · 預處理(Pre-Processing);
          · 編譯(Compiling);
          · 匯編(Assembling);
          · 鏈接(Linking)。
          下面就具體來查看一下Gcc是如何完成4 個步驟的。
          首先,有以下hello.c源代碼:
          #include<stdio.h>
          int main()
          {
          printf("Hello! This is our embedded world!\n");
          return 0;
          }
          (1)預處理階段
          在該階段,編譯器將上述代碼中的stdio.h編譯進來,并且用戶可以使用Gcc的選項“-E”進行查看,該選項的作用是讓Gcc在預處理結束后停止編譯過程。
          注意
          Gcc指令的一般格式為:Gcc [選項] 要編譯的文件 [選項] [目標文件]
          其中,目標文件可缺省,Gcc默認生成可執行的文件,命為:編譯文件.out
          [root@localhost Gcc]# Gcc –E hello.c –o hello.i
          在此處,選項“-o”是指目標文件,由表3.6 可知,“.i”文件為已經過預處理的C 原始程序。以下列出了hello.i文件的部分內容:
          typedef int (*__gconv_trans_fct) (struct __gconv_step *,
          struct __gconv_step_data *, void *,
          __const unsigned char *,
          __const unsigned char **,
          __const unsigned char *, unsigned char **,
          size_t *);
          # 2 "hello.c" 2
          int main()
          {
          printf("Hello! This is our embedded world!\n");
          return 0;
          }
          由此可見,Gcc確實進行了預處理,它把“stdio.h”的內容插入到hello.i文件中。
          (2)編譯階段
          接下來進行的是編譯階段,在這個階段中,Gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,Gcc把代碼翻譯成匯編語言。用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
          [root@localhost Gcc]# Gcc –S hello.i –o hello.s
          以下列出了hello.s的內容,可見Gcc已經將其轉化為匯編了,感興趣的讀者可以分析一下這一行簡單的C語言小程序是如何用匯編代碼實現的。
          .file "hello.c"
          .section .rodata
          .align 4
          .LC0:
          .string "Hello! This is our embedded world!"
          .text
          .globl main
          .type main, @function
          main:
          pushl %ebp
          movl %esp, %ebp
          subl $8, %esp
          andl $-16, %esp
          movl $0, %eax
          addl $15, %eax
          addl $15, %eax
          shrl $4, %eax
          sall $4, %eax
          subl %eax, %esp
          subl $12, %esp
          pushl $.LC0
          call puts
          addl $16, %esp
          movl $0, %eax
          leave
          ret
          .size main, .-main
          .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)"
          .section .note.GNU-stack,"",@progbits
          (3)匯編階段
          匯編階段是把編譯階段生成的“.s”文件轉成目標文件,讀者在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了。如下所示:
          [root@localhost Gcc]# Gcc –c hello.s –o hello.o
          (4)鏈接階段
          在成功編譯之后,就進入了鏈接階段。在這里涉及到一個重要的概念:函數庫。讀者可以重新查看這個小程序,在這個程序中并沒有定義“printf”的函數實現,且在預編譯中包含進的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么,是在哪里實現“printf”函數的呢?最后的答案是:系統把這些函數實現都被做到名為libc.so.6的庫文件中去了,在沒有特別指定時,Gcc會到系統默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到libc.so.6庫函數中去,這樣就能實現函數“printf”了,而這也就是鏈接的作用。函數庫一般分為靜態庫和動態庫兩種。靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為“.a”。動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為“.so”,如前面所述的libc.so.6就是動態庫。Gcc在編譯時默認使用動態庫。完成了鏈接之后,Gcc就可以生成可執行文件,如下所示。
          [root@localhost Gcc]# Gcc hello.o –o hello
          運行該可執行文件,出現正確的結果如下。
          [root@localhost Gcc]# ./hello
          Hello! This is our embedded world!
          3.4.2 Gcc編譯選項分析
          Gcc 有超過100 個的可用選項,主要包括總體選項、告警和出錯選項、優化選項和體系
          結構相關選項。以下對每一類中最常用的選項進行講解。
          (1)總體選項
          Gcc的總結選項如表3.7 所示,很多在前面的示例中已經有所涉及。
          表3.7 Gcc總體選項列表
          -c 只是編譯不鏈接,生成目標文件“.o”
          -S 只是編譯不匯編,生成匯編代碼
          -E 只進行預編譯,不做其他處理
          -g 在可執行程序中包含標準調試信息
          -o file 把輸出文件輸出到file里
          -v 打印出編譯器內部編譯各過程的命令行信息和編譯器的版本
          -I dir 在頭文件的搜索路徑列表中添加dir目錄
          -L dir 在庫文件的搜索路徑列表中添加dir目錄
          -static 鏈接靜態庫
          -llibrary 連接名為library的庫文件
          對于“-c”、“-E”、“-o”、“-S”選項在前一小節中已經講解了其使用方法,在此主要講解另外兩個非常常用的庫依賴選項“-I dir”和“-L dir”。
          · “-I dir”
          正如上表中所述,“-I dir”選項可以在頭文件的搜索路徑列表中添加dir 目錄。由于Linux中頭文件都默認放到了“/usr/include/”目錄下,因此,當用戶希望添加放置在其他位置的頭文件時,就可以通過“-I dir”選項來指定,這樣,Gcc就會到相應的位置查找對應的目錄。比如在“/root/workplace/Gcc”下有兩個文件:
          /*hello1.c*/
          #include<my.h>
          int main()
          {
          printf("Hello!!\n");
          return 0;
          }
          /*my.h*/
          #include<stdio.h>
          這樣,就可在Gcc命令行中加入“-I”選項:
          [root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1
          這樣,Gcc就能夠執行出正確結果。
          小知識
          在include語句中,“<>”表示在標準路徑中搜索頭文件,““””表示在本目錄中搜索。故在上例中,可把hello1.c的“#include<my.h>”改為“#include “my.h””,就不需要加上“-I”選項了。
          · “-L dir”選項“-L dir”的功能與“-I dir”類似,能夠在庫文件的搜索路徑列表中添加dir 目錄。
          例如有程序hello_sq.c需要用到目錄“/root/workplace/Gcc/lib”下的一個動態庫libsunq.so,則
          只需鍵入如下命令即可:
          [root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq
          需要注意的是,“-I dir”和“-L dir”都只是指定了路徑,而沒有指定文件,因此不能在路徑中包含文件名。
          另外值得詳細解釋一下的是“-l”選項,它指示Gcc去連接庫文件libsunq.so。由于在Linux下的庫文件命名時有一個規定:必須以l、i、b 3 個字母開頭。因此在用-l選項指定鏈接的庫文件名時可以省去l、i、b 3個字母。也就是說Gcc在對“-lsunq”進行處理時,會自動去鏈接名為libsunq.so的文件。
          (2)告警和出錯選項
          Gcc的告警和出錯選項如表3.8 所示。
          表3.8 Gcc總體選項列表
          選 項 含 義
          -ansi 支持符合ANSI標準的C程序
          -pedantic 允許發出ANSI C標準所列的全部警告信息
          續表
          選 項 含 義
          -pedantic-error 允許發出ANSI C標準所列的全部錯誤信息
          -w 關閉所有告警
          -Wall 允許發出Gcc提供的所有有用的報警信息
          -werror 把所有的告警信息轉化為錯誤信息,并在告警發生時終止編譯過程
          下面結合實例對這幾個告警和出錯選項進行簡單的講解。
          如有以下程序段:
          #include<stdio.h>
          void main()
          {
          long long tmp = 1;
          printf("This is a bad code!\n");
          return 0;
          }
          這是一個很糟糕的程序,讀者可以考慮一下有哪些問題?
          · “-ansi”
          該選項強制Gcc生成標準語法所要求的告警信息,盡管這還并不能保證所有沒有警告的程序都是符合ANSI C標準的。運行結果如下所示:
          [root@localhost Gcc]# Gcc –ansi warning.c –o warning
          warning.c: 在函數“main”中:
          warning.c:7 警告:在無返回值的函數中,“return”帶返回值
          warning.c:4 警告:“main”的返回類型不是“int”
          可以看出,該選項并沒有發現“long long”這個無效數據類型的錯誤。
          · “-pedantic”
          允許發出ANSI C標準所列的全部警告信息,同樣也保證所有沒有警告的程序都是符合
          ANSI C標準的。其運行結果如下所示:
          [root@localhost Gcc]# Gcc –pedantic warning.c –o warning
          warning.c: 在函數“main”中:
          warning.c:5 警告:ISO C90不支持“long long”
          warning.c:7 警告:在無返回值的函數中,“return”帶返回值
          warning.c:4 警告:“main”的返回類型不是“int”
          可以看出,使用該選項查看出了“long long”這個無效數據類型的錯誤。
          · “-Wall”
          允許發出Gcc能夠提供的所有有用的報警信息。該選項的運行結果如下所示:
          [root@localhost Gcc]# Gcc –Wall warning.c –o warning
          warning.c:4 警告:“main”的返回類型不是“int”
          warning.c: 在函數“main”中:
          warning.c:7 警告:在無返回值的函數中,“return”帶返回值
          warning.c:5 警告:未使用的變量“tmp”
          使用“-Wall”選項找出了未使用的變量tmp,但它并沒有找出無效數據類型的錯誤。
          另外,Gcc 還可以利用選項對單獨的常見錯誤分別指定警告,有關具體選項的含義感興
          趣的讀者可以查看Gcc手冊進行學習。
          (3)優化選項
          Gcc可以對代碼進行優化,它通過編譯選項“-On”來控制優化代碼的生成,其中n是一個代表優化級別的整數。對于不同版本的Gcc 來講,n 的取值范圍及其對應的優化效果可能并不完全相同,比較典型的范圍是從0變化到2或3。
          不同的優化級別對應不同的優化處理工作。如使用優化選項“-O”主要進行線程跳轉(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優化。使用優化選項“-O2”除了完成所有“-O1”級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項“-O3”則還包括循環展開和其他一些與處理器特性相關的優化工作。雖然優化選項可以加速代碼的運行速度,但對于調試而言將是一個很大的挑戰。因為代碼在經過優化之后,原先在源程序中聲明和使用的變量很可能不再使用,控制流也可能會突然跳轉到意外的地方,循環語句也有可能因為循環展開而變得到處都有,所有這些對調試來講都將是一場噩夢。所以筆者建議在調試的時候最好不使用任何優化選項,只有當程序在最終發行的時候才考慮對其進行優化。
          (4)體系結構相關選項
          Gcc的體系結構相關選項如表3.9 所示。
          表3.9 Gcc體系結構相關選項列表
          選 項 含 義
          -mcpu=type 針對不同的CPU使用相應的CPU指令。可選擇的type有i386、i486、pentium及i686等
          -mieee-fp 使用IEEE標準進行浮點數的比較
          -mno-ieee-fp 不使用IEEE標準進行浮點數的比較
          -msoft-float 輸出包含浮點庫調用的目標代碼
          -mshort 把int類型作為16位處理,相當于short int
          -mrtd 強行將函數參數個數固定的函數用ret NUM返回,節省調用函數的一條指令
          這些體系結構相關選項在嵌入式的設計中會有較多的應用,讀者需根據不同體系結構將
          對應的選項進行組合處理。在本書后面涉及到具體實例會有針對性的講解。
          posted @ 2014-01-15 15:21 Eric_jiang 閱讀(337) | 評論 (0)編輯 收藏

          新規——路考的考試內容有16個項目:
          考試上車準備(包括系安全帶、觀察、打左轉燈)、起步、直線行駛、變更車道、通過路口、靠邊停車、通過人行橫道線、通過學校區域、通過公共汽車站、會車、超車、掉頭、夜間行駛、加減擋位操作、路口左轉彎、路口右轉彎。
          posted @ 2014-01-14 09:48 Eric_jiang 閱讀(363) | 評論 (1)編輯 收藏

          Servlet體系結構是建立在Java多線程機制之上的,它的生命周期是由Web容器負責的。
          當客戶端第一次請求某個Servlet時,Servlet容器將會根據web.xml配置文件實例化這個Servlet類。當有新的客戶端請求該Servlet時,一般不會再實例化該Servlet類,也就是有多個線程在使用這個實例。
          這樣的話,當兩個或多個線程同時訪問同一個Servlet時,可能會發生多個線程同時訪問同一資源的情況,數據可能會變得不一致,所以就很容易造成一系列的一些安全性問題。
          解決此類的方法也有多
          1、實現 SingleThreadModel 接口
          該接口指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不會有兩個線程被同時執行,當然也就不存在線程安全的問題。這種方法只要繼承這個接口就行了
          public class XXXXX extends HttpServlet implements SingleThreadModel {  
          …………  
          2、同步對共享數據的操作
          使用synchronized 關鍵字能保證一次只有一個線程可以訪問被保護的區段,在本論文中可以通過同步塊操作來保證Servlet的線程安全。同步后的代碼如下:
          Public class XXXXXX extends HttpServlet {  
              …………  
          synchronized (this){XXXX}  
           
          3、避免使用實例變量
          線程安全問題還有些是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的。
          對上面的三種方法進行測試,可以表明用它們都能設計出線程安全的Servlet程序。但是,如果一個Servlet實現了SingleThreadModel接口,Servlet引擎將為每個新的請求創建一個單獨的Servlet實例,這將引起大量的系統開銷。SingleThreadModel在Servlet2.4中已不再提倡使用;同樣如果在程序中使用同步來保護要使用的共享的數據,也會使系統的性能大大下降。這是因為被同步的代碼塊在同一時刻只能有一個線程執行它,使得其同時處理客戶請求的吞吐量降低,而且很多客戶處于阻塞狀態。另外為保證主存內容和線程的工作內存中的數據的一致性,要頻繁地刷新緩存,這也會大大地影響系統的性能。所以在實際的開發中也應避免或最小化Servlet 中的同步代碼;在Serlet中避免使用實例變量是保證Servlet線程安全的最佳選擇。從Java 內存模型也可以知道,方法中的臨時變量是在棧上分配空間,而且每個線程都有自己私有的棧空間,所以它們不會影響線程的安全。
          小結
          Servlet的線程安全問題只有在大量的并發訪問時才會顯現出來,并且很難發現,因此在編寫Servlet程序時要特別注意。線程安全問題主要是由實例變量造成的,因此在Servlet中應避免使用實例變量。如果應用程序設計無法避免使用實例變量,那么使用同步來保護要使用的實例變量,但為保證系統的最佳性能,應該同步可用性最小的代碼路徑。
          posted @ 2014-01-07 11:13 Eric_jiang 閱讀(252) | 評論 (0)編輯 收藏

          下面是switch的簡單寫法:
          switch(A){
          case B;
          }
          A部分中的值必須是int型的,或者是能夠自動進行飲試轉換成int型的表達式。也就是說A部分可以是byte/short/char/int型的。
          其次要強調的是該程序中B部分的值必須是單個byte/short/char/int型的值,或者是final型的變量。
          但是final型的變量也是有要求的,也即是它必須是編譯時的常量,怎么講呢,看下面的程序段:
          final int a = 0;
          final int b;
          第二個語句就是在編譯時不能夠被識別出值的變量,因為它沒有初始化,當然,這條語句也是錯誤的。
          所以總結case后的值可以是常數值或final型的值。

          再看下面的程序段:

          public class TestSwitch {
          public static void main(String[] args){
          byte a = 11;
          switch(a){// C
          case 11 : System.out.println(" 11 "); break;
          case 225 : System.out.println(" 11 "); break;// D
          }
          }
          }

          該代碼正確嗎?答案是否定的。雖然在 C 處是合法的也即是byte型的a值可以出現在switch中,但是 D處的語句也即是第二個case后的值是225大小超過了byte的范圍,所以是錯誤的。再就是case后的值不能出現重復。因此在使用中要注意。

          =====================
          再就是在使用switch-case中最容易忽視的就是忘記在每個case后處理完后忘記寫上break;語句。那它帶來的后果是什么呢,下面小程序段會告訴你:
          public class TestSwitchCase {
          public static void main(String[] args){
          byte a = 2;
          switch(a){
          case 1 : System.out.println(" A ");
          case 2 : System.out.println(" B ");
          case 3 : System.out.println(" C ");
          case 4 : System.out.println(" D ");
                          default : System.out.println(" default ");
          }
          }
          }
          =========輸出結果為:
           B 
           C 
           D 
           default 
          --------------------------
          看到了嗎?連default都執行,注意結束符break;就OK了。
          posted @ 2014-01-06 14:59 Eric_jiang 閱讀(337) | 評論 (0)編輯 收藏

          僅列出標題
          共57頁: First 上一頁 10 11 12 13 14 15 16 17 18 下一頁 Last 
          主站蜘蛛池模板: 密山市| 伊春市| 肃宁县| 桃江县| 邵东县| 轮台县| 信阳市| 洛阳市| 仁怀市| 同仁县| 准格尔旗| 富民县| 定州市| 固镇县| 石城县| 丹东市| 北安市| 克山县| 鄱阳县| 仙桃市| 项城市| 灯塔市| 木里| 金昌市| 什邡市| 海伦市| 库尔勒市| 苍南县| 嘉义市| 上犹县| 剑河县| 浙江省| 普宁市| 苏尼特右旗| 金门县| 纳雍县| 稻城县| 巴林右旗| 中宁县| 博兴县| 昌江|