日志记录(2012.5)

来源:互联网 发布:php laravel windows 编辑:程序博客网 时间:2024/06/18 22:00

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函数产生的随机数是多少,这正是“伪随机”的意思。

在计算机中完全依靠软件算法是无法产生真正的随机数的,因为还是那句话,对于一个算法来讲“输入是确定的,那么输出也就是确定的”,要产生真正的随机数就要靠采集外部不确定的变量,比如使用一个探测器探测地磁场场强的变化、采集晶体管内热噪声的变化等等,这样才能产生真正的随机数。

原创粉丝点击