• volcanol的工控博客


       发现Delphi中关于函数参数部分的内容还是比较多的,暂时说到这篇随笔为止吧,以后再继续讨论一下函数的参数部分的内容。

    一 工程文件

    program DefaultParameter;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      Unit1 in 'unit1.pas';
    
    var
        nVar:integer;
        strVar:string;
        i:integer;
        nVarArray:array of integer;
    begin
        {
        1、 调用具有默认参数的方法
        }
        //不提供参数
        unit1.defaultParameter(10);
        //提供参数
        unit1.defaultParameter(10,'volcanol');
    
        //调用无类型参数的函数
        {
        1、constant object cannot be passed as var paramter
        }
        //WriteLn(noTypeParameter('100'));  //这样无法调用
        nVar := 100;
        WriteLn(noTypeParameter(nVar));
    
        //转换时出现了异常,因此不建议使用无类型参数
        strVar:= '100';
        WriteLn(noTypeParameter(strVar));
    
        //调用短字符串类型参数的函数
        for i := 0 to sizeof(ShortString)  do
        begin
             strVar[i]:='a';
        end;
        shortSringParameter(strVar);
    
        //如果将 string类型的变量传递给 shortString 类型变量会自动截断
        for i := 0 to sizeof(ShortString) + 128 do
        begin
             strVar[i]:= 'a';
        end;
        shortSringParameter(strVar);
    
        //动态数组参数
        try
            SetLength(nVarArray,10);
            WriteLn(Low(nVarArray));
            WriteLn(High(nVarArray));
            for i := Low(nVarArray) to High(nVarArray)  do
            begin
                nVarArray[i] := i;
            end;
            WriteLn(High(nVarArray));
            arrayParameter(nVarArray);
        except
            on E:Exception do
                ReadLn;
        end;
    
    
        ReadLn;
        ReadLn;
    end.

    二、单元文件

    {       参数
    1、默认参数
    2、无类型参数
    3、短字符串参数
    4、数组参数
    }
    
    {
    1、 和其他的OOP编程语言一样,Delphi的Object Pascal语言也支持方法和函数的
        默认参数机制
    2、 默认参数在某些场合非常适用,当一些方法、函数的参数在不同的场合调用时
        均具有同样的设置时,就可以设置为默认参数
    3、 如何函数参数设置过默认参数,那么在调用的时候就可以不提供实际参数
    }
    
    unit Unit1;
    
    
    
    interface
    {
        单元文件的结构需要注意
    }
    uses
        SysUtils;
    
    {
        单元文件中, type类型定义必须在 uses 子句后面
    }
    type
        PInt=^integer;
    
    {       默认参数
    1、默认参数的定义的规则与C++里面默认参数的规则类似
    2、默认参数定义的形式参数必须从最后一个参数开始,及从右往左定义
    3、如果一个参数定义了默认参数,则其后面的参数均需要定义默认参数
    4、如果在一个类型中定义了多个形式参数,则这些形式参数均不能定义默认参数
    5、
    }
    procedure defaultParameter(nVar:integer;varStr:string='Delphi');
    
    {       无类型参数
    1、无类型参数就是例程声明时形式参数不指定形式参数的类型
    2、无类型参数定义时必须用关键字var、const、out之中的一个
    3、无类型参数不能使默认的传值方式
    4、在使用无类型参数时,必须将参数进行类型转换后才能使用
    5、调用时需要注意存在一些限制
       A) 整型字面值不能传递给无类型参数
       B) 无类型的整型值不能传递给无类型参数
    6、由于无类型参数在转换的时候存在太多的限制,建议一般不要使用这种类型的定义
        方法
    }
    function noTypeParameter(var noTypeVar):string;
    
    
    {       短字符串参数
    1、 短字符串类型 ShortString 是255字节长度的字符串类型
    2、 可以通过 string[length] 的方法定义指定长度小于255字节的字符串类型
        varStr:string[255]; 就是定义一个长度最大为255字节的字符串变量
    3、 形式参数不能用 string[length] 的方式定义 ,如果需要的话就必须定义新的
        数据类型
    3、 2010以后 string默认为WideString, 需要打开开关才能使 AnsiString类型
    }
    procedure shortSringParameter(strVar:ShortString);
    
    
    {       数组参数
    1、数组分为静态数组、动态数组,还有一种数组类型 开发数组
    2、静态数组定义为
            nVarArray:array[1..10] of integer; //在定义的时候自定数组维度
    3、动态数组定义为
            定义动态数组类型
            nVarArray:array of integer;  //定义时不指定数组的维度,
        使用前用 SetLength(数组名,第一维的长度,第二维的长度,) 函数申请
        数组空间。
    3、数组参数在定义时不能指定数组的维度和大小,要使用指定类型的参数,则必须定义
       新的数据类型
    4、还可以使用开放数组形式定义数组参数
    }
    procedure arrayParameter(nVarArray:array of integer);
    
    
    implementation
    procedure defaultParameter(nVar:integer;varStr:string='Delphi');
    var
        str:string;
    begin
        str := 'Hello ' + varStr;
        WriteLn(str);
    end;
    
    function noTypeParameter(var noTypeVar):string;
    var
        str:string;
    begin
        //将 noTypeVar 无类型参数转换为整型数
        str:= IntToStr(integer(noTypeVar));
    
        //隐含的变量 result 返回函数值
        result := str;
    end;
    
    
    
    procedure shortSringParameter(strVar:ShortString);
    begin
        WriteLn(strVar);
    end;
    
    {
    1、下面的函数执行的过程中还存在一定的问题,需要继续研究一下
    2、动态数组的上、下界最好通过Low()、High()函数来求取,所以与 C/C++ 有一点区别
    }
    procedure arrayParameter(nVarArray:array of integer);
    var
        i:integer;
    begin
        WriteLn(Low(nVarArray));
        WriteLn(High(nVarArray));
    
        for i := Low(nVarArray) to High(nVarArray) do
        begin
            //WriteLn(IntToStr(nVarArray[i])); //这样编译就会出错,原因??
            WriteLn(nVarArray[i])  ;
        end;
    end;
    
    end.

      欢迎转载本系列文章,转载请注明来源。

  • 相关阅读:
    #啃underscore源码 一、root对象初始化部分
    LeetCode 7. Reverse Integer (JS)
    LeetCode 1.两数之和(JS)
    【安利】前端基础学习资源
    如何防止XSS攻击?
    浅谈CSRF攻击方式
    node中__dirname、__filename、process.cwd()、process.chdir()表示的路径
    解决Error: ENOENT: no such file or directory, scandir 'xxx ode-sassvendor'
    jquery中attr和prop的区别
    git stash 命令
  • 原文地址:https://www.cnblogs.com/volcanol/p/5373006.html
Copyright © 2020-2023  润新知