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

测试代码如下:

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

此代码在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\n",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\n",(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.. \n");
}

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.. \n");
}
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("\n**********************************\n");
//第二种调用,注意结果
Alg_process(Handle);//Handle
Alg_control(Handle);
//free(Handle);
return 0;

}

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

  1. C语言:使用结构体和指针函数实现面向对象思想(OO编程)

    原文:https://www.linuxidc.com/Linux/2016-12/138789.htm 有关:<C语言:过年回家 发现只有我没有对象> 一.基础研究 观察如下两个程序a. ...

  2. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

  3. 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!

    前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...

  4. swift 的枚举、结构体、类

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  5. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

  6. iOS学习笔记44-Swift(四)枚举和结构体

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  7. Swift结构体与类

    在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...

  8. Java基础--面向对象编程1(类与对象)

    1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...

  9. Go第六篇之结构体剖析

    Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...

随机推荐

  1. [转]Windows 7自带很好用的磁盘检查与修复的环境

    大家可能都知道Windows 7自带很好用的检查与修复的环境.在启动系统前按F8(就是进入安全模式的方法),Windows 7会有一个修复计算机的选项.选择进入,装载一些必要的文件之后,选择语言.登陆 ...

  2. docker 概念初识

    1 docker 优势,一次创建或配置可以在任意时间.任意环境让应用正常的运行. 快速交付和部署,开发人员可以使用镜像快速构建一套标准的开发环境:开发完后测试和运维人员可以直接使用相同的环境来部署代码 ...

  3. Spring中xml文件配置也可以配置容器list、set、map

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. JavaScript:RegExp对象的使用(整理)

    1. RegExp是什么? 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 2. 如何创建RegExp? 2.1 直接量语法 /pattern/attributes 2.2 创建RegExp ...

  5. 外网登陆SAP的两种方式

    1.用SAP router实现从外网登录SAPserver(方式一) 自已搭建的局域网结构例如以下: SAPserverIP: 192.168.0.2, 路由器中设为DMZ区 在SAPserver上启 ...

  6. c# 获取当前程序运行根目录

    //获取绝对路径,调用如 string fileName = string.Format("~/RuleConfigFiles/Campaign_{0}.JSON", Campai ...

  7. CocoaPods did not set the base configuration of your project 问题解决方式

    今天在使用pod install的时候.出现了 [!] CocoaPods did not set the base configuration of your project because you ...

  8. ny168 房间安排

    房间安排 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中 ...

  9. centos 中 修复 win 7 引导

    1. 我们可以清楚的看到 /boot/grub2/grub.cfg里面的话,里面说到:不要编辑这个文件,这个文件是由grub2-mkconfig 自动产生的(当然你也可以手动),修改这个文件虽然可以达 ...

  10. SQL Server,MySQL,Oracle三者的区别

    SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...