【zz】将成员函数指针强制转换成void指针

本文详细介绍了如何使用成员函数指针及其转换技术,通过将成员函数指针强制转换为不同类型的指针,从而实现对类中成员函数的灵活调用。通过实例演示了获取成员函数地址的方法,并验证了转换后的指针的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned*,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void*的问题也随之可解,如下示例:

 

/* VS2003下编译运行 */

class AbstractMethod

{

public:

 virtual void show(){}  // = 0;  // 可以是纯虚函数,这里为了测试方便不使用纯虚函数!

 void fun()

 {

  cout << "I was called!" << endl;

 }

 

 void fun1()

 {

  cout << "I was called!" << endl;

 }

};

 

int main()

{

 // 定义成员函数指针类型

 typedef void (AbstractMethod::*MFP)(void);

 

 // 转化函数指针为别的指针

 MFP mfp1 = &AbstractMethod::show;  

 unsigned* tmp =  (unsigned*)&mfp1;

 cout << hex << *tmp << endl;

 

 MFP mfp2 = &AbstractMethod::fun;

 tmp = (unsigned*)&mfp2;

 cout << hex << *tmp << endl;

 

 MFP mfp3 = &AbstractMethod::fun1;

 tmp = (unsigned*)&mfp3;

 cout << hex << *tmp << endl;

 

 // 通过转化后的指针调用成员函数

 AbstractMethod am;

 MFP* addr = (MFP*)tmp;

 (am.*mfp3)();

 (am.*(*addr))();

 

 return 0;

}

 

    验证上述方法取得的成员函数地址是否正确:

    1. 在调试是查看临时变量函数指针的值和输出的是否一样。

    2. 可以根据调试时的反汇编进行结果验证。

    3. 最好的办法就是如上例子通过转化后的指针来调用成员函数。

 

补全代码 先来先服务进程调度算法 运行环境: Dev c++ 算法思想:  先来先服务进程 (FCFS)调度算法则是从当前就绪队列中选出一个最先来的进程,将处理机分配给它,使它立即执行并一直执行到完成 核心数据结构: typedef struct data{ int hour; int min; }time; typedef struct node{ int id;//编号 char name[20];//名字 time arrive;//到达间 int zx;//执行间; time start;//开始间 time finish;//完成间 int zz;//周转间=执行完成间-到达就绪队列间 double zzxs;//带权周转间=周转间/执行间 struct node* next; }linknode; typedef linknode* linklist; typedef struct{ linklist front; linklist rear; }queue; //队列 程序主体框架: //函数名:init 参数:无 queue* init(){ //函数功能:初始化队列,返回队列指针 } //函数名:insert 参数:Queue *cc, node *x void enqueue(queue* cc,linklist s){ //函数功能:尾插入队 } //函数名:dele 参数:Queue *cc void dequeue (queue* cc){ //功能:队首结点出队 } //函数名:input 参数:Queue *cc void input(queue* cc){ //功能:实现作业队列的输入 } //函数名:sort参数:Queue *cc void sort(queue* cc){ //函数功能:对到达间进行排序 } //函数名:solve_FCFS参数:Queue *cc void solve_FCFS(queue* cc){ //函数功能:实现先来先服务调度算法 } int main() { while(true) { int op; printf("请输入操作(1:开始进程调度;0:结束进程)"); scanf("%d",&op); if(op==0) break; queue *cc; linklist ll; cc = init(cc); input(cc); ll=sort(cc); enqueuer(cc,ll) solve_FCFS(cc); } return 0; } 测试用例1: 5001 p1 9:40 20 5004 p4 10:10 10 5005 p5 10:05 30 5002 p2 9:55 15 5003 p3 9:45 25 测试用例2: 5001 p1 19:40 20 5002 p4 10:10 10 5003 p5 10:05 30 5004 p2 9:55 15 5005 p3 9:45 25 5006 p6 11:40 20 5007 p8 12:10 10 5008 p9 13:05 30 5009 p10 19:55 15 5010 p7 7:15 15
最新发布
04-03
<think>嗯,用户想寻求关于先来先服务(FCFS)进程调度算法的完整代码实现和调试方法。根据他们提供的引用内容,特别是引用[3]中提到有部分代码框架,但需要补全。首先,我需要回忆FCFS的基本原理,确保代码结构符合算法要求。 先来先服务算法是按照进程到达间进行排序,先到达的进程先执行。所以关键步骤应该是初始化队列、插入节点按到达间排序,然后依次执行。用户提到的初始化队列、插入节点、排序和调度逻辑都是需要实现的部分。 接下来,我需要看看用户提供的引用中的代码框架。引用[3]提到有部分代码,可能缺少队列初始化、节点插入和排序的部分。需要设计一个进程结构体,包含进程ID、到达间、执行间等信息。然后,插入节点,应该将新进程按到达间插入到队列的正确位置,保持队列有序。 排序部分可能在插入就已经完成,所以插入函数需要遍历队列找到合适的位置。调度逻辑则是依次执行队列中的进程,计算开始间、完成间、周转间和带权周转间。这部分需要循环处理每个进程,更新当前间,并记录各个间参数。 调试方面,可能需要构造不同测试用例,比如进程到达顺序乱序的情况,确保排序正确。还有处理同到达的进程,或者进程执行间不同的情况。需要验证每个进程的执行顺序是否符合FCFS的原则,即按到达间先后执行。 此外,用户提供的引用中有间片轮转和HRRN的算法,但这里只需要关注FCFS。需要确保代码中没有混入其他算法的逻辑,比如动态优先级的计算,这在FCFS中是不需要的。 最后,代码的可读性和注释也很重要,用户要求有详细说明和注释,所以每个函数和关键变量都需要解释清楚。例如,进程队列的数据结构,如何维护队列的顺序,以及调度过程中各个间参数的计算方法。 总结下来,步骤应该是:定义进程结构,初始化队列,插入节点按到达间排序,执行调度遍历队列,计算各项间指标。调试用多种测试用例验证正确性。</think>### 分步实现 FCFS 进程调度算法 #### 一、关键数据结构设计 ```python class Process: def __init__(self, pid, arrive_time, burst_time): self.pid = pid # 进程ID self.arrive_time = arrive_time # 到达间 self.burst_time = burst_time # 执行间 self.start_time = -1 # 开始间 self.finish_time = -1 # 完成间 self.tat = -1 # 周转间 self.wt = -1 # 带权周转间 queue = [] # 就绪队列(按到达间排序) current_time = 0 # 当前系统间 ``` #### 二、核心函数实现 ```python def insert_process(process): """插入进程到正确位置(维护到达间升序)""" for i in range(len(queue)): if process.arrive_time < queue[i].arrive_time: queue.insert(i, process) return queue.append(process) def schedule(): """调度执行主逻辑""" global current_time for p in queue: # 等待进程到达 if current_time < p.arrive_time: current_time = p.arrive_time # 设置进程开始间 p.start_time = current_time # 执行进程 p.finish_time = p.start_time + p.burst_time # 计算指标 p.tat = p.finish_time - p.arrive_time p.wt = p.tat / p.burst_time # 更新间线 current_time = p.finish_time print(f"进程{p.pid} 开始:{p.start_time} 完成:{p.finish_time} 周转:{p.tat} 带权周转:{p.wt:.2f}") ``` #### 三、完整代码示例 ```python class Process: def __init__(self, pid, arrive, burst): self.pid = pid self.arrive_time = arrive self.burst_time = burst self.start_time = -1 self.finish_time = -1 self.tat = -1 self.wt = -1 queue = [] current_time = 0 def insert_process(process): # 按到达间插入排序(FCFS核心) index = 0 while index < len(queue): if process.arrive_time < queue[index].arrive_time: break index += 1 queue.insert(index, process) def schedule_fcfs(): global current_time for proc in queue: if current_time < proc.arrive_time: current_time = proc.arrive_time proc.start_time = current_time proc.finish_time = current_time + proc.burst_time proc.tat = proc.finish_time - proc.arrive_time proc.wt = proc.tat / proc.burst_time current_time = proc.finish_time print(f"执行进程{proc.pid}: 到达{proc.arrive_time} 执行{proc.burst_time} 周转{proc.tat} 带权{proc.wt:.2f}") # 测试用例 if __name__ == "__main__": processes = [ Process("P1", 0, 5), Process("P2", 2, 3), Process("P3", 4, 2) ] for p in processes: insert_process(p) schedule_fcfs() ``` #### 四、调试方法 1. **验证队列排序**:在插入进程后打印队列顺序 ```python print([p.pid for p in queue]) # 应输出 ['P1', 'P2', 'P3'] ``` 2. **边界测试**: - 测试到达的进程(按PID顺序执行) - 测试长进程后到达短进程的情况 3. **指标验证**: ```text 预期输出: 执行进程P1: 到达0 执行5 周转5 带权1.00 执行进程P2: 到达2 执行3 周转6 带权2.00 执行进程P3: 到达4 执行2 周转8 带权4.00 ``` #### 五、算法特征 - **非抢占式**:进程开始后必须执行完成[^3] - **公平性**:严格按照到达间排序[^2] - **饥饿问题**:长进程可能阻塞后续短进程[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值