delphi 7 中数组如何当参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 7 中数组如何当参数相关的知识,希望对你有一定的参考价值。

uses SysUtils;
var a,k,t,i,j:longint;var s:array[1..8] of longint;type tdigits=array[1..8] of longint;function findt(F:tdigits; a, n:longint):boolean;var i:longint; begin
for i:=1 to n do begin if(f[i]=a) then begin findt:=false; break; end;
end; if (i=n) then findt:=true;
end;beginrandomize;k:=1; j:=1; for i:=1 to 8 do begin a:=random(8)+1; K:=k+1; if (k<=2) then begin s[i]:=a; t:=a; end else begin for j:=1 to i-1 do begin if s[j]= a then begin repeat a:=random(8)+1; until(findt(s,a,8)=false); if(findt(s,a,8)=false) then s[i]:=a; end else begin
end; end; if(j=i) then s[i]:=a; end; end; for i:=1 to 8 do write(s[i],' '); readln;end.
为何编译不能通过,而在free pascal 则可以,如何改写?

因为你在函数中传递的数组的形参的类型的是tdigits。但是实参s却不是tdigits而是array[1..8] of longint。固然实参的声明与形参就形式上来说是一致的(都是array[1..8] of longint)。但是在程序中tdigits与实参s的类型却不能被认定为同种类型。所以自然无法通过编译。解决的方法事实上非常简单,只需要将实参s的类型修改为tdigits即可。整理后的代码如下:

uses
  SysUtils;

type
  tdigits = array [1 .. 8] of longint;

var
  a, k, t, i, j: longint; s: tdigits;

function findt(F: tdigits; a, n: longint): boolean;
var
  i: longint;
begin
  for i := 1 to n do
  begin
    if (F[i] = a) then
    begin
      findt := false;
      break;
    end;
  end;
  if (i = n) then
    findt := true;
end;

begin
  randomize;
  k := 1;
  j := 1;
  for i := 1 to 8 do
  begin
    a := random(8) + 1;
    k := k + 1;
    if (k <= 2) then
    begin
      s[i] := a;
      t := a;
    end
    else
    begin
      for j := 1 to i - 1 do
      begin
        if s[j] = a then
        begin
          repeat
            a := random(8) + 1;
          until (findt(s, a, 8) = false);
          if (findt(s, a, 8) = false) then
            s[i] := a;
        end
        else
        begin
        end;
      end;
      if (j = i) then
        s[i] := a;
    end;
  end;
  for i := 1 to 8 do
    write(s[i], ' ');
  readln;

end.

参考技术A 可以设置你的数组为一个枚举型, Type TArr = Array[0..3] of char;
procedure Test(Arr:TArr);
或者用动指针
参考技术B 在函数中如果数组的个数不定,可以使用开放数组参数
实参可以接受静态数组和动态数组
procedure p1(a:array of Byte);
begin
ShowMessage( IntToHex( Integer(@a),2));
ShowMessage(IntToStr(a[0]));
end;
procedure TForm1.btn1Click(Sender: TObject);
var
a:array[0..5] of Byte;
begin
ShowMessage(IntToHex( Integer(@a),2));
p1(a);
end;
function Find(A: array of Char): Integer;
以上函数使用字符数组作为参数传值,其中A:array of Char虽然有着与动态数组
dynamic array相近的形式,但是在这里它并不代表着动态数组。这里A:array of Char
可以使用任意静态或动态数组。
另外,如果一定使A:array of Char为动态数组,则须使用以下形式:
type TDynamicCharArray = array of Char;
function Find(A: TDynamicCharArray): Integer;

例子(e.g.)
function Find(A: array of Char): Integer;
begin
setlength(A,100);//出错,应为setlength只能用于动态数组。
end;
function Find(A: TDynamicCharArray): Integer;
begin
setlength(A, 100);//正确。
end;

delphi 数组作为参数传递

在函数中如果数组的个数不定,可以使用开放数组参数

实参可以接受静态数组和动态数组

procedure p1(a:array of Byte);

begin

ShowMessage( IntToHex( Integer(@a),2));

ShowMessage(IntToStr(a[0]));

end;

procedure TForm1.btn1Click(Sender: TObject);

var

a:array[0..5of Byte;

begin

ShowMessage(IntToHex( Integer(@a),2));

p1(a);

end;

function Find(A: array of Char): Integer;

以上函数使用字符数组作为参数传值,其中A:array of Char虽然有着与动态数组
dynamic array相近的形式,但是在这里它并不代表着动态数组。这里A:array of Char
可以使用任意静态或动态数组。
另外,如果一定使A:array of Char为动态数组,则须使用以下形式:
type TDynamicCharArray = array of Char;
function Find(A: TDynamicCharArray): Integer;
======================
例子(e.g.)
function Find(A: array of Char): Integer;
begin
setlength(A,100);//出错,应为setlength只能用于动态数组。
end;

function Find(A: TDynamicCharArray): Integer;
begin
setlength(A, 100);//正确。
end;

 

参考http://www.cnblogs.com/bayzhang/p/6098468.html

以上是关于delphi 7 中数组如何当参数的主要内容,如果未能解决你的问题,请参考以下文章

你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?

delphi 中用数组作为参数传入sql语句中

DelPhi中怎样定义数组及字母组

请问:delphi 中数组作为函数的参数传递,这样传过去的是地址,怎样把数组作为值传递过去?

delphi 数组作为参数传递

Delphi Setlength 内存释放总结