QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1149|回复: 8

菜鸟求教gcc编程问题

[复制链接]
发表于 2004-7-15 15:35:00 | 显示全部楼层 |阅读模式
由于刚学习gcc编程,碰到一大堆问题,还请各位不吝指教(有点烦喔).

源程序如下:

////////////////////////////////////////////////
//compute.c:简单计算器
////////////////////////////////////////////////
#include<stdio.h>

double sum(double a,double b);
double subtract(double a,double b);
double multiply(double a,double b);
double divide(double a,double b);
double remainder(double a,double b);

int main(void)
{
   int choice;
   double a,b;
   double (*func)();
   while(1)
  {
   printf("\n*****************************************");//输入提示询息
   printf("\n1.sum");
   printf("\n2.subtract");
   printf("\n3.multiply");
   printf("\n4.divide");
   printf("\n5.remainder");
   printf("\nInput a choice(any other key to exit):");
   choice=getchar();
   switch(choice)
  {
     case '1':
         func=sum;
         break;
     case '2':
         func=subtract;
         break;
     case '3':
         func=multiply;
         break;
     case '4':
         func=divide;
         break;
     case '5':
         func=remainder;
     default:
         return;
  }
  printf("\n\nPlease input a:");
  scanf("%lf",&a);
  printf("Pleast input b;
  scanf("%lf",&b);
  printf("\nThe result is:%lf.\n",(*func)(a,b));
}
return 1;
}

double sum(double a,double b)
{
   return a+b;
}

double subtract(double a,double b)
{
   return a-b;
}

double multiply(double a,double b)
{
   return a*b;
}

double divide(doublea,double b)
{
   return a/b;
}

double remainder(double a,double b)
{
  return (int)a%(int)b;
}

运行gcc -o compute.o compute.c后,出来下面错误信息:
compute.c:47:10: warning: multi-line string literals are deprecated
compute.c:48:13: warning: multi-line string literals are deprecated
compute.c: In function `main':
compute.c:47: `lf' undeclared (first use in this function)
compute.c:47: (Each undeclared identifier is reported only once
compute.c:47: for each function it appears in.)
compute.c:47: parse error before string constant
compute.c:47: stray '\' in program
compute.c:47: stray '\' in program
compute.c:49:33: warning: multi-line string literals are deprecated
compute.c:49:33: missing terminating " character
compute.c:47:10: possible start of unterminated string literal

请问怎么回事?

附带问题:
1.在gcc中,main的返回值是否只能为int型?
2.有没有像Turob C,最好像VC一样便洁的调试工具?gdb?
3.getche,getchar是在stdio.h中吗?(好久没用c了,有点忘了)
发表于 2004-7-15 19:23:56 | 显示全部楼层
你的47行是哪行。
1.这是标准ansi c的规定吧
2.gdb?有些ide调试方便。
3.linux下没有getche,getchar 在<stdio.h>用  info getchar 看看。
回复

使用道具 举报

发表于 2004-7-17 08:24:55 | 显示全部楼层
这里的问题吧

[code:1]
double (*func)(); => double (*func)(double, double);
[/code:1]
回复

使用道具 举报

发表于 2004-7-17 13:02:42 | 显示全部楼层
代码中有两处明显的错误:

1、
[code:1]
    printf("Please input b:");
[/code:1]
以上一行代码中你可能是漏写了引号,所以导致编译时错误提示“multi-line string literals are deprecated”,gcc认为printf这个语句并未结束并被分成太多行(要遇到下一个引号为止!)。从你贴到论坛上的代码也可以知道应该是漏写引号,所以冒号和后继的反括号在页面上显示了笑脸符。(pleast应为please,请改正。)

2、另外还有一个错误,就是在函数divide()中将double和a连写,中间并无空格。

修正这两个错误后程序可正常通过编译并运行。
回复

使用道具 举报

 楼主| 发表于 2004-7-19 21:42:12 | 显示全部楼层
果然是高手,谢谢lanche!
我修改lanche指出的错误后,程序就能正常编译运行了.
不过我还请教几个问题, 还请赐教:
1.编译的提示信息指出了错误在第几行,那么能否有什么工具或选项可以使错误行加亮显示,就像turbo c或VC中一样, 或者编译时有什么参数选项可以使源程序的行号显示出来,否则如果程序太长,数行也很难数.
2.我这个程序本身还有一个问题:运行后,第一次选择(比如选1, 进行加法运算)没问题,可是第二次却不能再选择,而是第一次选择运算完成后直接退出程序. 我想这主要是因为输出队列没有清空的缘故:因为第一次输入后,还输入了回车.所以我想问一下,怎么才能清空输入队列,其作用相当于c++中的flush函数.
回复

使用道具 举报

发表于 2004-7-20 13:05:30 | 显示全部楼层
1、这个问题我不好回答,因为我一般不用IDE集成开发环境,也很少用gdb调试程序,因为自己最喜欢用vim;我的习惯是在程序中含调试代码,运行出错时会打印相关信息帮助自己定位,而编译时提示的错误行数在vim中可以按行号然后按大写G就可以将光标跳过去了。

如果你想要象VC那样编程,可以使用一些IDE如Anjuta、Kdevelop、Kylix等。

2、你可以设置输入特定的信息(比如0等)后才能退出(不然遇回车就能退出)。
回复

使用道具 举报

 楼主| 发表于 2004-7-21 20:36:27 | 显示全部楼层
谢谢!
顺便问一下,在程序中包含调试代码是怎么进行的你能给我一个例程(如果可以的话,发我邮箱里:[email protected])或给我推荐几本参考书吗?
不好意思, 我现在刚接触linux的编程,所以很多东西都不懂,请别见笑.
再次感谢lanche.
回复

使用道具 举报

发表于 2004-7-23 18:45:08 | 显示全部楼层
我也想知道 :-)
回复

使用道具 举报

发表于 2004-7-23 21:08:13 | 显示全部楼层
只不是过用printf()打印自己关心的数值而已,如果与预期的不一样就检查该段代码呗。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 20:52 , Processed in 0.066365 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表