|
楼主 |
发表于 2005-12-5 21:13:00
|
显示全部楼层
为了使代码正常工作有很多种修改办法. 一种是另设一个比串的实际大小小 1 的变量. 这是这种解决办法的代码: <PRE><FONT color=#0066ff>#include <stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
my_print (char *string)
{
printf ("The string is %s\n", string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string;
string2[size] = `\0';
printf ("The string printed backward is %s\n", string2);
}</FONT></PRE>
<H3><FONT color=#ff9900>另外的 C 编程工具</FONT></H3> Slackware Linux 的发行版中还包括一些我们尚未提到的 C 开发工具. 本节将介绍这些工具和它们的典型用法.
<H4>xxgdb</H4><TT> xxgdb</TT> 是 <TT>gdb</TT> 的一个基于 X Window 系统的图形界面. <TT>xxgdb </TT>包括了命令行版的 <TT>gdb</TT> 上的所有特性. <TT>xxgdb </TT>使你能通过按按钮来执行常用的命令. 设置了断点的地方也用图形来显示.
你能在一个 <TT>Xterm</TT> 窗口里键入下面的命令来运行它: <PRE><FONT color=#0066ff>xxgdb</FONT></PRE> 你能用 <TT>gdb</TT> 里任何有效的命令行选项来初始化 <TT>xxgdb</TT> . 此外 <TT>xxgdb</TT> 也有一些特有的命令行选项, 表 27.2 列出了这些选项.
<B><FONT size=+1>表 27.2. xxgdb 命令行选项.</FONT></B>
<TABLE border=1>
<TR align=left rowspan="1">
<TD align=left width=70><I>选 项</I></TD>
<TD align=left><I>描 述</I></TD></TR>
<TR align=left rowspan="1">
<TD align=left width=70><TT>db_name</TT></TD>
<TD align=left>指定所用调试器的名字, 缺省是 <TT>gdb</TT>.</TD></TR>
<TR align=left rowspan="1">
<TD align=left width=70><TT>db_prompt</TT></TD>
<TD align=left>指定调试器提示符, 缺省为 <TT>gdb</TT>.</TD></TR>
<TR align=left rowspan="1">
<TD align=left width=70><TT>gdbinit</TT></TD>
<TD align=left>指定初始化 <TT>gdb</TT> 的命令文件的文件名, 缺省为 <TT>.gdbinit</TT>. </TD></TR>
<TR align=left rowspan="1">
<TD align=left width=70><TT>nx</TT></TD>
<TD align=left>告诉 <TT>xxgdb</TT> 不执行 <TT>.gdbinit</TT> 文件.</TD></TR>
<TR align=left rowspan="1">
<TD align=left width=70><TT>bigicon</TT></TD>
<TD align=left>使用大图标.</TD></TR></TABLE>
<H4>calls</H4><TT> </TT>你可以在 <TT>sunsite.unc.edu</TT> FTP 站点用下面的路径:
<P><TT><FONT color=#3366ff>/pub/Linux/devel/lang/c/calls.tar.Z</FONT></TT>
<P> 来取得 <TT>calls , </TT>一些旧版本的 Linux CD-ROM 发行版里也附带有. 因为它是一个有用的工具, 我们在这里也介绍一下. 如果你觉得有用的话, 从 BBS, FTP, 或另一张CD-ROM 上弄一个拷贝. <TT>calls</TT> 调用 GCC 的预处理器来处理给出的源程序文件, 然后输出这些文件的里的函数调用树图.
<DL>
<DD>
<HR width="90%">
<B>注意:</B> 在你的系统上安装 <TT>calls</TT> , 以超级用户身份登录后执行下面的步骤: 1. 解压和 <TT>untar</TT> 文件. 2. <TT>cd</TT> 进入 <TT>calls</TT> untar 后建立的子目录. 3. 把名叫 <TT>calls</TT> 的文件移动到 <TT>/usr/bin</TT> 目录. 4. 把名叫 <TT>calls.1</TT> 的文件移动到目录 <TT>/usr/man/man1</TT> . 5. 删除 <TT>/tmp/calls</TT> 目录. 这些步骤将把 <TT>calls</TT> 程序和它的指南页安装载你的系统上.
<HR width="90%">
</DD></DL> 当 <TT>calls</TT> 打印出调用跟踪结果时, 它在函数后面用中括号给出了函数所在文件的文件名: <PRE><FONT color=#0066ff>main [test.c]</FONT></PRE> 如果函数并不是向 <TT>calls</TT> 给出的文件里的, <TT>calls </TT>不知道所调用的函数来自哪里, 则只显示函数的名字: <PRE><FONT color=#0066ff>printf</FONT></PRE><TT> calls</TT> 不对递归和静态函数输出. 递归函数显示成下面的样子: <PRE><FONT color=#0066ff>fact <<< recursive in factorial.c >>></FONT></PRE> 静态函数象这样显示: <PRE><FONT color=#0066ff>total [static in calculate.c]</FONT></PRE> 作为一个例子, 假设用 <TT>calls</TT> 处理下面的程序:
<PRE><FONT color=#0066ff>#include <stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2(my_string);
}
my_print (char *string)
{
printf ("The string is %s\n", string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string;
string2[size] = `\0';
printf ("The string printed backward is %s\n", string2);
}</FONT></PRE> 将产生如下的输出: <PRE><FONT color=#0066ff> 1 main [test.c]
2 my_print [test.c]
3 printf
4 my_print2 [test.c]
5 strlen
6 malloc
7 printf</FONT></PRE><TT>calls</TT> 有很多命令行选项来设置不同的输出格式, 有关这些选项的更多信息请参考 <TT>calls</TT> 的指南页. 方法是在命令行上键入 <TT>calls -h</TT> .
<H4><FONT color=#ff9900>cproto</FONT></H4><TT> cproto</TT> 读入 C 源程序文件并自动为每个函数产生原型申明. 用 <TT>cproto</TT> 可以在写程序时为你节省大量用来定义函数原型的时间.
如果你让 <TT>cproto</TT> 处理下面的代码: <PRE><FONT color=#0066ff>#include <stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2(my_string);
}
my_print (char *string)
{
printf ("The string is %s\n", *string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string;
string2[size] = `\0';
printf ("The string printed backward is %s\n", string2);
}</FONT></PRE> 你将得到下面的输出: <PRE><FONT color=#0066ff>/* test.c */
int main(void);
int my_print(char *string);
int my_print2(char *string);</FONT></PRE> 这个输出可以重定向到一个定义函数原型的包含文件里.
<H4><FONT color=#ff9900>indent</FONT></H4><TT> indent</TT> 实用程序是 Linux 里包含的另一个编程实用工具. 这个工具简单的说就为你的代码产生美观的缩进的格式. <TT>indent</TT> 也有很多选项来指定如何格式化你的源代码.这些选项的更多信息请看<TT>indent</TT> 的指南页, 在命令行上键入 <TT>indent -h</TT> .
<P> 下面的例子是 <TT>indent </TT>的缺省输出:
<P> 运行 <TT>indent </TT>以前的 C 代码: <PRE><FONT color=#0066ff>#include <stdio.h>
main () {
char my_string[] = "hello there";
my_print (my_string);
my_print2(my_string); }
my_print (char *string)
{
printf ("The string is %s\n", *string);
}
my_print2 (char *string) {
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string;
string2[size] = `\0';
printf ("The string printed backward is %s\n", string2);
}</FONT></PRE> 运行 <TT>indent </TT>后的 C 代码: <PRE><FONT color=#0066ff>#include <stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
my_print (char *string)
{
printf ("The string is %s\n", *string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string;
string2[size] = `\0';
printf ("The string printed backward is %s\n", string2);
}</FONT></PRE><TT> </TT> <TT>indent </TT>并不改变代码的实质内容, 而只是改变代码的外观. 使它变得更可读, 这永远是一件好事.
<H4>gprof</H4><TT> gprof</TT> 是安装在你的 Linux 系统的 <TT>/usr/bin</TT> 目录下的一个程序. 它使你能剖析你的程序从而知道程序的哪一个部分在执行时最费时间.
<P><TT> gprof</TT> 将告诉你程序里每个函数被调用的次数和每个函数执行时所占时间的百分比. 你如果想提高你的程序性能的话这些信息非常有用.
<P> 为了在你的程序上使用 gprof, 你必须在编译程序时加上 -pg 选项. 这将使程序在每次执行时产生一个叫 gmon.out 的文件. gprof 用这个文件产生剖析信息.
<P> 在你运行了你的程序并产生了 gmon.out 文件后你能用下面的命令获得剖析信息: <PRE><FONT color=#0066ff>gprof <program_name></FONT></PRE> 参数 program_name 是产生 gmon.out 文件的程序的名字.
<DL>
<DD>
<HR width="90%">
<B>技巧:</B> gprof 产生的剖析数据很大, 如果你想检查这些数据的话最好把输出重定向到一个文件里.
<HR width="90%">
</DD></DL>
<H4>f2c 和 p2c</H4><TT> f2c</TT> 和 <TT>p2c </TT>是两个源代码转换程序. f2c 把 FORTRAN 代码转换为 C 代码, p2c 把 Pascal 代码转换为 C 代码. 当你安装 GCC 时这两个程序都会被安装上去.
<P> 如果你有一些用 FORTRAN 或 Pascal 写的代码要用 C 重写的话, f2c 和 p2c 对你非常有用. 这两个程序产生的 C 代码一般不用修改就直接能被 GCC 编译.
<P> 如果要转换的 FORTRAN 或 Pascal 程序比较小的话可以直接使用 f2c 或 p2c 不用加任何选项. 如果要转换的程序比较庞大, 包含很多文件的话你可能要用到一些命令行选项.
<P> 在一个 FORTRAN 程序上使用 f2c , 输入下面的命令: <PRE><FONT color=#0066ff>f2c my_fortranprog.f</FONT></PRE>
<DL>
<DD>
<HR>
<B>注意:</B> <TT>f2c</TT> 要求被转换的程序的扩展名为 <TT>.f</TT> 或 a <TT>.F</TT> .
<HR>
</DD></DL> 要把一个Pascal 程序装换为 C 程序, 输入下面的命令: <PRE><FONT color=#0066ff>p2c my_pascalprogram.pas</FONT></PRE> 这两个程序产生的 C 源代码的文件名都和原来的文件名相同, 但扩展名由 .f 或 .pas 变为 .c. |
|