• 用C结构体来实现面向对象编程,ti xDAIS标准算法就这么搞的(1)


    用C结构体来实现面向对象编程,ti xDAIS标准算法就这么搞的。

    测试代码如下:

    [cpp] view plaincopy
     
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <string.h>  
    4.   
    5.   
    6. typedef struct Alg_Obj{  
    7.     struct Alg_Fxn* fxns;  
    8. }Alg_Obj;  
    9.   
    10. typedef Alg_Obj *Alg_Handle;  
    11.   
    12. typedef struct Alg_Fxn{  
    13.     void (*process)(Alg_Handle handle);  
    14.     void (*control)(Alg_Handle handle);  
    15. }Alg_Fxn;  
    16.   
    17. void Alg_process(Alg_Handle handle)  
    18. {  
    19.     handle->fxns->process(handle);  
    20.     printf("in Alg_process..  ");  
    21. }  
    22.   
    23. void Alg_control(Alg_Handle handle)  
    24. {  
    25.     handle->fxns->control(handle);  
    26.     printf("in Alg_control..  ");  
    27. }  
    28.   
    29.   
    30. struct triangle{  
    31.     Alg_Handle handle;  
    32.     int a;  
    33.     int b;  
    34.     int c;  
    35. };  
    36. void tri_process(Alg_Handle handle)  
    37. {  
    38.     struct triangle *t = (struct triangle*)handle;   
    39.     int a = t->a;  
    40.     int b = t->b;  
    41.     int c = t->c;  
    42.     printf("  [in tri_process] sum=%d ",a+b+c);  
    43. }  
    44. void tri_control(Alg_Handle handle)  
    45. {  
    46.     struct triangle *t = (struct triangle*)handle;   
    47.     int a = t->a;  
    48.     int b = t->b;  
    49.     int c = t->c;  
    50.     printf("  [in tri_control] sum=%d ",(a+b+c)*2);  
    51. }  
    52.   
    53. Alg_Fxn gfxns = {  
    54.     tri_process,  
    55.     tri_control,      
    56. };  
    57.   
    58.   
    59. int main()  
    60. {  
    61.     struct triangle *ret = (struct triangle*)malloc(sizeof(struct triangle));  
    62.     ret->handle->fxns=&gfxns;  
    63.     ret->a = 2;  
    64.     ret->b = 3;  
    65.     ret->c = 4;  
    66.       
    67.     Alg_Handle Handle= (Alg_Handle)ret;  
    68.     //第一种调用,注意结果  
    69.     gfxns.process(Handle);  
    70.     gfxns.control(Handle);  
    71.   
    72.     printf(" ********************************** ");  
    73.       
    74.     //第二种调用,注意结果  
    75.     Alg_process(Handle);  
    76.     Alg_control(Handle);  
    77.   
    78.     free(Handle);  
    79.     return 0;  
    80.       
    81. }  
    82. /* 
    83. [root@localhost TestCode]# ./a.out  
    84.   [in tri_process] sum=9 
    85.   [in tri_control] sum=18 
    86.  
    87. ********************************** 
    88.   [in tri_process] sum=9 
    89. in Alg_process..  
    90.   [in tri_control] sum=18 
    91. in Alg_control..  
    92.  
    93. */  

    此代码在ubuntu下运行还是有点问题出现两个类似的段错误,估计是野指针和未分配内存的缘故!

    第一个解决:

    ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));

    第二个:

    我干脆把改了之后的完整代码贴上吧!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    typedef struct Alg_Obj{
    struct Alg_Fxn *fxns;
    }Alg_Obj;

    typedef Alg_Obj *Alg_Handle;


    typedef struct Alg_Fxn{
    void (*process)(Alg_Handle handle);
    void (*control)(Alg_Handle handle);
    }Alg_Fxn;

    struct triangle{
    Alg_Handle handle;
    int a;
    int b;
    int c;
    };
    void tri_process(Alg_Handle handle)
    {
    struct triangle *t = (struct triangle*)handle;
    int a = t->a;
    int b = t->b;
    int c = t->c;
    printf(" [in tri_process] sum=%d ",a+b+c);
    }
    void tri_control(Alg_Handle handle)
    {
    struct triangle *t = (struct triangle*)handle;
    int a = t->a;
    int b = t->b;
    int c = t->c;
    printf(" [in tri_control] sum=%d ",(a+b+c)*2);
    }
    void Alg_process(Alg_Handle handle)
    {
    struct triangle *ret= (struct triangle *)malloc(sizeof(struct triangle));
    ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));
    ret->handle->fxns=(struct Alg_Fxn*)malloc(sizeof(struct Alg_Fxn));
    ret->handle->fxns->process=(Alg_Handle *)malloc(sizeof(Alg_Handle));
    ret->handle->fxns->process=tri_process;
    ret=handle;
    ret->handle->fxns->process(ret);
    printf("in Alg_process.. ");
    }

    void Alg_control(Alg_Handle handle)
    {
    struct triangle *ret= (struct triangle *)malloc(sizeof(struct triangle));
    ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));
    ret->handle->fxns=(struct Alg_Fxn*)malloc(sizeof(struct Alg_Fxn));
    ret->handle->fxns->control=(Alg_Handle *)malloc(sizeof(Alg_Handle));
    ret->handle->fxns->control=tri_control;
    ret->handle->fxns->control(ret);
    //handle->fxns->control(handle);
    printf("in Alg_control.. ");
    }
    Alg_Fxn gfxns = {
    tri_process,
    tri_control,
    };
    int main()
    {
    struct triangle *ret= (struct triangle *)malloc(sizeof(struct triangle));
    ret->a = 2;
    ret->b = 3;
    ret->c = 4;
    ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));
    ret->handle->fxns=&gfxns;
    Alg_Handle Handle= ret;
    //第一种调用,注意结果
    gfxns.process(Handle);
    gfxns.control(Handle);
    printf(" ********************************** ");
    //第二种调用,注意结果
    Alg_process(Handle);//Handle
    Alg_control(Handle);
    //free(Handle);
    return 0;

    }

  • 相关阅读:
    xftp无法用root账号登录问题
    jenkins上gradle打包
    jenkins登录后页面显示为空的问题
    sql 修改oracle数据库中某个字段的部分内容
    redis安装及报错处理
    Centos7 firewall-cmd not found
    ftp connect: No route to host 解决方案
    反向代理负载均衡之Apache
    centos7 openldap双主部署
    apache安装以及报错处理
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/3486600.html
Copyright © 2020-2023  润新知