C语言函数指针实战之结构体内嵌指针实现分层

本文介绍了如何通过分层编程,利用结构体内嵌指针在framework.c和cal.c文件中实现计算器功能。通过分层,各层次专注于不同任务,上层提供接口,下层负责执行,以理解分层编程的思路和方法。
摘要由CSDN通过智能技术生成

主题:结构体内嵌指针实现分层

        (1)程序为什么要分层?因为复杂程序东西太多一个人搞不定,需要更多人协同工作,于是乎就要分工。要分工先分层,分层之后各个层次由不同的人完成,然后再彼此调用组合共同工作。

        (2) 本程序要完成一个计算器,我们设计了2个层次:上层是framework.c,实现应用程序框架;下层是cal.c,实现计算器。实际工作时cal.c是直接完成工作的,但是cal.c中的关键部分是调用的framework.c中的函数来完成的。

         (3)先写framework.c,由一个人来完成。这个人在framework.c中需要完成计算器的业务逻辑,并且把相应的接口写在对应的头文件中发出来,将来别的层次的人使用这个头文件来协同工作。

cal.h

#ifndef __CAL_H__
#define __CAL_H__


typedef int (*pfunc) (int,int);        //重命名函数指针


//结构体是用来做计算器的,计算器工作时需要原材料
struct cal_t                    
{

    int a;
    int b;
    pfunc p1;


};


//函数声明
int calculator(const struct cal_t *p);



#endif

 framework.c

#include  "cal.h"



//framework.c中应该写实际业务代码





//计算器函数
int calculator(const struct cal_t *p)
{


  return  p->p1(p->a,p->b);        //返回 用函数指针调用执行文件来计算的值



}


        (4)另一个人来完成cal.c,实现具体计算器;这个人需要framework层的工作人员提供头文件来工作(但是不需要framework.c)。

cal.c

#include <stdio.h>
#include "cal.h"

int add(int a, int b)           //+
{




    return a + b;

}


int minus(int a, int b)        // -
{



    return a - b;

}

int ride(int a, int b)          //*
{


    return a * b;

}

int division(int a, int b)      //  /
{


    return a / b;

}


int main(void)
{

    int ret = 0;        
    
    struct cal_t mycal;
    
    mycal.a = 12;    
    mycal.b = 4;
    mycal.p1 = add;

        
    ret = calculator(&mycal);   //调用函数传参进行计算并把返回值给ret         
    
    printf("ret = %d\n",ret);   //输出ret来验证
    

}

        (5)总结:

                                第一:本章与上章函数指针调用执行文件实现的是同一个任务,但是采用了不同的程序架构。

                                第二:对于简单问题来说,上章的不分层反而容易理解,反而简单;本章的分层代码不好理解,看起来有点把简单问题复杂化的意思。原因在于我们这个任务本身确实是个简单的任务,而简单的任务就应该用简单的方法处理。我们为什么明明知道错还要这样做?目的是为了理解这种分层的思路和方法。

                                第三:分层写代码的思路是:有多个层次结合来完成任务,每个层次专注各自不同的领域和任务;不同层次之间用头文件来交互。

                                第四:分层之后上层为下层提供服务,上层写的代码是为了在下层被调用。

                                第五:上层注重业务逻辑,与我们最终的目标直接关联,而没有具体干活的函数。

                                第六:下层注重实际干活的函数,注重为上层提供填充变量,并且将变量传递给上层中的函数(其实就是调用上层提供的接口函数)来完成任务。

                                第七:下层代码中其实核心是一个结构体变量(譬如本例中的struct cal_t),写下层代码的逻辑其实很简单:第一步先定义结构体变量;第二步填充结构体变量;第三步调用上层写好的接口函数,把结构体变量传给他即可。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值