LinuxSir.cn,穿越时空的Linuxsir!

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

错误提示:parse error at end of input

[复制链接]
 楼主| 发表于 2002-11-25 22:42:48 | 显示全部楼层
好了没有 ?
发表于 2002-11-25 22:51:05 | 显示全部楼层
你的程序中的变量没有初始化就把它赋值其它变量,如:
new = (struct proc *)malloc(sizeof (struct proc));/*创建新的结点*/
if(head == NULL)
        head = new;
指针head没有初始化,它怎么会等于NULL,这样就会执行下面的语句:
this = head;
        while(this->next!=NULL)
                this = this->next;
        this->next = new;
但由于同样的原因,this同样成为不知道指向哪儿的野指针,一旦访问非法地址。自然出现segment fault
 楼主| 发表于 2002-11-25 23:36:19 | 显示全部楼层
hao!   head = NULL
但是说 问题出现在  while ( this == NULL );
发表于 2002-11-26 14:31:36 | 显示全部楼层
呵呵,对不起!由于你的程序写法和我平时所见的不太一样,把我给搞糊涂了。
问题还是出在this指针的初始化上:
  1. void sortlist(void) /* 排序根据优先数num  二重 法*/
  2. {
  3. int i,j;
  4. this = head;
  5. for(i=1; i<=8; i++)
  6.         for(j=i+1; j<=8; j++){
  7.                 if(this->num < this->next->num){ /*比较本结点和后一个结点num值的大小 */
  8.                         temp = this;
  9.                         this = this->next;
  10.                         this->next = temp;
  11.                 }
  12.         this = this->next;
  13.         }
  14. }
复制代码

在进入循环之后,当i=1时,进行j=2到8的内循环,这部分运行正常,但内循环结束后,this指针已经到了链队的末尾,再进行i=2的循环时,this->next将指向非法地址,此时出现Segmentation fault。
要改正这个错误,只要在循环中加上一句this=head就行了。
  1. for(i=1; i<=8; i++)
  2.          [color=red]this=head;/*增加此句,保证每次循环开始时this指向链队头部。*/[/color]
  3.         for(j=i+1; j<=8; j++){
  4.                 if(this->num < this->next->num){ /*比较本结点和后一个结点num值的大小 */
  5.                         temp = this;
  6.                         this = this->next;
  7.                         this->next = temp;
  8.                 }
  9.         this = this->next;
  10.         }
复制代码
 楼主| 发表于 2002-11-26 17:15:09 | 显示全部楼层
好了 但是 为什么 运行到: 循环结束时 不停的打印:
new over  ?
发表于 2002-11-26 19:07:02 | 显示全部楼层
程序真的好了吗?在你的程序中有大量的错误,不是一次两次能搞好的。如果不能从根本上解决问题,你只会不断地改正错误,同时又不断地碰到新的错误,陷入这个怪圈而难以自拔,到最后只能是精疲力尽而一无所获!
程序设计步骤应该大体上是这样的:
1.分析问题
2.建立解决问题的模式
3.把解决问题的模式转化为算法
4.把算法转化为语言程序
5.对程序进行编译
6.运行程序及查错
7.对程序进行测试
8.编写程序的方档及说明书
对于学生而言,除了第8个步骤外,前面7个步骤是应该掌握的。要想改正程序设计中的错误,需要从头开始。你先认真讲一下设计这个程序的目的是什么?你是如何分析问题的?
 楼主| 发表于 2002-11-27 00:14:25 | 显示全部楼层
确实如此 , 程序的目的:http://www.linuxsir.cn/bbs/showthread.phps=&threadid=13171
每步的目的 列出来了  在程序中
程序打印几个 new over 就结束了 !
你运行了吗  ! 我想买本好的c 书 介绍一个 好吗  谢谢 !
发表于 2002-11-27 12:08:49 | 显示全部楼层
C语言确实要好好补课。一般计算机方面的书籍普遍推荐用国外的教材,你可以去书店看看,最好是国外大学用的教材。如果你英语水平高,最好直接阅读英文原版教材。
对于你的操作系统作业,除了在程序中有错误之外,你的设计也似乎偏离了题目要求。所以我希望你能好好讲讲你是如何分析问题的。
 楼主| 发表于 2002-11-28 19:52:22 | 显示全部楼层
首先 创建8个结点 每个接点 两个数据: num 表示优先级
next 连接到下一个结点!
sortlist() 排序  每次系统调用 优先级高者 执行:excutable()
就这样简单!
发表于 2002-11-28 22:11:36 | 显示全部楼层
哈哈~~,你可真会开玩笑!题目的意思是让你对进程按优先级大小进行调度,你却只对数组排序就完事了。难道数组有优先级吗?你在对数组按优先级大小进行排序时,进程还没有创建出来,你又怎么能对进程排序?看来你的操作系统课是白学了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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