Avatar billede athlon-pascal Juniormester
25. september 2003 - 18:05 Der er 9 kommentarer og
1 løsning

Array + Array?

Jeg har følgende:

type
  TNoteArray = array of TNoteRec; //TNoteRec er en record.

var
  Noter: TNoteArray;

Når jeg gør følgende, får jeg fejl (Operator not applicable to this operand type):
  Noter := Copy(Noter, Low(Noter), I) + Copy(Noter, I + 1, Length(Noter));

Så spørgsmålet er, om der findes en nem måde at gøre følgende på:
  Array := Array + Array;

Alternativet, som jeg godt selv kan lave, er at sætte et element af gangen via en løkke, hvilket jeg helst vil undgå.

Jeg bruger Delphi 7 Personal.
Avatar billede stoney Nybegynder
25. september 2003 - 20:03 #1
Prøv at kigge på SetLength(Array, 200);
eller hvor stort dit array skal være

Stoney
Avatar billede athlon-pascal Juniormester
25. september 2003 - 20:16 #2
Stoney -> Jeg kender godt til både SetLength(), Length() og High(), det er dog ikke nogen af dem jeg søger (Og når vi taler om "søger", så har jeg naturligvis søgt her på E efter dynamisk array, og der bliver SetLength, som jeg jo kender i forvejen, nævnt alt for mange gange...).

Derimod søger jeg en nem måde at gøre følgende:

Array1 := Array2 + Array3;
Avatar billede Slettet bruger
25. september 2003 - 20:31 #3
Følger med :-)
Avatar billede tauron Nybegynder
25. september 2003 - 21:12 #4
Du kommer ikke uden om at skrive lidt kode - Pascals syntax tillader ganske enkelt ikke Array1 = Array2 + Array3.

Dette lille quick and dirty program viser en mulig løsning:
unit uaddarray;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  anyarray = array of integer;

function addarray(a, b: array of integer): anyarray;
var
  i, n: integer;
begin
  if length(a)<length(b) then n := length(a) else n := length(b);
  setlength(result, n);
  for i := 0 to n-1 do result[i] := a[i]+b[i];
end;

var
  a: array[1..5] of integer = (4,8,3,7,9);
  b: array[0..3] of integer = (2,7,1,8);

procedure test;
var
  i: integer;
  y: anyarray;
begin
  y := addarray(a,b);
  form1.listbox1.items.add(inttostr(length(y)));
  for i := 0 to length(y)-1 do
  form1.listbox1.items.add(format('y[%d]=%d', [i, y[i]]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test;
end;

end.
Avatar billede athlon-pascal Juniormester
25. september 2003 - 21:21 #5
tauron -> Jeg tænker mere på noget som
  String1 := String2 + String3,
ikke som
  Integer1 := Integer2 + Integer3;

Som jeg også skrev, kan jeg sagtens selv skrive en funktion:

function AddArray(a, b: TNoteArray): TNoteArray;
var
  I := Integer;
begin
  Result := a;
  SetLength(Result, Length(Result) + Length(b));
  for I := Length(a) to High(Result) do
    Result[I] := b[I - High(a)];
end;

(Funktionen er dog ikke testet, men bør virke...)
Avatar billede athlon-pascal Juniormester
25. september 2003 - 21:24 #6
Rettelse:
var
  I: Integer;
Avatar billede Slettet bruger
25. september 2003 - 21:26 #7
Hvis det er Operator Overloading så kan det vist ikke lade sig gøre :-(

http://www.oreilly.com/catalog/delphi/chapter/ch02.html
Avatar billede athlon-pascal Juniormester
25. september 2003 - 21:31 #8
Fejlen jeg får skrev jeg i mit spørgsmål:
"Operator not applicable to this operand type"...
Avatar billede martinlind Nybegynder
25. september 2003 - 23:37 #9
afhængig af hvor meget du skal bruge din type kunne du overveje at lave din record om til en class med div. util funtioner, eller evt. kigge på delphi's TCustomVariantType

/Martin
Avatar billede athlon-pascal Juniormester
05. oktober 2003 - 16:54 #10
Lukker, det er åbenbart ikke muligt at gøre det jeg vil med et dynamisk array.
Jeg har valgt at bruge TList i stedet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester