LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: mantou

About gcc in Mandrake 9.0!!!

[复制链接]
发表于 2002-11-2 14:33:18 | 显示全部楼层
我看出来这是个链表了, 这也是我不喜欢这本书的地方: 为什么上来先讲这么复杂的数据结构呢? 如果这是数据结构的教材那又另当别论, 但那样的话你需要一本 C 的入门教材.

我仍然认为有
return(next);
那一句的程序不可能通过 Turbo C 的编译.至于结果是不是和设想的一样, 那是下一步的事情.

关于
#define NULL 0
的问题, 我再说最后一遍: 如果要写标准 C, 要么把这句删掉, 要么象我那样写成三句 (当然有别的修改办法, 但是只写那么一句是不行的). 你要是愿意自己看系统的头文件是怎么定义的, 我不拦着你.

顺便说一句, Linux 里没有 STDIO.H, 只有 stdio.h. Linux 和 C 都是对大小写敏感的.
 楼主| 发表于 2002-11-2 14:33:51 | 显示全部楼层
now ,i check the C ,and correct it!
and can be complied ,and can run
but  there is anthouer problem!


input records:
99103,99
99105,87
0

Now,These 2 records are:
99103,99.000000
99105,87.000000

input the deleted number:99103
delete:99103

Now,These 1 records are:
99105,87.000000
input the deleted number:0

input the inserted record:99107,77

Now,These 2 records are:
input the inserted record:99111,11

Segmentation fault


AND that ,the stdio.h must't be need! i cut it ,and alse can be complied!

"Segmentation fault"    this is about what!!!???

i can't find the wrong in the pro.!
 楼主| 发表于 2002-11-2 14:44:40 | 显示全部楼层
i have learnd C ,but is not good at,it's freshman !

especial in 数据结构,i find it's hard to learn,and i must learn myself,but i will word hard!   and will need more help from you ,and from other goodman!
and thank you for help!
my QQ 12849923,it's plesure to make friend with you!

and i want to dicuss about C,and linux, with you!
发表于 2002-11-2 15:04:05 | 显示全部楼层
> AND that ,the stdio.h must't be need! i cut it ,and alse can be complied!

如果是和下面这一段一起编译通过的, 我不相信:

  1. main()
  2. {
  3.     struct student *head,*stu;
  4.     long del_num;
  5.     printf("input records:\n");
  6.     head=creat();
  7.     print(head);
  8.     printf("\ninput the deleted number:");
  9.     scanf("%ld",&del_num);
  10.     while(del_num != 0)
  11.     {
  12.         head=del(head,del_num);
  13.         print(head);
  14.         printf("input the deleted number:");
  15.         scanf("%ld",&del_num);
  16.     }
  17.     printf("\ninput the inserted record:");
  18.     stu=(struct student *)malloc(LEN);
  19.     scanf("%ld,%f",&stu->num,&stu->score);
  20.     while(stu->num != 0)
  21.     {
  22.         head=insert(head,stu);
  23.         print(head);
  24.         printf("input the inserted record:");
  25.         stu=(struct student *)malloc(LEN);
  26.         scanf("%ld,%f",&stu->num,&stu->score);
  27.     }
  28. }
复制代码

还是那句话, 说在什么地方编译通过的, Show me.

Segmentation fault 一般是由于非法的内存引用引起的. 你这个程序出现 segfault, 我一点都不奇怪.

我不用 QQ, 而且我认为任何和 Linux 有感情的人都不应该用这样一个丑恶公司的产品. 有什么问题你就发在版上, 只要不是太无理, 我会尽量回答.

最后提个建议, 所有写的程序, 先用
gcc -ansi -pedantic -Wall -c program.c
编译通过了 (去掉所有警告, 至少知道它们警告的是什么), 再去执行调试. 当然, 采纳与否, 是你的自由.
 楼主| 发表于 2002-11-2 16:08:13 | 显示全部楼层
it's complied in Mandrake linux,gcc 3.2
i alaways in the Mandrake .

代码 for now,i correct in my opinion and some of you advise,:

#include <stdio.h>
/*#define NULL 0*/
#define LEN sizeof(struct student)
struct student
{ long num;
  float score;
  struct student *next;
};
int n;


struct student *creat(void)
{ struct student *head;
  struct student *p1,*p2;
  n=0;
  p1=p2=(struct student *)malloc(LEN);
  scanf("%ld,%f",&p1->num,&p1->score);
  head=NULL;
  while(p1->num !=0)
     {n=n+1;
      if(n==1)head=p1;
      else p2->next=p1;
      p2=p1;
      p1=(struct student *)malloc(LEN);
      scanf("%ld,%f",&p1->num,&p1->score);
     }
  p2->next=NULL;
  return(head);
}



void print(struct student *head)
{struct student *p;
printf("\nNow,These %d records are:\n",n);
p=head;
if(head != NULL)
   do
    {printf("%ld,%f\n",p->num,p->score);
     p=p->next;
    }while(p != NULL);
}



struct student * del(struct student *head,long num)
{ struct student *p1,*p2;
  if(head == NULL){printf("\nlist null!\n");return(head);}
  p1=head;
  while(num !=p1->num && p1->next !=NULL)
    {p2=p1;p1=p1->next;}
    if(num == p1->num)
      {if(p1 == head)head=p1->next;
       else p2->next=p1->next;
       printf("delete:%ld\n",num);
       n=n-1;
      }
    else printf("%ld not been found! \n",num);
    return(head);
}



struct student * insert(struct student *head,struct student *stud)
  { struct student *p0,*p1,*p2;
    p1=head;
    p0=stud;
    if(head = NULL)
      {head=p0;p0->next=NULL;}
    else
      {while(((p0->num)>(p1->num)) && (p1->next != NULL))
          {p2=p1;
           p1=p1->next;}
      if((p0->num)<(p1->num))
        {if(head == p1)head=p0;
         else p2->next=p0;
         p0->next=p1;}
      else{p1->next=p0;p0->next=NULL;}}
    n=n+1;
    return(head);
  }



main()
{ struct student *head,*stu;
  long del_num;
  printf("input records:\n");
  head=creat();
  print(head);
  printf("\ninput the deleted number:");
  scanf("%ld",&del_num);
  while(del_num != 0)
      {head=del(head,del_num);
       print(head);
       printf("input the deleted number:");
       scanf("%ld",&del_num);}
  printf("\ninput the inserted record:");
  stu=(struct student * )malloc(LEN);
  scanf("%ld,%f",&stu->num,&stu->score);
  while(stu->num != 0)
      {head=insert(head,stu);
       print(head);
       printf("input the inserted record:");
       stu=(struct student * )malloc(LEN);
       scanf("%ld,%f",&stu->num,&stu->score);
      }

}

AND WHEN I  "gcc -o lianbiao lianbiao.c"
IT'S ALL RIGHT!

but WHEN
[smallmantou@Smallmantou linuxC]$ ./lianbiao
input records:
99101,99
99103,87
99105,77
0

Now,These 3 records are:
99101,99.000000
99103,87.000000
99105,77.000000

input the deleted number:99103
delete:99103

Now,These 2 records are:
99101,99.000000
99105,77.000000
input the deleted number:0

input the inserted record:99111,66

Now,These 3 records are:
input the inserted record:99112,12
Segmentation fault

WHY??
Segmentation fault  ,WHY ,THERE IS IT?

i have check for long time,help me correct it!
 楼主| 发表于 2002-11-2 16:20:02 | 显示全部楼层
I HAVE DONE THAT
gcc -ansi -pedantic -Wall -c program.c
:

[smallmantou@Smallmantou linuxC]$ gcc -ansi -pedantic -Wall -c lianbiao.c
lianbiao.c: In function `creat':
lianbiao.c:16: warning: implicit declaration of function `malloc'
lianbiao.c: In function `insert':
lianbiao.c:68: warning: suggest parentheses around assignment used as truth value
lianbiao.c: At top level:
lianbiao.c:86: warning: return type defaults to `int'
lianbiao.c: In function `main':
lianbiao.c:109: warning: control reaches end of non-void function
 楼主| 发表于 2002-11-2 16:51:07 | 显示全部楼层
after i have look for details in book,and think of it for long time

i find that , should do that:

here:  main()     ->   should be   int main(),  so that ,you should    add
"  return 0;  "  before the  " } " in the fuciton of  "main()"


2.  here:  when use the " malloc(LEN)"    you should declaration the malloc()   for "  void malloc(unsigned int size) "


do this ,when use "gcc -ansi -pedantic -Wall -c lianbiao.c"

there only the  "lianbiao.c: In function `insert':
lianbiao.c:70: warning: suggest parentheses around assignment used as truth value"

this is not big problem,it's suggested to use the truth value!!!


i wish it may help some pople use the GCC in linux for C pro.


at last ,thank you 高原之狼
 楼主| 发表于 2002-11-2 18:46:29 | 显示全部楼层
upload a bit information of GCC ,maybe it's helpful!
随 Slackware Linux 发行的 GNU C 编译器(GCC)是一个全功能的 ANSI C 兼容编译器. 如果你熟悉其他操作系统或硬件平台上的一种 C 编译器, 你将能很快地掌握 GCC. 本节将介绍如何使用 GCC 和一些 GCC 编译器最常用的选项.

使用 GCC

    通常后跟一些选项和文件名来使用 GCC 编译器. gcc 命令的基本用法如下:

gcc [options] [filenames]

    命令行选项指定的操作将在命令行上每个给出的文件上执行. 下一小节将叙述一些你会最常用到的选项.

GCC 选项

    GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的 GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数 Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的:

gcc -p -g test.c

gcc -pg test.c

    第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息.

    当你不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件. 例如, 下面的命令将在当前目录下产生一个叫 a.out 的文件:

gcc test.c

    你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令:

gcc -o count count.c

注意: 当你使用 -o 选项时, -o 后面必须跟一个文件名.

    GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉 GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理. 缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名.

    -S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.
优 化 选 项

    当你用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化. 有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和 -O2 选项.

    -O 选项告诉 GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用 -O 时慢. 但通常产生的代码执行速度会更快.

    除了 -O 和 -O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用. 这些选项的详细描述, 请参考 GCC 的指南页, 在命令行上键入 man gcc .
调试和剖析选项

    GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是 -g 和 -pg 选项.
    -g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使 -g 和 -O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被 GCC 作了改动. 关于调试 C 程序的更多信息请看下一节"用 gdb 调试 C 程序"  .
    -pg 选项告诉 GCC 在你的程序里加入额外的代码, 执行时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况. 关于 gprof 的更多信息请参考 "gprof" 一节.
发表于 2002-11-3 03:40:33 | 显示全部楼层
main() -> should be int main(), so that ,you should add " return 0; " before the " } " in the fuciton of "main()"
我一直都在建议你这么做.

when use the " malloc(LEN)" you should declaration the malloc() for " void malloc(unsigned int size) "
这样声明是不对的, 正确的办法是包含标准头文件 stdlib.h. 嫌它太大的话, 应声明为
void *malloc(size_t len);

我就奇怪, 你这样改了之后编译过没有? 你明不明白返回值的概念?

this is not big problem,it's suggested to use the truth value!!!
没什么大问题? 你 segfault 的原因就在这里!
 楼主| 发表于 2002-11-3 07:48:52 | 显示全部楼层
我一直都要感谢 高原之狼 对我和大家的耐心的帮助!
因为我是个菜鸟,所以有很多地方不是很懂,说实话,我现在还是照本宣书,所以我一直多练,这样才能发现更多的问题!
我很乐意接受 高原之狼 的教导! 谢谢!

虽然看了书,但是,没有任何经验,很多实质的东西,很难理解,多亏 高原之狼 帮我指出了错误,不然我一直要原地打转了!

this is not big problem,it's suggested to use the truth value!!!

不过这个,我不是很懂这里返回值的问题!看书还稍微好一点,但是,具体用的时候我就不行了,没有经验!
还有就是在函数调用的时候,建立了一个fuction 但是,在main()中调用的时候,我很头大,我知道,如果定义的fuction在main()前面的时候,可以不声明,但是在main()后面一定要声明,但是调用的过程,我就没有经验,应该注意那些东西?
例如:
#define N 5
struct student
{char num[6];
char name[8];
int score[4];
}stu[N];

input(struct student stu[])
{int i,j;
for(i=0;i<N;i++)
    {printf("input scores of student %d:\n",i++);
     printf("NO.\n");
     scanf("%s",stu.num);
     printf("name:");
     scanf("%s",stu.name);
     for(j=0;j<3;j++)
        {printf("score %d:",j++);
         scanf("%d",&stu.score[j]);
        }
     printf("\n");
   }
}


对于这个函数的调用的时候,在main()函数中,可以不用声明,是不是这样?
调用的时候,形参和实参要数据类型是一样的,这里input(struct student stu[])  这里应该是 结构体类型了,这里stu[]是和变量相当的吧?
这样的话,那么就应该是怎么样来调用呢?我写的是,
main()
{struct student *head;
head=input();
}
我只能想到这些,好像是错的!  我真的好头大!
对于函数调用,还望 高原之狼 兄,多多指教,thankyou !
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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