加入自定义函数共享output数组功能

y_tab解释程序中,虽然有了用户自定义函数的功能,能够按照值传递规则传递参数,但是仍然不能传递引用。传递引用比较复杂,并且最终会在细粒度上对变量引用的解释产生影响。y_tab不打算实现这个功能。但是可以增加一个全局的,名字叫output的特殊数组,让每个用户自定义函数自动拥有这个数组,从而获得函数之间共享全局数据的功能。

这只要在初始化时,在全局和局部符号表中插入一个名叫output的数组,并且从不清除它。

struct abpvector {VALUE_TYPE *vector;VALUE_TYPE **abp;
} output;
...
void init_whatever()
{int i;int k;for(k=0; k<2; k++) {memset(&symtab_compile[k],0,sizeof(struct symtab));memset(&funxat_compile[k],0,sizeof(struct funxat));for(i=0; i<MAXARRAY; i++) {symtab_compile[k].avartab[i] =symtab_compile[k].array[i];}strcpy(symtab_compile[k].arraytab[0].name,"output");symtab_compile[k].arraycount=1;funxat_compile[k].avars=1;symtab_compile[k].used_const0=0;funxat_compile[k].strtab = symtab_compile[k].strtab;funxat_compile[k].consttab = symtab_compile[k].consttab;funxat_compile[k].labeltab = symtab_compile[k].gototab;funxat_compile[k].consttab[0].type = 0;funxat_compile[k].consttab[0].u.value = 1;funxat_compile[k].constcount = 1;funxat_compile[k].labelcount = 0;}tmpnamecount=0;dmc=0;top=0;swc= -1;funxvt_main = &stk->e[0];funxvt_main->func = &funxat_compile[0];funxvt_main->bp = symtab_compile[0].var;funxvt_main->abp = symtab_compile[0].avartab;output.vector = funxvt_main->abp[0];output.abp = &output.vector;
}

上面,strcpy()的这几句,在符号表中增加"output"符号,最后output的2句,给这个数组分配固定空间。

此外,还要在调用用户自定义函数分配空间时,及用户自定义函数返回回收分配空间时,跳过这个output数组。

void alloc_context(struct funxat *f)
{struct funxvt *context;struct segment *seg;int i;++top;if (top >= SEGLEN) {seg = (struct segment *)Malloc(sizeof(struct segment));seg->wrap = stk;stk = seg;top =0;}context = &stk->e[top];context->func = f;if (f->vars) {context->bp = (VALUE_TYPE *)Malloc(sizeof(VALUE_TYPE)*f->vars);memset(context->bp,0, sizeof(VALUE_TYPE)*f->vars);//........ .......... .... ............... ..}else context->bp = NULL;if (f->avars>1) {context->abp = (VALUE_TYPE**)Malloc(sizeof(VALUE_TYPE*) * f->avars);context->abp[0] = output.vector;for(i=1; i<f->avars; i++) {context->abp[i] =(VALUE_TYPE *)Malloc(sizeof(VALUE_TYPE)*MAXCELL);memset(context->abp[i],0,sizeof(VALUE_TYPE)*MAXCELL);}}else context->abp = output.abp;
}
void free_context()
{struct funxvt *context;struct funxat *f;struct segment *seg;int i,j;if (top == 0 && stk->wrap==NULL) {printf("runtime stack corrupt!\n");return;}context = &stk->e[top];f = context->func;
//............. .... ....... .. ......... .........if (context->bp) {for(i=0; i<f->vars; i++) context->bp[i]=dummy_value;free(context->bp);context->bp =NULL;}if (f->avars>1) {for(i=1; i<f->avars; i++) {for(j=0; j<MAXCELL; j++) context->abp[i][j]=dummy_value;free(context->abp[i]);}free(context->abp);context->abp= NULL;}else context->abp= NULL;--top;if (top <0) {seg = stk->wrap;free(stk);stk=seg;top = SEGLEN-1;}
}

当然,在清理符号表时,也跳过这个符号。

ss:| ss ls   { int exception=0;execute_e_ls((struct node*)$2, 0, &exception);free_compile(&funxat_compile[dmc]); }| ss error {error_state=1;} '\n' {if (dmc == DM_FOR_LOCAL) {free_compile(&funxat_compile[dmc]);symtab_compile[dmc].varcount=0;symtab_compile[dmc].arraycount=1;symtab_compile[dmc].used_const0=0;while(swc>=0) popswitch();dmc = DM_FOR_GLOBAL;}free_compile(&funxat_compile[dmc]);error_state = 0;}| ss defs       {free_compile(&funxat_compile[dmc]);symtab_compile[dmc].varcount=0;symtab_compile[dmc].arraycount=1;symtab_compile[dmc].used_const0=0;dmc = DM_FOR_GLOBAL;}
;

现在编译,运行,来试一试快速排序例子:

output[] = {17,13,31, 18, 19, 112, 14, 125, 11,111,7,3,1, 8, 9, 12, 4, 25, 1,21};func patition(left, right)
{key = left;while (left < right){while (left < right && output[right] >= output[key])right--;while (left < right && output[left] <= output[key])left++;x=output[right];output[right]=output[left];output[left]=x;}mid = left;x=output[mid];output[mid]=output[key];output[key]=x;return mid;
}func QuickSort(left, right)
{mid = patition(left,right);if (left < mid - 1) QuickSort(left, mid-1);if (mid + 1 < right) QuickSort(mid+1, right);
}for(i=0; output[i]; i++);
n=i;
QuickSort(0, n-1);
i=0;
while(i<n) print output[i++], "\b";
print "END";

这里在全局,patition()函数,QuickSort()函数之间共享了output[]数组的数据。

运行结果:

saving patition...used func[0].
saving QuickSort...used func[1].
1 1 3 4 7 8 9 11 12 13 14 17 18 19 21 25 31 111 112 125 END

再跑个斐波拉挈查找看看:

func fibfind(k, n)
{prev=1;fn= 1;while(fn <n) {fn+=prev;prev= fn-prev;}
part_nonfib:if (p==n) return -1;while (fn>n-p) {prev=fn-prev;fn-=prev;}p+=fn-1;if(output[p]==k) return p;if(output[p++] <k) goto part_nonfib;p-=fn;while (fn>1) {prev= fn-prev;fn-=prev;p+=fn-1;if (output[p]==k) return p;if (output[p++]>k) {p-=fn;}}if (output[p]==k) return p;return -1;
}	

运行结果:

saving fibfind...used func[2].
n=20;
k=17;
print fibfind(k, n);
11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147675.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【前段基础入门之】=>CSS浮动

浮动的简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 元素浮动后的特点 &#x1f922; 脱离文档流。&#x1f60a; 不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽…

GRACE-FO L2产品的发布说明 - 版本UTCSR RL-06.1产品

数据更新日期&#xff1a;2023-5-11 0&#xff09;此说明取代了所有先前与UTCSR-RL06.1 GRACE-FO Level-2产品相关的旧版本发布说明。 1&#xff09;截止到本发布说明日期的GRACE-FO RL-06.1产品文件列表如下&#xff1a; 2&#xff09;通常情况下&#xff0c;每个日历月有四…

游戏逆向中的 NoClip 手段和安全应对方式

文章目录 墙壁边界寻找碰撞 NoClip 是一种典型的黑客行为&#xff0c;允许你穿过墙壁&#xff0c;所以 NoClip 又可以认为是避免碰撞体积的行为 墙壁边界 游戏中设置了碰撞体作为墙壁边界&#xff0c;是 玩家对象 和墙壁发生了碰撞&#xff0c;而不是 相机 玩家对象有他的 X…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 核心类持久化存储

文章目录 一、持久化存储的方式与路径二、公共模块序列化 / 反序列化异常规定 三、持久化存储数据库数据管理文件数据管理读写规定新增 /删除规定内存中 Message 的规定存储规定代码编写 硬盘数据管理 一、持久化存储的方式与路径 交换机,队列,绑定关系,这些我们使用数据库来管…

警用装备管理系统|智装备DW-S304的主要功能

东识科技&#xff08;DONWIT&#xff09;警用装备管理系统DW-S304是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 在国外很早开始便使用警用装备管理系统对警用装备的管理使用进行…

Explain执行计划字段解释说明---select_type、table、patitions字段说明

1、select_type的类型有哪些 2、select_type的查询类型说明 1、SIMPLE 简单的 select 查询,查询中不包含子查询或者UNION 2、PRIMARY 查询中若包含任何复杂的子部分&#xff0c;最外层查询则被标记为Primary 3、DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生)&…

基于ssm的互联网废品回收/基于web的废品资源利用系统

摘 要 本毕业设计的内容是设计并且实现一个基于SSM框架的互联网废品回收。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。互联网废品回收的功能已基本实现&#xff0c;主要包括用户、回收员、物品分类、回收物品、用户下单…

【Python 基础 2023 最新】第七课 Pandas

【Python 基础 2022 最新】第七课 Pandas 概述Pandas 是什么?Pandas 的应用场景安装 Pandas Pandas 数据结构Series 数组什么是 Series?Series 创建 Series 数组操作数据检索数据修改过滤Series 数组运算总结 什么是 DataFrameDataFrame 创建 DataFrame 操作数据检索筛选数据…

决策树C4.5算法的技术深度剖析、实战解读

目录 一、简介决策树&#xff08;Decision Tree&#xff09;例子&#xff1a; 信息熵&#xff08;Information Entropy&#xff09;与信息增益&#xff08;Information Gain&#xff09;例子&#xff1a; 信息增益比&#xff08;Gain Ratio&#xff09;例子&#xff1a; 二、算…

密码技术 (6) - 证书

一. 前言 前面介绍的公钥密码和数字签名&#xff0c;都无法解决一个问题&#xff0c;那就是判断自己获取的公钥是否期望的&#xff0c;不能确定公钥是否被中间攻击人掉包。所以&#xff0c;证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。 二…

最新反编译小程序教程(支持分包一键反编译),反编译成功率高达99%

最新反编译小程序教程&#xff08;支持分包一键反编译&#xff09;&#xff0c;反编译成功率高达99% 优点&#xff1a; 1.支持多个分包以及主包一次性反编译&#xff1b; 2.使用wxappUnpacker无法进行解析的小程序包&#xff0c;一键反编译解析&#xff08;咱没有发现反编译失败…

使用ExLlamaV2在消费级GPU上运行Llama2 70B

Llama 2模型中最大也是最好的模型有700亿个参数。一个fp16参数的大小为2字节。加载Llama 270b需要140 GB内存(700亿* 2字节)。 只要我们的内存够大&#xff0c;我们就可以在CPU上运行上运行Llama 2 70B。但是CPU的推理速度非常的慢&#xff0c;虽然能够运行&#xff0c;速度我…

正点原子嵌入式linux驱动开发——TF-A移植

经过了之前的学习&#xff0c;除了TF-A的详细启动流程仍待更新&#xff0c;TF-A的使用和其对应的大致启动流程已经进行过了学习。但是当我们实际做产品时&#xff0c;硬件平台肯定会和ST官方的有区别&#xff0c;比如DDR容量会改变&#xff0c;自己的硬件没有使用到官方EVK开发…

[ruby on rails] postgres sql explain 优化

一、查看执行计划 sql User.all.to_sql # 不会实际执行查询 puts ActiveRecord::Base.connection.explain(sql)# 会实际执行查询&#xff0c;再列出计划 User.all.explain# 会实际执行查询&#xff0c;再列出计划 ActiveRecord::Base.connection.execute(EXPLAIN (ANALYZE, V…

EM聚类(下):用EM算法对王者荣耀英雄进行划分

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Vscode 如何创建java项目,并添加包

创建java项目 添加包 先打开这个资源管理器中的javaProject&#xff0c;然后打开这个javaProject&#xff0c;点击里面的Reference Libraries,然后点击加号 选择要添加的包然后进行确认即可

《C和指针》笔记30:函数声明数组参数、数组初始化方式和字符数组的初始化

文章目录 1. 函数声明数组参数2. 数组初始化方式2.1 静态初始化2.2 自动变量初始化 2.2 字符数组的初始化 1. 函数声明数组参数 下面两个函数原型是一样的&#xff1a; int strlen( char *string ); int strlen( char string[] );可以使用任何一种声明&#xff0c;但哪个“更…

小狐狸ChatGPT付费创作系统V2.0.4智能问答小程序,修复一个pc版的bug

狸GPT付费体验系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。 当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;无限多开、免费更新不…

OpenCV实现视频的追踪(meanshift、Camshift)

目录 1&#xff0c;meanshift 1.1 算法流程 1.2 算法实现 1.3 代码实现 1.4 结果展示 1&#xff0c;meanshift 1.1 算法流程 1.2 算法实现 1.3 代码实现 import numpy as np import cv2 as cv# 读取视频 cap cv.VideoCapture(video.mp4)# 检查视频是否成功打开 if n…

使用宝塔部署项目

一、在centos服务器上安装宝塔 1、宝塔官方地址 2、在官网上选择在centos上安装的方式 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec3、复制地址打开宝塔面板 4、登录进去修改登录…