最近和zm讨论中说到这个问题,之前的代码丢了,现在从自己盘里找了这个div子过程(例子比较典型)改造之:- @echo off
- call:div 31 2003 1000 ans
- echo 31/2003 的前1000位小数为:
- echo %ans%
- pause&goto:eof
-
- :div <dividend> <divisor> <pre> <ret> //code by plp
- Setlocal Enabledelayedexpansion&set/a b=%2,R=%1%%b*10&set "dc="
- For /l %%z In (1 1 %3)Do set/a d=R/b,R=R%%b*10&set dc=!dc!!d!
- endlocal&set %4=%dc%
复制代码 这是典型的call调用,div子过程共4个参数,
第一个参数为被除数,第二个为除数,第三个为小数的位数(精度),第四个为返回的变量名
调用后子过程没有改变父环境变量值,因为有setlocal 和endlocal 。。。
讨论的问题是,如果用变量型函数像call这样“调用”多参数,代码如何写?- @echo off
- :: 定义_div 变量型函数
- rem 代码。。。。。?
-
- %_div% 31 2003 1000 ans
- echo 31/2003 的前1000位小数为:
- echo %ans%
复制代码
- @echo off
-
- :: 定义_div 变量型函数 ;返回两个整数商的小数部分
- :: <dividend> <divisor> <pre> <ret> //code by plp
- Set "_div=setlocal enabledelayedexpansion&set n=&set argv=&for %%a in (1 2)do if defined argv ((for %%b in (^!argv^!)do set/a n+=1&set #^!n^!=%%b)&set/a b=^!#2^!,R=^!#1^!%%b*10&set dc=&(For /l %%z In (1 1 ^!#3^!)Do set/a d=R/b,R=R%%b*10&set dc=^!dc^!^!d^!)&for /f "tokens=1-2" %%A in (^"^^!#4^^! ^^!dc^^!^^")do endlocal&set %%A=%%B)else set argv="
-
-
- %_div% 31 2003 1000 ans
- echo 31/2003 的前1000位小数为:
- echo %ans%
-
- if "%~0"=="%~f0" set/p=
- goto:eof
- ___END___
-
- 思路大致是
- setlocal&set argv=
- for %%a in (1 2)do if defined argv (
- for 获取argv的变量值用#“数组”存放,#1为第一个参数入口,#2为第二个参数入口。。。
- 你的变量型函数在这里展开。。。。
- endlocal&退出并复制结果给返回变量名
- ) else set argv=
复制代码
对于变量型函数多参数的调用,有简单直接的思路(但要写代码者自己维护变量空间)
大家可参看此贴一楼的测试代码
http://www.bathome.net/viewthread.php?tid=11799
新手对变量型函数不太了解的,可参看变量型函数发源贴:
http://www.bathome.net/thread-5861-1-1.html |