admin 管理员组

文章数量: 1087139


2024年12月24日发(作者:指针指向数组cpp)

LINUX socket 在connect的时候发生 Operation now in progress 错误 ............................ 5

QT Creator WINSOCKET undefined reference to …的错误的处理 .............................................. 5

linux下组播遇到的问题及解决办法 ...................................................................................... 5

NFS文件无法写入的权限问题 .............................................................................................. 6

SVN服务启动 .......................................................................................................................... 7

SVN命令增加文件 ................................................................................................................. 8

Linux操作系统下三种配置环境变量的方法 ........................................................................ 8

如何查看一个可执行程序链接使用了哪里动态库 ............................................................... 8

电脑主机IP为192.168.0.1 设备IP地址为192.168.1.1,两者之间如何连通。 ............ 8

linux下如何设置IP地址并激活 .......................................................................................... 10

centos 系统错误处理Give root password for maintenance .................................................. 11

在linux下添加DNS服务器地址 ...................................................................................... 12

Smb 开机自动运行 ............................................................................................................... 12

开发板ftp 下载文件命令 ..................................................................................................... 12

虚拟机如何修改mac地址 .................................................................................................... 12

VIM 插件的安装路径。 ....................................................................................................... 13

虚拟机如何添加硬盘 ............................................................................................................. 13

开机后自动启动samba服务 ............................................................................................. 13

ln建立链接 ............................................................................................................................ 14

undefined reference to `fvp_get_relative_time'....................................................................... 14

SourceInsight 添加新的文件类型 ................................................................ 14

内网IPCamera 外网访问的方法。 ...................................................................................... 14

implicit declaration of function 错误的解决方法。 ............................................................. 14

调用ioctl函数没有加头文件#include ,居然报语法错误。 ........................ 15

Linux下打包目录命令 .......................................................................................................... 15

嵌入式查看当前动态库链接目录,增加动态库链接目录 ................................................. 15

海思芯片硬解码可以接受的两种码流方式。 ..................................................................... 15

太过份了,在调用ioctl函数时, 没有加头文件 #include 居然提示我语

法错误。 ................................................................................................................................. 16

一个导致主程序不断的挂掉的函数。 ................................................................................. 16

VMware虚拟机出现Reason: Failed to lock the file ............................................................. 16

一个内存错误。 ..................................................................................................................... 17

编绎时出现此提示错误,warning: assignment makes pointer from integer without a cast 18

使用va_list时应包含的头文件 #include ........................................................... 19

头文件里一个函数定义忘记写分号,导致的BUG. ........................................................... 19

C语言宏定义##连接符和#符的使用 ................................................................................... 19

vimperator常用命令 .............................................................................................................. 26

SAMBA 在windows下,COPY文件出现 指定的网络名不再可用 错误 ................. 28

Linux 图形界面启动 ............................................................................................................. 28

ln -s创建了一个软链接,出现如下错误 ............................................................................. 29

1 编绎安装libmad 时出错 ................................................................................................. 29

Git 安装方法 ......................................................................................................................... 30

apr和apr-util的安装 ............................................................................................................ 30

1 局域网内组播包发送不成功 ............................................................................................. 31

2 automake编绎时CPP提示找不到文件C文件 ................................................................ 31

1 生成静态库的makefile 模板 ............................................................................................ 32

2 生成测试程序的makefile 模板 ........................................................................................ 32

1 NULL所在头文件名 .......................................................................................................... 33

1 用automake工具编译c++文件出错 ................................................................................ 33

1 autoconf automake 编绎工程源码时出现的错误, ......................................................... 34

1 模块初始化时,如何调用模块的初始化函数。 ............................................................. 34

1 如何打印error 所反映的错误信息 .................................................................................. 35

2 关于waitpid() ..................................................................................................................... 35

2 grep 查找目录中文件的字符串 ....................................................................................... 38

1 main 函数执行完后,是否可以执行其它函数。 ......................................................... 39

1 pthread_key_create .............................................................................................................. 40

指针数组和数组指针。 ......................................................................................................... 44

对结构体某一个成员变量赋初值 ......................................................................................... 45

相信编绎器 ............................................................................................................................. 45

很奇怪的一个问题, 编绎时报错 ....................................................................................... 46

linux 下查找包含该字符串的文件的命令 ........................................................................... 47

统计目录src下的代码的行数, .......................................................................................... 47

打包文件 ................................................................................................................................. 47

CTRL+D代表输入完成CTRL+C 代表终止程序。 .......................................................... 48

搜索文件夹内的所有文件里包含某字符串的linux命令 ................................................... 48

设置开发板获取Ip的方式为动态获取ip方式,也就是以dhcp的方式获取ip。 ............ 49

1 赋值 运算 ++, -- ............................................................................................................... 49

1 tar 命令详解 ....................................................................................................................... 50

Ie台云台控制无效。 ............................................................................................................. 51

ie端无法保存参数, ............................................................................................................. 51

Vim 中高亮c 函数 ............................................................................................................... 51

二维数组的初始化 ................................................................................................................. 52

vim 中如何复制多行。 ........................................................................................................ 52

C语言的格式化输出。 ......................................................................................................... 52

Linux 更改系统设置语言。 ................................................................................................. 53

一 如何一个文件夹下的所有文件转换unix格式。 .......................................................... 54

二 zip 文件 的解压。 .......................................................................................................... 54

一 当更新静态库时, 应全部重新编绎make clean; make. .............................................. 55

一nor falsh 和nand falsh 的读写机制 , .......................................................................... 55

一 图片坐标扣图背影显示不相符。 ................................................................................... 56

一 两台刚烧录新的软件机器,向其中一台发ping包,始终无法成功,但是两台机器均

可以向外ping 成功。 ........................................................................................................... 56

一 网络设置无法开机自动激活 ........................................................................................... 56

二 什么是端口映射。 ........................................................................................................... 57

Unsined char 无符号整型,能表示的最大的整数是256 , ............................................. 57

一 Secure crt 如何退出全屏 ................................................................................................. 57

一 开发板运行程序mount nfs 失败, 查找定位分析原因 .............................................. 57

二 工程sz36574v 进入页面,鼠标无法获得focus焦点 .................................................. 58

解压linux内核时出错, 解压命令为tar -xzvf ................................. 58

强制类型转换 ......................................................................................................................... 58

计算两点坐标的长度 x1,x2 之间的长度的大小为x2-x1+1 ............................................. 59

整形转换。 ............................................................................................................................. 60

一 交叉编绎环境的安装。 ................................................................................................... 60

调用宏时, 宏里的定义了临时变量,不要与调用宏的函数的变量相同。 ................... 61

一个扇形的算法 ..................................................................................................................... 61

任意两点画直线的算法 ......................................................................................................... 62

一种新的for模型, .............................................................................................................. 64

linux添加用户 ....................................................................................................................... 64

1 nfs客户端的配置。 ............................................................................................................ 64

2 在linux 下直接函数名表示函数名所在内存中的地址。 .............................................. 65

Linux 下安装飞鸽 ................................................................................................................. 65

VPN 无法连接 ....................................................................................................................... 65

Windows下的文件系统是不支持创建符号链接 ................................................................. 65

linux与windows下的换行符不一样 ................................................................................... 66

编绎问题 ................................................................................................................................. 66

linux C语言 ............................................................................................................................ 67

编绎问题 ................................................................................................................................. 67

linux C语言 ............................................................................................................................ 67

Win7 访问samba 很慢

Vista、Win7 中,网络共享访问时,打开一个共享文件夹,有时地址栏中都

会出现进度条,打开速度超级慢。慢的主要原因是由于Vista、Win7 中多了

一个叫做“远程拆分压缩(Remote Differential Compression)”的的机制,这

个机制能够减少网络文件传输数据量,提高文件下载速度,但会大大降低共

享访问的速度。

何为“远程拆分压缩(RDC)”

远程拆分压缩(Remote Differential Compression)在有效的管理下允

许程序在两个不同的计算机之间同步数据。

一个 RDC 程序可以通过网络,用最小的数据参数量在两台或者更

多的计算机之间同步数据。

RDC 是为 C/C++ 开发者设计的。COM 和 客户/服务器架构知识

是必要的。

RDC 包含在 Windows Server 2003 R2 和其后的系统中。

关闭远程拆分压缩

打开“控制面板(经典模式下)” --> “程序和功能” --> “打开或

关闭 Windows 功能”,在弹出的对话框中去除“远程拆分压缩”前面的

CheckBox勾选,点击确定。

date -s”命令来修改系统日期如2005年7月26日

#date -s 07/26/2005

将系统时间设定成下午11点12分0秒的命令如下。

#date -s 11:12:00

LINUX socket 在connect的时候发生 Operation now in

progress 错误

unsigned long ul = 1;

ioctl( nSocket, FIONBIO, &ul ); //设置为非阻塞模式

放到connect()后面.

QT Creator WINSOCKET undefined

reference to …的错误的处理

undefined reference to `bind@12′

undefined reference to `listen@8′

undefined reference to `accept@12′

undefined reference to `recv@16′

undefined reference to `send@16′

undefined reference to `shutdown@8′

undefined reference to `closesocket@4′

解决办法:

在pro文件中添加: LIBS += -lwsock32

linux下组播遇到的问题及解决办法

2009-12-18 16:21 185人阅读 评论(0) 收藏 举报

1,查看系统是否支持多播:ifconfig出现 UP BROADCAST RUNNING MULTICAST

MTU:1500 Metric

2, 出现:“setsockopt:No such device”。的提示,说明多播IP设置出现

问题,系统所需要的uint32_t格式的网络地址的开头不是1110,检验通不过。

解决办法:在把地址字符串"*.*.*.*"转化为uint32_t时采用

htonl(inet_network(“*.*.*.*”))或者inet_aton函数,inet_aton(GRUPO,

&_addr)。

3,如果发送多播包的主机没有设置网关,会出现“network is unreachable.

这点很重要,网关可以随便设置,但是一定要设。还要添加路由240.0.0.0。

即:

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

route add default gw "192.168.40.1 " dev eth0

NFS文件无法写入的权限问题

今天在机器上配置NFS文件系统,在/etc/exports中加入以下信息:

/testfs 10.0.0.0/8(rw)

重启NFS服务以后,在客户机通过mount -o rw -t nfs 10.214.54.29:/testfs /rd1命令将网络文件mount

到本地。执行完成之后,目录是可以访问了,但无法写入。感觉有点奇怪,明明在命令中指定可以写

入了。于是到网上搜索资料,发现exports目录权限中,有这么一个参数no_root_squash。其作用是:

登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具

有 root 的权限!。默认情况使用的是相反参数 root_squash:在登入 NFS 主机使用分享之目录的使

用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会

变成 nobody 那个身份。

因为我的客户端是使用root登录的,自然权限被压缩为nobody了,难怪无法写入。将配置信息改

为:

/testfs 10.0.0.0/8(rw,no_root_squash)

据说有点不安全,但问题是解决了。

另外,在测试NFS文件系统时,会经常mount和umount文件,但有时会出现device is busy的错

误提示。你肯定感到很奇怪,我明明没有使用啊,看看你当前所在的目录,是不是在mount的文件目

录中?回退到上层目录重新umount,是不是OK了?

Linux程序开机自动运行

1.自动运行的程序有以下分类(作者:李杨明):

/etc/ 最后加入你的运行程序 这是开机启动

/etc/bash_profile 登陆启动

.bashrc 登陆后启动

博客:/mnsch

2.作为工业自动化程序,当然要求在有工业供电的情况下就自动运行程序,因此我们选择:开机启动方案.具体方法如下:

编辑一下这个文件/etc/,即vi /etc/,把你已经在系统里安装好的程序,加在这个文件里就可以了!

3.举例如下:现在我在/var/ftp/up/server 程序要开机自动运行,执行 vi /etc/ 命令后,在vi打开的文件末尾加入

/var/ftp/up/server 就可以实现开机自动运行的目的! 即使用户没有登陆linux系统,该程序也仍然运行着.

SVN服务启动

命令 svnserve –d –r /home/pub/svn

SVN命令增加文件

命令svn add *会忽略所有已经在版本控制之下的目录,有时候,你会希望添加所有工作拷贝的未版本化文件,包括那

些隐藏在深处的文件,可以使用svn add的--force递归到版本化的目录下:

$ svn add * --force

Linux操作系统下三种配置环境变量的方法

现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配

置java环境变量为例介绍三种配置环境变量的方法。

1.修改/etc/profile文件

如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这

些环境变量,可能会给系统带来安全性问题。

(1)用文本编辑器打开/etc/profile

(2)在profile文件末尾加入:

如何查看一个可执行程序链接使用了哪里动态库

例如查看exec 链接了那些可执行程序。

ldd $(which exec)

电脑主机IP为192.168.0.1 设备IP地址为192.168.1.1,

两者之间如何连通。

方法:给物理网卡添加一个192.168.1.*的IP地址。

linux下如何设置IP地址并激活

Linux系统下如何设置IP地址?我们可以通过命令设定IP的方法,不过此方法的前

提条件是用户需root权限。在Linux系统的 /etc/sysconfig/network-script/ifcfg-eth0

文件中存放着网卡IP地址配置的相关信息,它的具体格式为:

[root@localhost network-scripts]# cat ifcfg-eth0

DEVICE=eth0

BOOTPROTO=none

ONBOOT=yes

TYPE=Ethernet

NETMASK=255.255.255.0

IPADDR=IP地址

USERCTL=no

PEERDNS=yes

GATEWAY=网关地址(路由器的IP地址)

下面我们来举个例子如何实现Linux环境下设置IP地址。

#ifconfig eth0 192.168.0.1或者修改/etc/sysconfig/network-scripts/下的

ifcfg-eth0

#vi /etc/syssconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static

HWADDR= ;这里是你网卡的物理地址,通常检测到的网卡你就不用输入了

ONBOOT=yes

IPADDR=192.168.0.1

NETMASK=255.255.255.0

NETWORK=192.168.1.0

BROADCAST=192.168.1.255

GATEWAY= ;这里输入你的网关,路由器的IP地址

保存退出

#/sbin/service network restart

如果网卡启动是OK的话就说明IP地址设定成功了。另外我们可以用ifconfig

eth0来显示当前的IP来确认是否设置正确。

利用以下命令:

/etc/init.d/network reload 命令或service network [命令]

重新导入该文件,实现网络启动。

centos 系统错误处理Give root password for maintenance

处理流程:

第一步:输入正确的root用户密码(输入正确的系统密码后,系统自动进入控制后台)

第二步:在控制台输入命令 fsck -y 回车

系统自动检测,问题解决

分析:这个错误出现的原因是机器突然断电,导致系统文件受损.

在linux下添加DNS服务器地址

早上来到公司发现机子怎么关了,问了一下IT,原来是公司早上停了一会儿的电。打开机子以

后发现launchmail登不上去,于是想用网页方式登到服务器上去,可发现也登不上,试了一下

其他网页,都打不开。看了一下网络配置原来是DNS没设。 记得上回已经设上了,不知道断

电重启后怎么就没了呢。 于是叫来IT帮我把DNS重设回去(因为记不住DNS的ip地址:))

1. 首先查看下/etc/ 的内容

#cat /etc/

发现是个空文件。

2. 重启网络服务

# service network restart

3. 再查看/etc/, 若还没有DNS地址则手动添加

# vi /etc/

nameserver 172.17.192.21 #==>此地址就是添加的DNS地址

完成后一切ok! 网页邮箱都可访问!

Smb 开机自动运行

fedora已经安装了smbd,则存在/etc/init.d/smb文件,你用命令chkconfig --level 35 smb

on

开发板ftp 下载文件命令

ftpget –u username 192.168.*.* remotefile localfile

remotefile 位于服务器用户名username下的指定目录下

虚拟机如何修改mac地址

首先止虚拟机网格连接

Service network stop

ifconfig eth0 hw ether 00:11:22:33:44:55

Service network start

VIM 插件的安装路径。

~/.vim

~/.vimrc vim配置文件。

虚拟机如何添加硬盘

1 vmware 增加硬盘,vm->setting->Hard Disk 点击 add 增加一个新的硬盘。

注意:此时vmware 是已导入操作系统文件, 同时操作系统没有运行起来

2 运行操作系统(linux), 后格式化硬盘,并mount 硬盘到一个指定目录/home/pub

2.1 Root 用户权限下,执行fdisk –l命令 查看硬盘设备文件

2.2 注意到新增的一个硬盘设备文件/dev/hdb

2.3 格式化硬盘

3 /dev/hdb

2.4 mount 硬盘 mount –t ext3 /dev/hdb /home/pub

每次虚拟机开机都得进行mount硬盘的操作, 很是麻烦,有简单的解决方法。

$ sudo vim /etc/fstab

加入下面的内容

/dev/hdb /home/pub ext3 defaults 1 2

开机后自动启动samba服务

1、可以在SETUP里选中SMB

2、在命令行里运行 “chkconfig --level 5 smb on ”

3、在ETC/rc.d/rc.5/里增加一个service smb start

ln建立链接

ln –s 源文件(源目录) 目的文件(目的目录)

undefined reference to `fvp_get_relative_time'

gcc编绎时出错 提示undefined reference to `fvp_get_relative_time'

原因:没有定义函数fvp_get_relative_time的实现。

SourceInsight 添加新的文件类型

1 打开Options->Document Options

2 File filter: 添加*.s

* .s代表新的文件类型后缀。

内网IPCamera 外网访问的方法。

1 路由器能够进行外网访问,填写ddns帐号与密码

2路由器进行端口映射,ipcamera 的web端口与数据传输端口均要进行端口映射。

implicit declaration of function 错误的解决方法。

用gcc编译c程序的时候 经常会出现

implicit declaration of function '...' 的warning

偶经过这几天的经验,发现主要有2种情况会产生这种warning

1 没有把函数所在的c文件生成.o目标文件

2 在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明

调用ioctl函数没有加头文件#include ,居然

报语法错误。

2011-5-10

Linux下打包目录命令

tar cvf /tempdir

嵌入式查看当前动态库链接目录,增加动态库链接目录

echo $LD_LIBRARY_PATH

LD_LIBRARY_PATH 增加链接目录,如下我们增加新的动态库目录/home/install/ffmpeg/lib

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/install/ffmpeg/lib

海思芯片硬解码可以接受的两种码流方式。

海思 3515 芯片配置解码时, 送解码器的数据有两种形式,一种是以码流的形式, 一种

是以帧数据的形式,海思的demo程序中,解压demo 就是以码流数据的形式送解码器的,

而在前公司, 我们以帧数据形式送解码器。

// = H264D_MODE_FRAME;

= H264D_MODE_STREAM;

太过份了,在调用ioctl函数时, 没有加头文件

#include 居然提示我语法错误。

一个导致主程序不断的挂掉的函数。

msg_dbg("func(%s), u32Len(%d)n", stStream.u32Len);

2011-4-21

VMware虚拟机出现Reason: Failed to lock the file

打开VMware出现Cannot open the disk *.vmdk or one of the snapshot disks it depends

: Failed to lock the file.错误的解决办法!

今天我公司做的虚拟化服务器出现故障意外重启了,主系统启动之后,在启动VMware

虚拟机的时候出现了Cannot open the disk '*.vmdk' or one of the snapshot disks it depends

: Failed to lock the file.的错误,一个虚拟机无法启动将影响到很多用户的使用,

所以我马上开始寻找解决Reason: Failed to lock the file的办法!于是我到百度搜索了一下

这个错误的具体原因,搜索结果中给出了两种解决办法!

解决办法一:

1、在VMware该虚拟机路径下的所有.lck文件和文件夹下删除或迁移至其它目录,一般就可

以解决了。

2、如果再次启动VMware的Windows Vista系统失败,尝试右键虚拟机出错的系统

->Settings->Hardware->Hard Disk->Utilities->Map->映射虚拟硬盘到Z:

3、断开虚拟硬盘,重新加载,启动。系统就可以正常启动了

经实验此办法以失败结束。如果有遇到Cannot open the disk '*.vmdk' or one of the

snapshot disks it depends : Failed to lock the file错误的朋友不妨也试一下。

如果您实验成功了,请给我们留言,以便我们进行更好的技术交流

解决办法二:

使用记事本打开*.VMX文件上加上一行代码g = "FALSE",重新启动该虚拟

机。

使用方法二,问题得到解决,重新启动VMware正常启动,不会再出现Cannot open the disk

'*.vmdk' or one of the snapshot disks it depends : Failed to lock the file.

错误。

希望各位从事虚拟化的朋友能有所帮助,也欢迎各位来我站踊跃投稿!

感谢作者的分享,偶使用方法1第1步就解决了

问题出现的原因:

虚拟磁盘(.vmdk)本身有一个磁盘保护机制,为了防止多台虚拟机同时访问同一个虚拟磁盘

(.vmdk)带来的数据丢失和性能削减方面的隐患,每次启动虚拟机的时候虚拟机会使用扩展名

为.lck(磁盘锁)文件对虚拟磁盘(.vmdk)进行锁定保护。当虚拟机关闭时.lck(磁盘锁)文件

自动删除。但是可能由于您非正常关闭虚拟机,这时虚拟机还没来得及删除您系统上的.lck(磁

盘锁)文件,所以当下次您启动虚拟机的时候出现了上述错误

2011-4-11

一个内存错误。

代码如下。

#define DECL_PRIV(thiz, priv) PrivInfo* priv = thiz != NULL ? (PrivInfo*)thiz->priv : NULL

struct _Access

{

AccessSeek seek;

AccessBlock block;

AccessRead read;

AccessControl control;

AccessDestroy destroy;

char priv[0];

};

DECL_PRIV(thiz, priv);

priv = (PrivInfo *)COMM_ZALLOC(sizeof(PrivInfo));

priv 为一局部变量,当函数退出时, 该局部变量会回收。

结构体thiz->priv 指向地址为非法地址,

正确的做法,当thiz进行分配内存时, 同时分配额外的内存。

Access *thiz = (Access *)COMM_ZALLOC(sizeof(Access) + sizeof(PrivInfo));

回收内存时

COMM_ZFREE(thiz, sizeof(*thiz) + sizeof(PrivInfo));

编绎时出现此提示错误,warning: assignment

pointer from integer without a cast

原因分析,没有包含函数声明的头文件。

makes

2011-4-8

使用va_list时应包含的头文件 #include

头文件里一个函数定义忘记写分号,导致的BUG.

2011-3-23

今天遇到的一个问题, 头文件里一个函数结尾处忘记写分号,调试时总是出现如下bug提

示。

error: syntax error before '{' token

C语言宏定义##连接符和#符的使用

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期

概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。

关于#和##

在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说

就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号。比如下面代码中的宏:

#define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP "n"); } while(0)

那么实际使用中会出现下面所示的替换过程:

WARN_IF (divider == 0);

被替换为

do {

if (divider == 0)

fprintf(stderr, "Warning" "divider == 0" "n");

} while(0);

这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。

而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的

对象是Token就行,而不一定 是宏的变量。比如你要做一个菜单项命令名和函数指针组成

的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下

面的代码就非常实用:

struct command

{

char * name;

void (*function) (void);

};

#define COMMAND(NAME) { NAME, NAME ## _command }

// 然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了:

struct command commands[] = {

COMMAND(quit),

COMMAND(help),

...

}

COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,

间接地也可以减少不留心所造成的错误。我们还可以n个##符号连接 n+1个Token,这个特

性也是#符号所不具备的。比如:

#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);

// 这里这个语句将展开为:

// typedef struct _record_type name_company_position_salary;

关于...的使用

...在C宏中称为Variadic Macro,也就是变参宏。比如:

#define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)

// 或者

#define myprintf() fprintf(stderr,templt,args)

第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,

我们显式地命名变参为args,那么我们在宏定义中就可以用args来代指变参了。同C语言

的stdcall一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一个

参数templt时,C标准要求我们必须写成:

myprintf(templt,);

的形式。这时的替换过程为:

myprintf("Error!n",);

替换为:

fprintf(stderr,"Error!n",);

这是一个语法错误,不能正常编译。这个问题一般有两个解决方法。首先,GNU CPP提供

的解决方法允许上面的宏调用写成:

myprintf(templt);

而它将会被通过替换变成:

fprintf(stderr,"Error!n",);

很明显,这里仍然会产生编译错误(非本例的某些情况下不会产生编译错误)。除了这种方

式外,c99和GNU CPP都支持下面的宏定义方式:

#define myprintf(templt, ...) fprintf(stderr,templt, ##__VAR_ARGS__)

这时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗

号。那么此时的翻译过程如下:

myprintf(templt);

被转化为:

fprintf(stderr,templt);

这样如果templt合法,将不会产生编译错误。 这里列出了一些宏使用中容易出错的地方,

以及合适的使用方式。

错误的嵌套-Misnesting

宏的定义不一定要有完整的、配对的括号,但是为了避免出错并且提高可读性,最好避免这

样使用。

由操作符优先级引起的问题-Operator Precedence Problem

由于宏只是简单的替换,宏的参数如果是复合结构,那么通过替换之后可能由于各个参数之

间的操作符优先级高于单个参数内部各部分之间相互作用的操作符优先级,如果我们不用括

号保护各个宏参数,可能会产生预想不到的情形。比如:

#define ceil_div(x, y) (x + y - 1) / y

那么

a = ceil_div( b & c, sizeof(int) );

将被转化为:

a = ( b & c + sizeof(int) - 1) / sizeof(int);

// 由于+/-的优先级高于&的优先级,那么上面式子等同于:

a = ( b & (c + sizeof(int) - 1)) / sizeof(int);

这显然不是调用者的初衷。为了避免这种情况发生,应当多写几个括号:

#define ceil_div(x, y) (((x) + (y) - 1) / (y))

消除多余的分号-Semicolon Swallowing

通常情况下,为了使函数模样的宏在表面上看起来像一个通常的C语言调用一样,通常情

况下我们在宏的后面加上一个分号,比如下面的带参宏:

MY_MACRO(x);

但是如果是下面的情况:

#define MY_MACRO(x) { /* line 1 */ /* line 2 */ /* line 3 */ }

//...

if (condition())

MY_MACRO(a);

else

{...}

这样会由于多出的那个分号产生编译错误。为了避免这种情况出现同时保持

MY_MACRO(x);的这种写法,我们需要把宏定义为这种形式:

#define MY_MACRO(x) do {

/* line 1 */ /* line 2 */ /* line 3 */ } while(0)

这样只要保证总是使用分号,就不会有任何问题。

Duplication of Side Effects

这里的Side Effect是指宏在展开的时候对其参数可能进行多次Evaluation(也就是取值),但

是如果这个宏参数是一个函数,那么就有可能被调用多次从而达到不一致的结果,甚至会发

生更严重的错误。比如:

#define min(X,Y) ((X) > (Y) ? (Y) : (X))

//...

c = min(a,foo(b));

这时foo()函数就被调用了两次。为了解决这个潜在的问题,我们应当这样写min(X,Y)这个

宏:

#define min(X,Y) ({ typeof (X) x_ = (X); typeof (Y) y_ = (Y); (x_ < y_) ? x_ : y_; })

({...})的作用是将内部的几条语句中最后一条的值返回,它也允许在内部声明变量(因为它

通过大括号组成了一个局部Scope)。

2010-3-8

Happy woman Day!

tsearch, tfind, tdelete, twalk, tdestroy 相关函数。

#define _GNU_SOURCE

#include

void tdestroy (void *root, void (*free_node)(void *nodep));

DESCRIPTION

tsearch(), tfind(), twalk(), and tdelete() manage a binary

tree. They are generalized from Knuth

(6.2.2) Algorithm T. The first field in each node of the tree is

a pointer to the corresponding data

item. (The calling program must store the actual data.)

compar points to a comparison routine,

which takes pointers to two items. It should return an integer

which is negative, zero, or positive,

depending on whether the first item is less than, equal to, or

greater than the second.

tsearch() searches the tree for an item. key points to the item

to be searched for. rootp points to

a variable which points to the root of the tree. If the tree is

empty, then the variable that rootp

points to should be set to NULL. If the item is found in the tree,

then tsearch() returns a pointer

to it. If it is not found, then tsearch() adds it, and returns

a pointer to the newly added item.

tfind() is like tsearch(), except that if the item is not found,

then tfind() returns NULL.

tdelete() deletes an item from the tree. Its arguments are the

same as for tsearch().

twalk() performs depth-first, left-to-right traversal of a binary

tree. root points to the starting

node for the traversal. If that node is not the root, then

only part of the tree will be visited.

twalk() calls the user function action each time a node is visited

(that is, three times for an

internal node, and once for a leaf). action, in turn, takes three

arguments. The first is a pointer

to the node being visited. The second is an integer which takes

on the values preorder, postorder,

and endorder depending on whether this is the first, second, or

third visit to the internal node, or

leaf if it is the single visit to a leaf node. (These symbols are

defined in .) The third

argument is the depth of the node, with zero being the root.

(More commonly, preorder, postorder, and endorder are

known as preorder, inorder, and postorder:

before visiting the children, after the first and before the second,

and after visiting the children.

Thus, the choice of name postorder is rather confusing.)

tdestroy() removes the whole tree pointed to by rootp,

freeing all resources allocated by the

tsearch() function. For the data in each tree node the function

free_node is called. The pointer to

the data is passed as the argument to the function. If no such work

is necessary free_node must point

to a function doing nothing.

RETURN VALUE

tsearch() returns a pointer to a matching item in the tree, or to

the newly added item, or NULL if

there was insufficient memory to add the item. tfind() returns

a pointer to the item, or NULL if no

match is found. If there are multiple elements that match

the key, the element returned is

unspecified.

tdelete() returns a pointer to the parent of the item deleted, or

NULL if the item was not found.

tsearch(), tfind(), and tdelete() also return NULL if rootp was

NULL on entry.

WARNINGS

twalk() takes a pointer to the root, while the other

functions take a pointer to a variable which

points to the root.

twalk() uses postorder to mean "after the left subtree, but before

the right subtree". Some authori-

ties would call this "inorder", and reserve "postorder" to mean

"after both subtrees".

tdelete() frees the memory required for the node in the tree.

The user is responsible for freeing

the memory for the corresponding data.

The example program depends on the fact that twalk() makes no

further reference to a node after call-

ing the user function with argument "endorder" or "leaf". This

works with the GNU library implemen-

tation, but is not in the SysV documentation.

EXAMPLE

The following program inserts twelve random numbers into a binary

tree, where duplicate numbers are

collapsed, then prints the numbers in order.

#include

#include

#include

#include

void *root = NULL;

void *xmalloc(unsigned n) {

void *p;

p = malloc(n);

if (p) return p;

fprintf(stderr, "insufficient memoryn");

exit(1);

}

int compare(const void *pa, const void *pb) {

if (*(int *)pa < *(int *)pb) return -1;

if (*(int *)pa > *(int *)pb) return 1;

return 0;

}

void action(const void *nodep, const VISIT which, const int

depth) {

int *datap;

switch(which) {

case preorder:

break;

case postorder:

datap = *(int **)nodep;

printf("%6dn", *datap);

break;

case endorder:

break;

case leaf:

datap = *(int **)nodep;

printf("%6dn", *datap);

break;

}

}

int main() {

int i, *ptr;

void *val;

srand(time(NULL));

for (i = 0; i < 12; i++) {

ptr = (int *)xmalloc(sizeof(int));

*ptr = rand()&0xff;

val = tsearch((void *)ptr, &root, compare);

if (val == NULL) exit(1);

}

twalk(root, action);

return 0;

}

CONFORMING TO

SVr4, POSIX.1-2001. The function tdestroy() is a GNU extension.

2011-3-3

vimperator常用命令

: 进入命令行模式

:h 或F1 帮助,这是最好的参考

h,j,k,l 移动 左,下,上,右

H,L 切换tab

o 打开url或搜索

t 在新tab中打开url或搜索

/ 在当前页搜索

d 关闭当前tab

u 恢复刚关闭的tab

r 刷新

h,j,k,l 移动 左,下,上,右

Ctrl+n 下个tab

Ctrl+p 上个tab

zi 页面广大

zo 页面缩小

zz 恢复页面默认大小

ZQ 退出FireFox,不保存打开的tab

ZZ 保存tab并退出

Ctrl+q 忽略Vimp快捷键

Ctrl+v 跳到下个键

q 宏录制

@ 播放宏

n 查找下一个

N 查找前一个

* 查找选中的文字(向后)

# 查找选中文字(向前)

i 进入插入模式

Ctrl+c 停止载入

0 定位到网页左边

$ 定位到网页右边

gg 定位到网页顶端

G 定位到网页底部

Ctrl+d 向下滚半屏

Ctrl+u 向上滚半屏

Ctrl+b 向下滚整屏

Ctrl+f 向上滚整屏

]f 焦点放到下个框架

[f 焦点放到上个框架

]] 找"next"链接

[[ 找"prev"链接

gf 查看源代码

gF 用外部软件查看源代码

gi 焦点到上个输入框

p 粘贴

r 刷新

R 跳过缓存重新载入

Y 复制选择的文字

Ctrl+g 显示当前tab名称

g Ctrl+g 显示详细tab信息

a 收藏当前tab(有对话框)

A 收藏当前tab(直接收藏)

B 看所有tab信息

D 关闭当前页,并定位到左tab

gt 转到下个tab

gT 转到上个tab

m 标记当前位置

` 跳到标记的位置

f 打开链接

F 在新窗口打开链接

y 复制当前tab的url

~ 打开用户目录

gh 打开主页

gH 在新tab中打开主页

gU 转到网站根处Ctrl+o 后退

Ctrl+i 前进:set go+=mT 显示菜单栏和导航栏

:set go-=mT 隐藏菜单栏和导航栏:dialog 再按Tab键,会出现各种Firefox设置选项,以下

举几例

:dialog searchengines 设置搜索引擎

:dialog addons 扩展,主题设置

:dialog bookmarks 书签管理:pref Firefox的选项

:!cmd 运行Windows的cmd各种命令常见问题:

0.如何临时取消Vimp的作用?

快捷键 Ctrl+z 回到Vimp按 ESC

1.如何选中文字并复制

先按i键,再定位到要复制文字前或后,再按v键,再hjkl等进行定位,文字就会被选中,

选好后再按y键就会复制了。

2.如果页面很长,如何在一个页面中定位

先ma 则会标记当前位置,当要返回标记过的位置时,则按`a (命令中的a可换成其他字母)

3.由于Ctrl+C 变成停止载入功能,用不习惯,怎么改回来

可以在_Vimperatorrc 中加入以下几行

:noremap

:cnoremap

:inoremap

noremap是键盘映射,将映射成,与map不同的是它可以防止循环映射,因为被映射键中出现映

射键,用map会出现死循环,导致浏览器死掉.

cnoremap是Control模式(即输入命令模式)下的映射

inoremap是插入模式下的映射

4.如何让Greader/Gmail等本身具有键盘命令的应用不受到影响呢,加下一行就行了

autocmd LocationChange .* js lKeys =

/.*(|/reader).*/.test()我的_vimperatorrc" Mappings

noremap j 5j

noremap k 5k

noremap

noremap

noremap

noremap

cnoremap

cnoremap

cnoremap

inoremap

inoremap

inoremap

inoremap

inoremap

" PassThrough gmail and greader

autocmd LocationChange .* js lKeys =

/.*(|/reader).*/.test()

set titlestring=Mozilla Firefox

source! ~/_

SAMBA 在windows下,COPY文件出现 指定的网络名

不再可用 错误

原因:磁盘空间不足 ,删除部分文件 , 问题解决。

Linux 图形界面启动

输入命令startx,

#startx

ln -s创建了一个软链接,出现如下错误

用ln -s创建了一个软链接,然后去访问软链接,出现如下错误:

Too many levels of symbolic links

不记得原来的ln命令是什么了,但是如果出现这个错误,多半是之前的ln -s命令时源文件没有使用绝对

路径造成的。总结:不管是源文件还是目标文件都使用绝对路径,这个出错的几率就减小了。

2011-2-24

1 编绎安装libmad 时出错

[code]

make all-recursive

make[1]: Entering directory `/home/izhier/download/libmad-0.15.1b'

make[2]: Entering directory `/home/izhier/download/libmad-0.15.1b'

if /bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I. -DFPM_INTEL

-DASO_ZEROCHECK -Wall -march=i486 -g -O -fforce-mem -fforce-addr -fthread-jumps

-fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2

-fstrength-reduce -MT -MD -MP -MF ".deps/" -c -o version.c;

then mv -f ".deps/" ".deps/"; else rm -f ".deps/"; exit 1; fi

gcc -DHAVE_CONFIG_H -I. -I. -I. -DFPM_INTEL -DASO_ZEROCHECK -Wall -march=i486

-g -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks

-fexpensive-optimizations -fregmove -fschedule-insns2 -fstrength-reduce -MT -MD

-MP -MF .deps/ -c version.c -fPIC -DPIC -o .libs/version.o

cc1: error: unrecognized command line option "-fforce-mem"

make[2]: *** [] Error 1

make[2]: Leaving directory `/home/izhier/download/libmad-0.15.1b'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory `/home/izhier/download/libmad-0.15.1b'

make: *** [all] Error 2

[/code]

不知怎么解决

:(

[[i] 本帖最后由 izhier 于 2009-3-22 10:57 编辑 [/i]]

iSolary 发表于 2009-05-06 23:59

你用的gcc版本太高,这个版本的gcc没有"-fforce-mem"参数,你打开跟目录下的 Makefile

去掉里面出现的"-fforce-mem"就ok了。

2 git安装方法

Git 安装方法

/pub/software/scm/git/

/pub/software/scm/git/2

./configure –prefix=/usr/local/git

make all

make install

vi /etc/profile

添加:

export PATH=/usr/local/git/bin:/usr/local/git/libexec/git-core:$PATH

vi ~/.bashrc

添加:

export PATH=/usr/local/git/bin:/usr/local/git/libexec/git-core:$PATH

apr和apr-util的安装

apr和

apr-util

包含在Apache httpd的发行源代码中,并且在绝大多数情况下使用都不

会出现问题。当然,如果

apr

apr-util

的1.0或1.1版本已经安装在你的系统中了,则

必须将你的

apr

/

apr-util

升级到1.2版本,或者将httpd单独分开编译。要使用发行源代

码中自带的

apr

/

apr-util

源代码进行安装,你必须手动完成

# 编译和安装 apr 1.2

cd srclib/apr

./configure –prefix=/usr/local/apr-httpd/

make

make install

# 编译和安装 apr-util 1.2

cd ../apr-util

./configure –prefix=/usr/local/apr-util-httpd/

–with-apr=/usr/local/apr-httpd/

make

make install# 配置 httpd

cd ../../

./configure –with-apr=/usr/local/apr-httpd/

–with-apr-util=/usr/local/apr-util-httpd/

2010-02-12

1 局域网内组播包发送不成功

环境:虚拟机 fedora-9

原因:网关没有设置

2 automake编绎时CPP提示找不到文件C文件

项目工程源码中,同时存在C源码和C++源码,其中一个模块源码为C++格式,编绎该模

块为一个静态库,编绎文件为 gui.h ,编绎时提示找不到对应的gui.c文件。

网上找到一个解决方案

1 在模块目录下,删除 该 模块下的.deps .libs 文件夹

2 重新在工程的。/configure 命令。

3 linux静态设置ip地址

#ifconfig eth0 down

#ifconfig eth0 192.168.0.** netmask 255.255.255.0 //配置ip地址和子网掩网

#route add default gw 192.***.***.*** //增加网关

#ifconfig eth0 up

2010-1-18

1 生成静态库的makefile 模板

CROSS_COMPILE=arm-hismall-linux-

GCC:=$(CROSS_COMPILE)gcc

GXX:=$(CROSS_COMPILE)g++

AR:=$(CROSS_COMPILE)ar

LIB_NAME:=./libcores.a

INCLUDE_DIR+=-I../common

SRC = cores.c

parameter.c

cores.h

parameter.h

OBJ := $(SRC:.c=.o)

CFLAGS+=$(INCLUDE_DIR)

all:$(LIB_NAME)

$(LIB_NAME):$(OBJ)

$(AR) -r $(LIB_NAME) $(OBJ)

@echo "ok"

@rm -f *.bak *.o

@cd test;make clean;make;

%.o:%.c

$(GCC) $(CFLAGS) -Wall -g -o $@ -c $<

clean:

rm -f $(LIB_NAME)

rm -f *.o

2 生成测试程序的makefile 模板

CROSS_COMPILE=arm-hismall-linux-

CC:=$(CROSS_COMPILE)gcc

CXX:=$(CROSS_COMPILE)g++

SRC = cores_test.c

parameter_test.c

OBJ := $(SRC:.c=.o)

INCLUDES = -I../../common

-I../

LIBS=../libcores.a

CFLAGS+=$(INCLUDES)

all:cores_test parameter_test

cores_test:cores_test.o

$(CC) -o $@ $< $(LIBS)

@rm -f cores_test.o

parameter_test:parameter_test.o

$(CC) -o $@ $< $(LIBS)

@rm -f parameter_test.o

%.o:%.c

$(CC) $(CFLAGS) -Wall -o $@ -c $<

clean:

rm -f cores_test

rm -f parameter_test

rm -f *.o

2010-1-17

1 NULL所在头文件名

#include

2010-01-12

1 用automake工具编译c++文件出错

项目工程源码中,同时存在C源码和C++源码,其中一个模块源码为C++文件格式,

编绎该模块为一个静态库,编绎文件为 gui.h ,编绎时提示找不到对应的gui.c文件。

网上找到一个解决方案

1 在模块目录下,删除 该 模块下的.deps .libs 文件夹

2 重新在工程的。/configure 命令。

deps .libs应该是和Makefile同时生成的,但是.deps好像之在第一次的./configure是生成一次!!!也

就是说虽然更新了,重新./configure时,.deps和.libs得不到更新。

.deps 和.libs是隐藏目录.

2010-1-11

1 autoconf automake 编绎工程源码时出现的错误,

/usr/share/automake-1.10/am/: am__fastdepCXX does not appear in

AM_CONDITIONAL

/usr/share/automake-1.10/am/: The usual way to define `am__fastdepCXX' is to

add `AC_PROG_CXX'

/usr/share/automake-1.10/am/: to `' and run `aclocal' and `autoconf'

again.

src/gui/test/: C++ source seen but `CXX' is undefined

src/gui/test/: The usual way to define `CXX' is to add `AC_PROG_CXX'

src/gui/test/: to `' and run `autoconf' again.

[root@localhost hvr]# C++ source seen but `CXX' is undefined

因工程中存在C++和C源码,

解决方案:

修改文件

在AC_PROG_CC下面添加如下语句

AC_PROG_CXX

该AC_PROG_CXX用于检查工程中是否存在c++文件,如果存在,按照c++的编绎规则进

行编绎。

2010-1-06

1 模块初始化时,如何调用模块的初始化函数。

Fun 为 模块名

在C的语法中,有这么一特殊用法,

void fun_init();

#define USING(a) a##_##init()

void main()

{

USING (fun);

}

2011-1-4

1 如何打印error 所反映的错误信息

perror(const char *s)

打印出上一个函数发生错误的原因输出到标准错误。

2 关于waitpid()

进程的一生可以用一些形象的比喻作一个小小的总结:

随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。

然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。

人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一

个”}”,从容地离我们而去;也可以是自杀,自杀有2种方式,一种 是调用 exit

函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,

放在返回值里保留下来;它还甚至能可被谋杀,被其它进程通过 另外一些方式

结束他的生命。

进程死掉以后,会留下一具僵尸,wait和waitpid充当了殓尸工,把僵尸推去

火化,使其最终归于无形。

在linux中wait系统调用一文中介绍了其中的一个殓尸工wait, 下面介绍另

一个waitpid,这个貌似复杂些。

waitpid函数原型:

#include/* 提供类型pid_t的定义 */

#include

pid_twaitpid(pid_tpid,int*status,intoptions);

从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出

了两个可由用户控制的参数pid和options,从 而为我们编程提供了另一种更

灵活的方式。下面我们就来详细介绍一下这两个参数:

pid

从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但

当pid取不同的值时,在这里有不同的意义。

1. pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运

行结束退出了,只要指定的子进程还没有结束,waitpid就会一直 等下去。

2. pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait

的作用一模一样。

3. pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的

进程组,waitpid不会对它做任何理睬。

4. pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid

的绝对值。

options

options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG

和WUNTRACED两个选项,这是两个常 数,可以用”|”运算符把它们连接起来使

用,比如:

ret=waitpid(-1,NULL,WNOHANG|WUNTRACED);

如果我们不想使用它们,也可以把options设为0,如:

ret=waitpid(-1,NULL,0);

如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,

不会像wait那样永远等下去。

而WUNTRACED参数,用于跟踪调试,极少用到,就不说了。

查看linux源代码 unistd.h 我们会发现,其实 wait 就是经过包装的

waitpid:

staticinlinepid_twait(int*wait_stat)

{

returnwaitpid(-1,wait_stat,0);

}

waitpid的返回值比wait稍微复杂一些,一共有3种情况:

1. 当正常返回的时候,waitpid返回收集到的子进程的进程ID;

2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收

集,则返回0;

3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所

在;

当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,

waitpid就会出错返回,这时errno被设置为ECHILD;

下面看一个简单的例子:

下载:waitpid.c

/* waitpid.c */

#include

#include

#include

#include

int main()

{

pid_t pc,pr;

pc=fork();

if (pc<0)/* fork错误*/

{

printf("fork errorn");

exit(1);

}

else if(pc==0)/*在子进程中*/

{

sleep(10);

exit(0);

}

else

{

do {/* 使用了WNOHANG参数,waitpid不会在这里等待 */

pr=waitpid(pc,NULL,WNOHANG);

if (pr==0)

{

printf("No child exitn");

sleep(1);

}

}while (pr==0);

if (pr==pc)

printf("successfully get child %dn",pr);

else

printf("wait child errorn");

}

return 0;

}

编译并运行:

$ gcc -o waitpid waitpid.c

$ ./waitpid

No child exit

No child exit

No child exit

No child exit

No child exit

No child exit

No child exit

No child exit

No child exit

No child exit

successfully get child 4607

父进程经过10次失败的尝试之后,终于收集到了退出的子进程。父进程和子进

程分别睡眠了10秒钟和1秒钟,代表它们分别作了10秒钟和1秒钟的 工作。

父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如

退出就收集它。

2010-12-30

1 取指针的地址。

eg:

struct _Parameter

{

SetupParameter *setup_para;

}

Struct _Parameter *para;

现要从文件中读取数据写入setup_para结构体。

read(fd,¶->setup_para, sizeof(SetupParameter));

该处编绎不会报错,

setup_para已经是一个指针了,

正确的如下所示:

read(fd,para->setup_para, sizeof(SetupParameter));

2

grep 查找目录中文件的字符串

grep -n "str" -r ./

这是查找当前目录下以及下辖子目录下所有包含str字符串的文件,会列出文件名.以及该行

的内容.以及行号

2010-12-22

1 main 函数执行完后,是否可以执行其它函数。

Main 函数不是第一个被执行的函数,也不是最后一个被执行的函数,

include

__attribute ((constructor)) void hello_init(void)

{

printf("%sn", __func__);

return;

}

__attribute ((destructor)) void hello_fini(void)

{

printf("%sn", __func__);

return;

}

int main(int argc, char* argv[], char* env[])

{

printf("Hello World!n");

return 0;

}

编译并运行:

./helloworld_10

屏幕打印:

hello_init

Hello World!

hello_fini

hello_init 与hello_fini 相当于两个全局构造函数与析构函数,hello_init

最先执行,hello_fini 最后执行。

网上找到一篇相关用法的文章。

Write the contructor and destructor of a dynamicl library

void

__attribute ((constructor))

init_function (void)

{

printf("hello worldn");

}

void

__attribute ((destructor))

fini_function (void)

{

printf("bye !!! n");

}

int foo(int a)

{

return a + 1;

}

Compile the above code as a dynamicl library , and every time dynamic linker loads the library,

the constructor will be invoked, and when the program exists, the destructor will be invoked.

Never use _init and _fini as the constructor and destructor of the library,

since they are used by system itself.

2010-12-20

1 pthread_key_create

概念及作用

在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。在多

线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。但有

时 应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但

却可以跨多个函数访问,比如程序可能需要每个线程维护一个链表,而使用相同

的函数操 作,最简单的办法就是使用同名而不同变量地址的线程相关数据结构。

这样的数据结构可以由Posix线程库维护,称为线程私有数据(Thread- specific

Data,或TSD)。

回页首

创建和注销

Posix定义了两个API分别用来创建和注销TSD:

int pthread_key_create(pthread_key_t *key, void (*destr_function) (void

*))

该函数从TSD池中分配一项,将其值赋给key供以后访问使用。如果

destr_function不为空,在线程退出(pthread_exit())时 将以key所关联的

数据为参数调用destr_function(),以释放分配的缓冲区。

不论哪个线程调用pthread_key_create(),所创建的key都是所有线程可访问

的,但各个线程可根据自己的需要往key中填入不同的值, 这就相当于提供了

一个同名而不同值的全局变量。在LinuxThreads的实现中,TSD池用一个结构

数组表示:

static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] = { { 0,

NULL } };

创建一个TSD就相当于将结构数组中的某一项设置为"in_use",并将其索引返回

给*key,然后设置destructor函数为 destr_function。

注销一个TSD采用如下API:

int pthread_key_delete(pthread_key_t key)

这个函数并不检查当前是否有线程正使用该TSD,也不会调用清理函数

(destr_function),而只是将TSD释放以供下一次调用 pthread_key_create()

使用。在LinuxThreads中,它还会将与之相关的线程数据项设为NULL(见"访

问")。

访问

TSD的读写都通过专门的Posix Thread函数进行,其API定义如下:

int pthread_setspecific(pthread_key_t key, const void *pointer)

void * pthread_getspecific(pthread_key_t key)

写入(pthread_setspecific())时,将pointer的值(不是所指的内容)与key

相关联,而相应的读出函数则将与key相关联的 数据读出来。数据类型都设为

void *,因此可以指向任何类型的数据。

在LinuxThreads中,使用了一个位于线程描述结构(_pthread_descr_struct)

中的二维void *指针数组来存放与key关联的数据,数组大小由以下几个宏来

说明:

#define PTHREAD_KEY_2NDLEVEL_SIZE 32

#define PTHREAD_KEY_1STLEVEL_SIZE

((PTHREAD_KEYS_MAX + PTHREAD_KEY_2NDLEVEL_SIZE - 1)

/ PTHREAD_KEY_2NDLEVEL_SIZE)

其中在/usr/include/bits/local_lim.h中定义了PTHREAD_KEYS_MAX为

1024,

因此一维数组大小为32。而具体存放的位置由key值经过以下计算得到:

idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE

idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE

也就是说,数据存放与一个32×32的稀疏矩阵中。同样,访问的时候也由key

值经过类似计算得到数据所在位置索引,再取出其中内容返回。

回页首

使用范例

以下这个例子没有什么实际意义,只是说明如何使用,以及能够使用这一机制达

到存储线程私有数据的目的。

#include

#include

pthread_key_t key;

void echomsg(int t)

{

printf("destructor excuted in

thread %d,param=%dn",pthread_self(),t);

}

void * child1(void *arg)

{

int tid=pthread_self();

printf("thread %d entern",tid);

pthread_setspecific(key,(void *)tid);

sleep(2);

printf("thread %d returns %dn",tid,pthread_getspecific(key));

sleep(5);

}

void * child2(void *arg)

{

int tid=pthread_self();

printf("thread %d entern",tid);

pthread_setspecific(key,(void *)tid);

sleep(1);

printf("thread %d returns %dn",tid,pthread_getspecific(key));

sleep(5);

}

int main(void)

{

int tid1,tid2;

printf("hellon");

pthread_key_create(&key,echomsg);

pthread_create(&tid1,NULL,child1,NULL);

pthread_create(&tid2,NULL,child2,NULL);

sleep(10);

pthread_key_delete(key);

printf("main thread exitn");

return 0;

}

给例程创建两个线程分别设置同一个线程私有数据为自己的线程ID,为了检验

其私有性,程序错开了两个线程私有数据的写入和读出的时间,从程序运行结果

可以 看出,两个线程对TSD的修改互不干扰。同时,当线程退出时,清理函数

会自动执行,参数为tid。

2010-12-17

1 拷居然出现这样的错误

void fun(char *file_name)

{

Stat(“file_name”, &buf);

}

本意是想要专一个文件名字符串指针给Stat,结果传入一个文件名“file_name”

2010-12-16

1

va_list、va_start、 va_arg、va_end 包含的头文件stdarg.h

2 log_file_fd = open(g_public__file, O_WRONLY| O_APPEND);

O_WRONLY 以只读的形式打开文件

O_CREAT 如果文件 不存在,则创建文件

O_APPEND 写入文件的数据添加到文件结尾处。

2010-12-14

指针数组和数组指针。

这两个概念以前学过,也用过,但是一些时间不用以后, 就忘掉了。重拾,整理一下这些

基本知识。

指针数组 准备的说法应该是指针的数组。

数组指针,准确的说法应该是数组的指针。

Fg:

int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。

int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。

其实这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。所以第一种写法,p先

和[]结合,所以是一个数组,后与*结合,是指针。后一种写法同理。

对结构体某一个成员变量赋初值

Struct _SDodolook

{

Int year;

Int sex;

};

Struct _Sdodolook dodolook{.year = 27};

结构体的其它成员变量初始为0;

2010-12-13

相信编绎器

当出现编绎出错的时候,相信编绎器,首先查看编绎出错的上下文,其中总会有一些有用的

信息。

arm-hismall-linux-gcc -g -O2 -o array_list_test array_list_test.o ../../../src/cores/libcores.a

arm-hismall-linux-gcc -DHAVE_CONFIG_H -I. -I../../.. -I../../../src/cores/ -I../../../src/public

-g -O2 -MT clocks_rtc_test.o -MD -MP -MF .deps/clocks_rtc_ -c -o clocks_rtc_test.o

clocks_rtc_test.c

mv -f .deps/clocks_rtc_ .deps/clocks_rtc_

arm-hismall-linux-gcc -g -O2 -o clocks_rtc_test clocks_rtc_test.o ../../../src/cores/libcores.a

../../../src/cores/libcores.a(clocks_rtc.o): In function `clocks_rtc_run':

/home/zhoumin/luho/project/dvr/src/cores/clocks_rtc.c:139: undefined reference to

`create_normal_thread'

从上下的出错信息来看,编绎clocks_rtc_test 时出错,

undefined reference to `create_normal_thread'

查看 ,噢,原来没有添加libpublic.a 库文件。

2010-12-10

很奇怪的一个问题, 编绎时报错

error: expected „=‟, „,‟, „;‟, „asm‟ or „__attribute__‟ before „clocks_rtc_get_time‟

定位错误的地方如下

Static RET clocks_rtc_get_time(Closks *thiz, DateTime *date_time)

分析原因:

1 检查代码,无语法错误。

2 网上查阅相关资料 ,确定该错误的原因是引用了C++的头文件,于是检查代码,确定并

没有引用C++的头文件。

3 分析出错地方的代码。屏蔽出错代码,编绎通过,说明错误还是该地方有关。

4 自已写一个新的函数, static Ret func() 编绎通过,

比较新函数与原来函数的不同, Ret 与RET ,

Ret为个人自定义函数返回类型,RET 为C++下的一个类型值。

2

clocks_rtc.c:75: error: expected declaration specifiers or „...‟ before „DateTime‟

此出错原因竟然是我将类型符Datetime 写成了DateTime

2010-12-8

linux 下查找包含该字符串的文件的命令

例如 在 /usr/local 目录下查找包含string字符串的文件。

grep string /use/local -r

2

list *prev = NULL

while(p)

{

if(条件成立)

{

free(prev->data)

}

prev = p->next;

}

Bug:当第一次进行while 时, prev 为空,

执行free(prev->data) 为非法操作。

2010-12-7

统计目录src下的代码的行数,

find src -name "*.c" |xargs cat|wc –l

2010-12-3

打包文件

tar –czvf temp_dir

2

2010-11-30

CTRL+D代表输入完成CTRL+C 代表终止程序。

搜索文件夹内的所有文件里包含某字符串的linux命令

从文件内容查找匹配指定字符串的行:

$ grep "被查找的字符串" 文件名

从文件内容查找与正则表达式匹配的行:

$ grep –e “正则表达式” 文件名

查找时不区分大小写:

$ grep –i "被查找的字符串" 文件名

查找匹配的行数:

$ grep -c "被查找的字符串" 文件名

从文件内容查找不匹配指定字符串的行:

$ grep –v "被查找的字符串" 文件名

从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行

find / -type f -name "*.log" | xargs grep "ERROR"

2010-11-24

1 Yahoo邮箱POP3设置方法

虽然使用Foxmail也可以收取Yahoo邮箱的信件,但是那毕竟是HTML转发速度和稳定性

上都不及真正的 POP3收取。我也是今天才知道,其实Yahoo的免费邮箱也是可以使用POP

来收取信件的。

1. 在IE地址栏中直接输人

/config/set_popfwd?.src=ym,进 人到YAHOO!“网上直投”的页面。

2. 在注册一项中选择“是”,然后选择你感兴趣的内容,其它的选项可以根据需要来选择,然

后按" 完成"按钮。

3. 选择“网上阅读邮件和POP功能”,其它选项可根据自己的需要选择,完成后按“提交”按

钮。

4. 此 时“网上直投”注册成功,系统会告诉你的“服务器设置”:

接收邮件(POP3)服务器:

发送 邮件(SMTP)服务器:

注意:虽然每个雅虎信箱用户的POP和SMTP的地址都是相同 的,但是用户如果不按上面

的方法进行“网上直投”注册,仍然无法用POP和SMTP方式收发邮件的!

2 vim中调用make 后自动转到下一个错误的命令

:cnext

: cprevious

同时可以简写为

:cn

:cp

2010-11-23

设置开发板获取Ip的方式为动态获取ip方式,也就是以

dhcp的方式获取ip。

$ifconfig eth0 down

$/sbin/udhcpc -i eth0 &

$ ifconfig eth0 up

2010-11-22

1 赋值 运算 ++, --

a = a++;

a 还是原来的值。

a = ++a;

a 在原来的值 的基础加1.

2010-11-18

1 tar 命令详解

格式: tar 选项 文件目录列表

功能: 对文件目录进行打包备份

选项:

-c 建立新的归档文件

-r 向归档文件末尾追加文件

-x 从归档文件中解出文件

-O 将文件解开到标准输出

-v 处理过程中输出相关信息

-f 对普通文件操作

-z 调用gzip来压缩归档文件,与-x联用时调用gzip完成解压缩

-Z 调用compress来压缩归档文件,与-x联用时调用compress完成解压缩

例如:

1.将当前目录下所有.txt文件打包并压缩归档到文件,我们可以使用

tar czvf ./*.txt

2.将当前目录下的中的文件解压到当前目录我们可以使用

tar xzvf ./

2 所有的文字无法显示。

原因是所有ini文件必须转换为utf-8格式。

3 直通下有图片显示花。

原因:载入的一张图片的尺寸与要求不符。

2010-11-12

很奇怪的一个问题,关于tinyxml 只能 用以下方式创建

TiXmlDocument doc;

if(le(pXmlFile) == false)

TiXmlDocument 是一个类的定义,定义类的实体对象,只有以下两种方式,

1 TiXmlDocument doc;

2 TiXmlDocument *doc = new TiXmlDocument;

并且该TiXmlDocument doc不能作为结构体的成员。

2010-11-10

如何把gcc的错误提示改为英文提示?

export LC_MESSAGES=en_US

2010-11-8

1 vim 如何设置 tap键 的空格数。

编缉 ~/.vimrc 文件,添加如下语名。

set tabstop=4

2010-11-3

Ie台云台控制无效。

原因:ie传过来的通道参数有问题 ,设端端默认通道1 对应0, 通道2 对应1,通道3

对应2,而ie云台控制而对应为通道1对应1,通道2 对应2,而者参数不配对。

ie端无法保存参数,

原因:设备端参数结构体更改,而ie 端还保持原样, 故了现无法保存参数的状况。

2010-11-1

Vim 中高亮c 函数

找到C源文件的语法文件,/usr/share/vim/vim72 /syntax/,文件最后加

上这样几行:

"highlight Functions

syn match cFuntions display "[a-zA-Z_]{-1,}s{-0,}({1}"ms=s,me=e-1

hi def link cFuntions Title

二维数组的初始化

int a[10][10] = {0};

将数组中所有的值全部初始为0.

vim 中如何复制多行。

光标移到起始行,输入ma

光标移到结束行,输入mb

光标移到粘贴行,输入mc

然后 :'a,'b co 'c

把 co 改成 m 就成剪切了

2010-10-28

定位一个程序运行中退出的错误

花费了半天的时间, 开始认为可能是内存错误,分析了半天, 无结果, 最终确认为程序

运行中, 程序读到异常变量,退出。

结论:以后写程序但凡程序自身要退出的地方,均加上打印吧,这样后期定位错误也会方便

些。。

2010-10-27

C语言的格式化输出。

1 %02d 不足位补0。

2 %d 不足位补空格。

2010-10-21

Linux 更改系统设置语言。

修改终端语言只会对当前登录用户起效,并且一旦关闭终端则更改失效,下次登

录需要重新设置。

修改 /etc/sysconfig/i18n 文件,如

LANG="en_-8",xwindow会显示英文界面,

LANG="zh_18030",xwindow会显示中文界面。

还有一种方法 cp /etc/sysconfig/i18n $HOME/.i18n

修改 $HOME/.i18n 文件,如

LANG="en_-8",xwindow会显示英文界面,

LANG="zh_18030",xwindow会显示中文界面。

这样就可以改变个人的界面语言,而不影响别的用户

修改后的/etc/sysconfig/i18n 文件为:

LANG="en_-8"

SUPPORTED="zh_18030:zh_CN:zh:en_-8:en_US:en"

SYSFONT="latarcyrheb-sun16"

LC_ALL="en_-8"

export LC_ALL

设置完毕后重启或者用使生效

或修改登录用户的.bash_profile文件加入

export LANG=zh_18030

export LANGUAGE=zh_18030:zh_2312:zh_CN

终端临时更改:比如要修改为中文的,使用下面的命令即可

export LANG=“zh_” 我常这样用~~

2010-10-19

1 线程加锁

加锁忘记解锁, 这应该是程序员常犯的问题,特别一个函数在开始的时候加锁,而返回

的地方过多时, 有可能会有那么一两个地方会忘记加锁。 此时采用goto 语句, 函数的出

口只有一处。

Void fun()

{

pthread_mutex_lock(&m_DecCtrlLock);

if(1)

OVER:

pthread_mutex_unlock(&m_DecCtrlLock);

return s32Ret;

}

2010-10-13

goto over;

一 如何一个文件夹下的所有文件转换unix格式。

在Linux中将DOS 格式转换为Unix格式的文件可以使用dos2unix,如果一个文件夹中有

多个文件需要转换,则可以使用如下命令:

find -type f | xargs dos2unix --dos2unix --safe或者

find -type f | xargs dos2unix -o用dos2unix --help可以查看各参数表示的含义。

以下版权声明必须遵守,转载时 必须以链接的形式注明如下信息:

例如我要将/home/dos 下的所有文件转换为unix格式,执行如下命令。

#cd /hom/dos

# find -type f | xargs dos2unix –o

二 zip 文件 的解压。

# zip *.jpg

这条命令是将所有.jpg的文件压缩成一个zip包

# unzip

这条命令是将中的所有文件解压出来

2010-9-17

int *p;

p自然是一个指向整数指针了,那么p+1指向的是计算机内存的下一个整数,而不是指

向指向地址的下一个内存位置。

2010-9-16

stdio.h就是指“standard input&output"

意思就是说标准输入输出头文件!

所以了,用到标准输入输出函数时,就要调用这个头文件!

2010-9-15

一 很容易出错的 一个地方。

两者同时成立 &&

if( a && b)

do_something();

两者只有有其中的一个成立 ||

if( a ||b )

do_something();

2010-9-14

一 当更新静态库时, 应全部重新编绎make clean;

make.

2010-9-13

一nor falsh 和nand falsh 的读写机制 ,

Nor falsh 可以直接去读取falsh中的数据,而nand falsh无法直接读取内存的数据,需要先

将数据拷贝到内存中,再从内存中读取数据

2010-9-9

一 图片坐标扣图背影显示不相符。

Button控件的的背景图扣图的背景色显示不正确, 原因是由于在xml里指定图片的坐标基

准点为底边中点, 因程序里坐标基准点固定为左上角。

2010-9-2

一 两台刚烧录新的软件机器,向其中一台发ping包,始终

无法成功,但是两台机器均可以向外ping 成功。

分析原因:两台机器的mac 地址相同, 两台机器同时位于网络, 向其中一台机器发数据

包,全部会转发给同一台机器。

2010-9-1

一 新工程的源码编绎

首先在module目录下执行hiconfig命令,选择sdk开发包,工程选项,生成相应的编绎的

目录-,然后才能执行编绎命令,make clean;make

编绎时到commdefine.h头文件里选择相应的编绎开关。

2010-8-30

一 网络设置无法开机自动激活

环境 Fedora-9 + 虚拟机

现状:每次开机都 得自已去手动激活网络设置 。

解决方案

1 打开系统->管理->网络 点击激活的网卡,点击编缉,确认启动是否激活设备是否勾选 ,

如没有勾选,勾选,重启启动, 查看故障是否解决。

2 如果按以上步子做了以后,问题仍然存在。尝试以下方法

进入终端(超级用户下)

输入命令setup 会出现一个图形配置界面,进入服务, 进入系统服务, 将network选 项

勾选 。

二 什么是端口映射。

端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提

供相应的服务。当用户访问该IP的这个端口时,服务器自动将请 求映射到对应

局域网内部的机器上。端口映射有动态和静态之分。

通俗来讲,端口映射是将一台主机的假IP地址映射成一个真IP地址,当用户访

问提供映射端口主机的某个端口时,服务器将请求转到内部一主机的提供这 种

特定服务的主机;利用端口映射功能还可以将一台外网IP地址机器的多个端口

映射到内网不同机器上的不同端口。 端口映射功能还可以完成一些特定代理功

能,比如代理POP,SMTP,TELNET等协议。理论上可以提供六万多个端口的映射。

举例说明如何设置端口映射:例如要映射一台IP地址为192.168.111.10的WEB

服务器,只需把服务器的IP地址 192.168.111.10和提供web服务的TCP端口

80填入到路由器的端口映射表中即可。

2010-8-26

Unsined char 无符号整型,能表示的最大的整数是256 ,

2010-8-25

一 Secure crt 如何退出全屏

Alter+enter键 退出全屏,再Alter+enter切换到全屏状态。

2010-8-24

一 开发板运行程序mount nfs 失败, 查找定位分析原因

程序运行起来后, 会修改ip 地址

解决方法

1 定义程序运行于nfs 的编绎开关,此编绎开关打开时, 不修改网络参数

2 修改网络参数, 使运行app后的网络参数与运行app前的网络参数相一致。

二 工程sz36574v 进入页面,鼠标无法获得focus焦点

原因:页面的初始化focus焦点有问题,定义的focus widget 为一不存在的widget , 所以当

改变焦点时, 会找不到原来的焦点,直接返回-1。

…………..

case GCT_DRAGBAR:

UnsetDragBarFocus(pGuiPage->pDragBar[m_CurControlId], other);

break;

case GCT_SCHEDULETABLE:

UnSetScheduleTableFocusForMouseMV(pGuiPage->pScheduleTable[m_CurContr

olId], other);

break;

default:

return -1;

break;

……………….

2010-8-19

解压linux内核时出错, 解压命令为tar -xzvf

解压时的出错信息为gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error exit

delayed from previous errors

解决方法:去掉解压参数z ,重新执行解压命令tar -xvf 解压成功。

2010-8-17

强制类型转换

void fun(void *ctx, void *data)

{

long long *result = ctx;

printf("*result(%d) *(int *)data(%d)n", *result, *(int *)data);

if(*result < *(int*)data)

{

printf("< less *result(%d)n", *result);

}

Else

{

Printf(“ > bbbbbbbbbbbbbbn”);

}

}

int main()

{

int b = 10000;

int a = 1;

fun(&a,&b);

return 0;

}

此函数比较的结果是> bbbbbbbbbbbbbb

这与实际不符, 为什么会出现这种情况了?

在main函数里,我们定义的a是 int型 ,

将其转换为long long 型 数据,然后再去int 型数据比较, 中间走了过多的弯路,实则并

没有必要。

if(*result < *(int*)data)

{

printf("< less *result(%d)n", *result);

}

*result < *(int*)data 进行比较时, 由于*result 为long long 型 数据,此时*(int*)data也将

进行强制类型转换,转换成long long型 数据,与*result 进行比较。Long long 型 数据为8

字节。

得到教训:

1 如果没有必要,少用强制类型转换。

2 long long型与int型进行强制类型转换应格外小心, 一个是4字节,一个8字节。

2010-8-16

计算两点坐标的长度 x1,x2 之间的长度的大小为x2-x1+1

2010-8-13

整形转换。

int red_value = 0;

int green_value = 0;

int blue_value = 0;

int value = 0;

ConvertHexStringToValue(argv[1], (unsigned long *)&red_value);

ConvertHexStringToValue(argv[2], (unsigned long *)&green_value);

ConvertHexStringToValue(argv[3], (unsigned long *)&blue_value);

注解:

&red_value 表示取red_value的地址的值 ,

(unsigned long *) 进行整形转换。

2010-8-12

一 交叉编绎环境的安装。

1 下载 2

2 解压

tar jxvf 2

3 设置环境变量

vi /etc/profile

添加arm-linux-gcc的路径。

export PATH=$PATH:/home/zhoumin/arm/usr/local/arm/3.4.1/bin/

4 使设置的环境变量生效。

source /etc/profile

二 今天遇到一情况, 调试时所有的图片都无法显示, 执行make clean后再make ,图片显

示ok.

2010-8-11

如何查看可执行程序所在的安装目录

which arm-hismall-linux-gcc

/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc

执行which命令。

2010-8-5

调用宏时, 宏里的定义了临时变量,不要与调用宏的函数

的变量相同。

2010-8-3

一个扇形的算法

#define PAI 3.1415926

int COsdHi3511::DrawpPieslice (int x, int y, int radius, int end_angle, color_t color_circle, color_t

color_sector, void *other)

{

void * other2 = NULL;

float temp_x ;

float temp_y ;

if(other)

{

other2 = (void *)(&((hi3511osddrawpara_t *)other)->mem);

}

if(x < 0 || y < 0 ||end_angle > 360)

{

OSD_DEBUG(("%s invalied parametern", __FUNCTION__));

return OEC_INVALIDPARA;

}

int pos_x = 0;

int pos_y = 0;

DrawCircle(x, y, radius, 1, true, color_circle, other);

for(int i = 0; i < end_angle; i++)

{

temp_x = x + radius*sin((PAI*i)/180);

temp_y = y - radius*cos((PAI*i)/180);

pos_x = (int)(temp_x - 0.5);

pos_y = (int)(temp_y - 0.5);

InterBresenhamline(x, y, pos_x, pos_y, color_sector, other2);

pos_x = (int)(temp_x + 0.5);

pos_y = (int)(temp_y + 0.5);

InterBresenhamline(x, y, pos_x, pos_y, color_sector, other2);

pos_x = (int)(temp_x - 0.5);

pos_y = (int)(temp_y + 0.5);

InterBresenhamline(x, y, pos_x, pos_y, color_sector, other2);

pos_x = (int)(temp_x + 0.5);

pos_y = (int)(temp_y - 0.5);

InterBresenhamline(x, y, pos_x, pos_y, color_sector, other2);

}

return OEC_SUCCESS;

}

任意两点画直线的算法

int COsdHi3511::InterBresenhamline (int x0,int y0,int x1, int y1,color_t color, void *other)

{

int dx = 0;

int dy = 0;

int flag = false;

int temp = 0;

int ydir = 0;

int d = 0;

int ix = 0;

int iy = 0;

dx = (x0 > x1)?(x0-x1):(x1-x0);

dy = (y0 > y1)?(y0-y1):(y1-y0);

flag = (dy >= dx)?true:false;

if(flag)

{

temp = x0;

x0 = y0;

y0 = temp;

temp = x1;

x1 = y1;

y1 = temp;

}

if(x0 > x1)

{

temp = x0;

x0 = x1;

x1 = temp;

}

temp = y0;

y0 = y1;

y1 = temp;

ydir = y0>y1 ? -1 : 1;

dx = x1-x0;

dy = abs(y1-y0);

d=2*dy-dx;

ix = x0;

iy = y0;

while(ix<=x1)

{

if(flag)

{

DrawPixel(iy,ix,color,other);

}

else

{

DrawPixel(ix,iy,color,other);

}

++ix;

if(d>0)

{

iy += ydir;

d+=2*(dy-dx);

}else

{

d+=2*dy;

}

}

return 0;

}

2010-7-30

一种新的for模型,

for(int i = 0; i < max;)

{

if(1)

{

}

else

{

i++

}

}

2010-7-29

linux添加用户

1 添加用户

adduser zhoumin

2 输入用户密码

passwd zhoumin

2010-7-28

1 nfs客户端的配置。

Mount –t nfs –o nolock :/nfs_dir /home

修改开发板ip地址 和物理网卡地址。

Ifconfig eth0 hw 00:11:22:33:44:xx

2 在linux 下直接函数名表示函数名所在内存中的地址。

void fun()

{

}

Unsigned short *fun_add = NULL;

fun_add = fun;

2010-7-26

拷贝二进制数据,定义buf 类型应为unsigned char 型

2010-7-23

Linux 下安装飞鸽

Linux 下安装飞鸽,linux的桌面环境有两类,一类是基于gtk+的, 一类是基于gnome的,

我安装linux版本为fedora9,是基于gnome的,需要安装基于基于gnome版本的飞鸽,关于

安装fedora9飞鸽的教程.

2010-7-22

VPN 无法连接

定位VPN 无法连接上, 确认项目组员孙能连接上,确认Ip网关设置正确,我的浏览器与

他的不一样,于是换用他所用的IE浏览器,VPN连接成功。

一体机,当系统制式为PAL制时,分辨大小为720X576 ,宽度与高度的比为5:4,当不接摄

像头时,显示的分辨大小为600X480,此时采集的宽度与高度的比仍这5:4.

2010-7-20

Windows下的文件系统是不支持创建符号链接

Windows下的文件系统是不支持创建符号链接,只有在linux 下才只支持创建军符号链接。

2010-7-19:

编程问题。

变量定义,最好赋初值。

2010-7-15 :

linux与windows下的换行符不一样

1 windows下的文本文件在转换在linux下读取,由于linux与windows下的换行符不一样,

所以应执行一个命令dos2unix filename.

Linux 下文件的换行符为0x0a,而windows下的换行符为0x0d, 0x0a.

2 在linux C bool 类型居然要加头文件 #include

2010-7-14:

编绎问题

今天在写一个功能模块是始终出错,出错打印如下所示。

In file included from .//test_get_lan_string.c:3:

./../src/include/get_lan_string.h:8: 错误:expected ‘)’ before ‘language’

cc1: warnings being treated as errors

.//test_get_lan_string.c: 在函数‘main’中:

.//test_get_lan_string.c:10: 错误:隐式声明函数‘InitGetLanguageString’

.//test_get_lan_string.c:10: 错误:‘CHINESE_SIMPLE_LAN’未声明(在此函数内第一次使用)

.//test_get_lan_string.c:10: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其

.//test_get_lan_string.c:10: 错误:所在的函数内也只报告一次。)

make: *** [test_get_lan_string.o] 错误 1

最后经查找定位原因为定义头文件出错,

为了防止重复包含头文件 ,我们会在头文件fun.h的头部加上#ifnde __FUN_H__ #define

__FUN_H__ 尾部加上定义#endif 我出错的原因是加错了定义 ,将get_lan_string_typedef.h

的头部的定义错误定义为#ifndef __GET_LAN_STRING_H__ #define

__GET_LAN_STRING_H__ 故结果出错。

2010-7-13:

linux C语言

int gettimeofday(struct timeval *tv,struct timezone *tz),此函数用于返回当前的时间的,计时的

基准时间为指定为1970年1月1日凌晨零点零分零秒,格林威治时间。

2010-6-30

编绎问题

编绎时不停的给此打印信息linker input file unused because linking not done

分析得出,此出错信息的打印是由于链接库没有被使用。

/linuxsystem/archive/2010/06/07/

2

010-6-15:

linux C语言

老生常谈的问题,free野指针,导致程序挂死。

给一个结构体分配内存后,结构本的成员包括指针时,给结构体分配内存后,应及时的给初

始化结构体指针的值(赋值为空)。

/linuxsystem/archive/2010/06/10/


本文标签: 文件 函数 使用 错误