只是一些笔记

歪酷博客
Px @ 2005-11-04 13:03

一些C涉及到的概念,有些偏向于嵌入式系统方面了。
大部分的内容来自于转载:)
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
        #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
1)#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4) 在表达式中用到UL(表示无符号长整型)。

2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
         #define MIN(A,B) ((A) <= (B) ? (A) : (B))
1)标识#define在宏中应用的基本知识。这是很重要的。因为在内嵌(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法。
2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码。
3) 懂得在宏中小心地把参数用括号括起来
4) 宏的副作用,least = MIN(*p++, b);

3. 用变量a给出下面的定义
  a) 一个整型数(An integer)
  b)一个指向整型数的指针( A pointer to an integer)
  c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)
  d)一个有10个整型数的数组( An array of 10 integers)
  e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
  f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
  g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an  integer)
  h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of  ten pointers to functions that take an integer argument  and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

4. 关键字static的作用是什么?
在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2)  在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3)  在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
第2和第3主要为了本地化数据和代码。

5. 关键字const有什么含意?
const意味着"只读",并不单单指常量。
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a
是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
使用const的几个理由:
1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

6. 关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量
更进一步的问题:
1) 一个参数既可以是const还可以是volatile吗?解释为什么。
2) 一个指针可以是volatile 吗?解释为什么。
3) 下面的函数有什么错误:
int square(volatile int *ptr)
{
       return *ptr * *ptr;
}
下面是答案:
1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2)是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
       int a,b;
       a = *ptr;
       b = *ptr;
       return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
       int a;
       a = *ptr;
       return a * a;
}

7. 下面的代码输出是什么,为什么?
void foo(void)
{
       unsigned int a = 6;
       int b = -20;
       (a+b > 6) ? puts("> 6") : puts("<= 6");
}
自动转换原则。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。

8. 浮点数之间的比较
float的精度是7位,double的精度是15~16,所以超出它们的精度范围,所储存的值就不是原来的值了。
比如float f = 194268.02,实际储存的值是194268.015625。
对于浮点数的比较,不能使用==和!=,必须使用epsilon。
epsilon定义:the difference between 1 and the least value greater than 1 that is representable.
1 + epsilon != 1
C:
可以使用FLT_EPSILON,DBL_EPSILON,LDBL_EPSILON
#include "float.h"
       if ( f1<f2+FLT_EPSILON && f1>f2-FLT_EPSILON )
C++:
可以使用std::numeric_limits<typename>::epsilon()
#include <limits>
       if ( f1<f2+std::numeric_limits<float>::epsilon() && f1>f2-std::numeric_limits<float>::epsilon() )


 
Px @ 2005-10-30 20:57

命令(command):
语法: comm.and arg1 arg2 arg3 …
command要么是内建命令要么就是Tcl过程。空白符用来分隔命令名和它的变元,换行符或分号用来表示一天命令的结束。三个步骤:
变元分组
对嵌套命令、变量和反斜杠换码序列进行值替换
调用命令。最终要由命令对变元进行解释

双引号””可以使一个参数包括换行符或分号,三种子替换仍然发生
花括号{}类似于双引号,只是不进行三种替换
方括号[]没有分组功能,嵌套命令会被认为是当前分组的一部分
系统只进行一层子替换,替换的结果不会再去做子替换,而且子替换可以在任何一个域进行
expr后面的表达式最好在花括号里,因为expr会对表达式进行解析而无需Tcl先对变元做一次替换,这样结果更高效和精确

字符串:
Tcl所有的数据类型都是字符串
使用==进行字符串比较不可靠,应该使用string compare或者equal
string is命令用来测试一个字符串是否属于某个特定的类
format, scan, binary

列表(list):
list, lappend, concat, llength, lindex, lrange, linsrt, lreplace, lsort, split, join, foreach

proc name params body
rename
global varName1 varName2 …
upvar ?level? varName localVar



 
Px @ 2005-09-08 09:56

1、在nautilus的地址栏输入applications:///回车,进入菜单所在目录。添加一个启动器到其中一个菜单组,你就会在gnome菜单里找到你所添加的项了。
2、组菜单、系统菜单
你会在/usr/share/applications里找到“程序名.desktop”项目。
说明:
a、如果要保存你的修改为所用用户的通用菜单,就将该项目权限设置为644(root:读写;其它:读权限),这样所用的用户都可以在开始菜单里找到它。
b、如果要保存你的修改为一个组所有或者指定用户的菜单,你也可以做相应的修改。例如,有写菜单是只允许某一个组或者某一用户专用的话,你就应当这用做。

下面是“xxx.desktop”文件的一个例子:
[Desktop Entry]
Encoding=UTF-8
Name=SciTE
Comment=SciTE editor
Type=Application
Exec=/usr/bin/scite
Icon=/usr/share/pixmaps/scite_48x48.png
Terminal=false
Categories=GNOME;Application;Development;
StartupNotify=true

提示:
如果你在applications:///创建了一个菜单项目,并且想改变图标,就单击鼠标右键,选择“edit launcher"然后改变图标。不过如果你用右键属性去修改的话菜单里的图标并不会改变。


 
Px @ 2005-09-04 14:38

有以下几个方法:
1. switchdesk gnome|kde
2. echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc
   echo "exec startkde" > ~/.xinitrc
3. 使用xdm
   /usr/X11R6/lib/X11/xdm/Xsession
case $# in
1)
       case in
       kde)
               exec /usr/local/bin/startkde
               ;;
       GNOME)
               exec /usr/X11R6/bin/gnome-session
               ;;
       failsafe)
               exec xterm -geometry 80x24-0-0
               ;;
       esac
esac
4. 使用gdm或者kdm


 
Px @ 2005-06-01 22:05

Richard Stallman 有关 Emacs 的经典文献
讨论了 Emacs 的各种特性和它的设计
http://www.gnu.org/software/emacs/emacs-paper.html

Emacs 快捷键列表,两页 PDF 文件
详见此贴
http://www.linuxsir.com/bbs/showthr...ht=%BF%A8%C6%AC

生活在emacs中(教程,在IBM网站上,作者:Brian Bilbrey)
http://www-900.ibm.com/developerWor...44?OpenDocument

Emacs Hotkey
文件
打开文件:    C-x C-f 文件名
保存文件:    C-x C-s
退出Emacs:C-x C-c
Undo:        C-x u
======C模式=======
C-c . 设置缩进风格(按TAB键可列出可用的风格,缺省的为gnu,其缩进为2个字符;linux为8个;k&r为5个,java为4个)
TAB 重新缩进当前行
M-/ 自动补齐(缓冲区中能找得到的串)
M-; 行尾加入注释
C-c C-e 扩展宏
C-c C-c 注释掉整个区域
C-u C-c C-c 取消注释
C-c C-\ 将区域中的每一行结尾都加入一个'\'字符

gdb
设置断点:    C-x SPACE
取消断点:    C-x C-a C-d
next:         C-x C-a C-n
step:         C-x C-a C-s
print:        C-x C-a C-p
up:            C-x C-a <
down:        C-x C-a >
Emacs中文化
;;~/.emacs
(set-language-environment 'Chinese-GB)
(set-keyboard-coding-system 'euc-cn)
(set-clipboard-coding-system 'euc-cn)
(set-terminal-coding-system 'euc-cn)
(set-buffer-file-coding-system 'euc-cn)
(set-selection-coding-system 'euc-cn)
(modify-coding-system-alist 'process "*" 'euc-cn)
(setq default-process-coding-system '(euc-cn . euc-cn))
(setq-default pathname-coding-system 'euc-cn)

!!~/.Xresources
Emacs.font:  8x16
Emacs.paneFont:  8x16
Emacs.pane.menubar.font: 8x16
Emacs.foreground: white
Emacs.background: black
Emacs.geometry:  100x32


 
网志文件夹
所有网志
Linux
JAVA
研究相关
C/C++
杂项
最 新 的 评 论
日 历

搜 索
友 情 链 接
· 歪酷博客 · 管理我的Blog ·

订阅 RSS

0012582

歪酷博客