日誌記錄(2012.5)

2012-5-12

1、問題:如果在Linux系統的桌面上添加應用程序的圖標?

QtE-4.6.3嵌入自己的QT4程序方法

兩種方法:

1種方法:

使用最新版的QtopiaQte相結合的系統,可以啓動QtE-4.6.3
還有個問題,就是我用QT4編譯完的程序如:books
可以用minicom運行起來
:#./home/plg/books/books -qws
問題是如何嵌入到QtE裏面?就是如何在板上按一個按鈕就可以啓動它?像啓動裏面的wiggly text一樣?

我將examples/widgets/wiggly目錄下的wiggly刪除,複製books到該目錄更名爲wiggly一樣可以運行books

第2種方法:

通過gedit ./bin/qt4可以看到
cd /usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher
./fluidlauncher -qws
直接進入/usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher
可以看到
config.xml  screenshots
screenshots
存放顯示的圖片

config.xml
編輯運行的程序路勁和圖片路徑和顯示的名稱
例如直接一行:
<example filename="../../../examples/widgets/wiggly/xph" name="Xph Test" image="screenshots/raycasting.png"/>
就可以增加xph test程序了

 

我的問題:

我的QT應用程序的版本是4.5.3的,而上面的是4.6.3的。如果按照上面的兩種方法都不行,因爲環境變量等問題沒有設置好。

 

分析過程:

在程序剛運行時,是執行根文件目錄下的/etc/init.d/rcS這個腳本文件中,在這個文件中設置有一些系統剛開始啓動時所要打印的提示信息。接着就有這麼一條語句:/bin/qtopia &Qtopia是一個位於/bin目錄下的可執行文件,裏面包括了設置qtopia 2.2的環境變量設置。(所以,我們在前面做雷達主控臺界面時都把/bin/qtopia替換成自己所要執行的Qt應用程序,比如設置爲/bin/QT,而在QT程序中先設置Qt4.5.3的環境變量,再讓系統啓動mylinux_QT_serial_arm這個QT應用程序)。之後,在qtopia的文件最後,有這麼一條語句:

exec $QPEDIR/bin/qpe 1>/dev/null 2>/dev/null  

exec表示在運行完這條命令之後,交出控制權。我猜想大概的意思就是在qtopia 2.2的桌面之後,系統的控制權就交出去了,至於交個誰就不知道了。

 

mini2440自帶的根文件系統中,就有一個是啓動4.6.3的應用程序的,並且在linux桌面上有一個叫做“start qt4.6.3”的圖標,所對應的QT環境變量的設置文件在/bin/qt4文件中。但其所對應的應用程序文件是在/opt/Qtopia/bin/qt4-starter的這個應用程序,所對應的desktop文件是位於/opt/Qtopia/apps/FriendlyARM目錄下的qt4-starter.desktop文件,所對應的圖標是在/opt/Qtopia/pics/qt4-starter目錄下。

但是,要注意的是,真正啓動這個4.6.3的應用程序是位於/usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher目錄下的fluidlauncher的這個應用程序,因爲在qt4文件的最後,有這麼一句話:

cd /usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher

./fluidlauncher –qws

所以,應該qt4-starter這個應用程序調用了/bin/qt4這個文件,一方面設置了QT4.6.3應用程序的運行環境,另一方面,也運行了一些QT4.6.3應用程序。

所以,我們應該可以仿效這種做法。

 

的確,按照前面的方法可以弄出來。

但是,所得到的效果並不像4.6.3的那個Qt應用程序那樣,實際上那個應該程序應該是運行了很多的4.6.3Qt應用程序,但關鍵在於不知道那個fluidlauncher文件是如何編寫的。

所以,如果要執行幾個4.5.3版本的Qt應用程序,就得設置幾個圖標(每個應用程序對應一個圖標,按照前面的方法進行建立。)

要注意的是,雷達主控界面在設計時並沒有邊框顯示(好像是略去了邊框顯示),所以最好的效果跟其他的不太一樣,因爲一旦打開了,就不能關掉這個界面,除非重啓系統,要不然就得重新設計這個界面了。

 

 

2012-5-14

1、關於C語言中隨機數生成的問題。

在C語言中,關於隨機數生成的函數有:srand()函數、rand()函數。Srand()用於產生隨機數的種子,rand()根據這個種子生成一個隨機數。所產生的隨機數的範圍是:0~RAND_MAX。RAND_MAX是在stdlib.h中定義的。RAND_MAX的最小值爲32767,最大值是2147483647,但是,實際上,在VC6.0中,在stdlib.h文件中,我只看見了RAND_MAX的定義爲0x7fff,也就是32767。關於隨機數的相關原理,可以參考這個網址:

http://blog.csdn.net/ytc716/article/details/6468491

一般來說,srand(seed)函數,用於產生隨機數的種子,而其所帶的參數應該是一個不斷變化的值,所以,這個值,通常可以利用time(0)的返回值來當做seed。注意:如果在調用rand函數之前未先調用srand函數,那麼就相當於先調用函數srand(1)。

但是,如果我要產生一個大於32767的隨機數,應該怎麼實現呢?

在前面說了,RAND_MAX在stdlib.h中的定義爲32767,但即使你把這個數值修改爲大於32767的值,所產生的隨機數也是小於32767的。所以,參考網上的一種做法是這樣的:

(int)((double)rand() / RAND_MAX * N) (N爲你期望的最大數)

按照這種方法,的確可以產生大於32767的隨機數,實際上,這個的原理就是通過擴展來實現的。不過,要注意的是,一定要安裝這種寫法,也就是要注意數據類型的轉換問題。因爲最後的數據可能不是一個整數,而經常是一個小數,所以,要通過(int)類型轉換,把它轉換成一個整數。

相應的參考網站爲:http://bbs.chinaunix.net/thread-998867-1-1.html

使用srand(time(0))來使用當前時間使隨機數發生器隨機化,這樣就可以保證每兩次運行時可以得到不同的隨機數序列(只要兩次運行的間隔超過1秒)。

但是,我很難確定兩次運行的時間是否是大於1秒,所以,我可以通過Sleep()函數來設置每次運行的時間是超過1秒的。也就是Sleep(1000),注意這個1000的單位是毫秒,1000毫秒,也就是1秒,不過,要注意的是,要加上相關的頭文件windows.h。

另外,可以通過比較所產生的隨機數,來判斷是否產生了相同的隨機數,如果是,那麼可以調用system函數。可以通過暫停的方法來突顯出找到了相同的隨機數。相關的語句爲:system(“pause”)。

 

最後,說明下rand函數的原理

 先前,一直強調rand產生的是一個僞隨機數,爲什麼這麼說呢?

rand是一個函數,函數顧名思義就是有輸入、有輸出,可是對於一個用if、for、while這些語句寫出來算法來講,如果輸入是確定的,那麼輸出也就是確定的,這樣的rand函數就無法生成隨機數了,因爲每次輸出都是確定的。那麼怎麼能夠實現輸出不確定呢?計算機裏變量等等值值都是一個固定的值,而只有系統時鐘是不斷變化的,因此srand的函數就是用來取當前系統時鐘的值。然後保證每次調用rand產生的隨機數序列是“不確定”的。因爲這個“不確定”也是假的“不確定”,因爲其實當前系統時鐘的值也是一個可以算出來的值,所以我只要熟悉rand函數的內部實現,我就能猜出來每次調用rand函數產生的隨機數是多少,這正是“僞隨機”的意思。

在計算機中完全依靠軟件算法是無法產生真正的隨機數的,因爲還是那句話,對於一個算法來講“輸入是確定的,那麼輸出也就是確定的”,要產生真正的隨機數就要靠採集外部不確定的變量,比如使用一個探測器探測地磁場場強的變化、採集晶體管內熱噪聲的變化等等,這樣才能產生真正的隨機數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章