向自定义函数传数组

用y_tab实现的C语言解释程序中,用一个规定了名字的“output”数组,在所有自定义函数中共享同一个数组的数据。这一定程度上缓解了函数之间传递数组的需求。但是如果遇到函数之间需要传2个数组的时候,就无能为力了。

现在探讨下如何在函数间传数组的机制。当然属于可行性研究,方案还没有最后敲定。出现差错,或者不严谨,还请读者谅解。

首先是语法。语法上允许用一个“数组头”表示形参,编译时计入函数数组表。即,
func my(a[])
{ …
}
形参a[]以名字“a”加入函数my本地数组表。
调用时也是用一个“数组头”代表实参,并配置运行时获得实际数组地址的代码。函数编译时,只有形式地址,只有运行时才会分配实际地址。

其次,增加这个项目后,函数参数就有类型差异了。需要引入参数类型检查。拟用一个参数类型表数组来记录参数类型。即,在funxat中增加一个int paratype[]的表,如果值为0代表普通参数。大于0代表参数(形参)为数组,保存此数组在函数本地数组表中的索引。因为索引0预分配给了output数组,所以这个值不会是0。编译调用这个函数的代码时,换成实参,生成调用函数的NT_INITV“数组头”节点,并在里面存放调用函数的数组表中对应数组的索引。

并且用被调函数的paratype[]表进行参数匹配检查。编译时实际运行时都要检查。这是为了防止被调函数后来被重写。编译时参数不匹配则编译失败。如果运行时参数不匹配,抛出异常结束运行。

其次,是运行时索引的转换。如果运行时参数的节点是NT_INITVS,并且被调函数f的paratype是数组,那么
ai_input = (int)node->left;
f->abp[paratype[i]]= stk->e[top].func->abp[ai_input];
被调函数形参地址用调用函数的实际地址来绑定。

最后,是一些运行时内存分配问题。funxat增加一个abplocal变量。跳过output数组和参数数组,记录函数本地局部数组的起始位置。如果函数的数组大于这个值,运行时需要分配局部数组,并且运行完成时,跳过output数组和参数数组,释放它们。

这样应当可以向自定义函数传数组了。

func adup(a[], b[], n)
{
for(i=0; i<n; i++) {
a[i]=b[i];
}
}

b[]= {1,2,3,4,5,6,7};
adup(a[], b[], 7);
for(i=0; i<7; i++) print a[i];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值