Avatar billede rozh Nybegynder
29. juli 2003 - 13:47 Der er 10 kommentarer og
1 løsning

Multidimentional open array parametre

Hej.

jeg har følgende stykke kode:


unit StringUtilities;

interface

TOldNew  = array of array[0..1] of string; //egen type.

implementation

Function ReplaceWords( const OldAndNew: TOldNew ): string;
begin
end;


Jeg vil så lave et kald til ReplaceWords fra en anden procedure som følger:

procedure Hej
begin
  ReplaceWords (  [ ['1','2'], ['34','56'] ]  );
end;

Men dette kompilerer ikke. Hvad skal jeg gøre ?

PS: jeg vil IKKE oprette en variable af typen TOldNew i proceduren Hej, og "pass" den som parameter til ReplaceWords. Jeg vil have, som illustrert ovenfor, at jeg ind i selve funktionskaldet skriver hvad OldAndNew skal være.

mvh
Rozh
Avatar billede athlon-pascal Juniormester
29. juli 2003 - 14:38 #1
Du bliver nødt til at ændre

Function ReplaceWords( const OldAndNew: TOldNew ): string;
begin
end;

til

Function ReplaceWords( var OldAndNew: TOldNew ): string;
begin
end;
Avatar billede athlon-pascal Juniormester
29. juli 2003 - 14:39 #2
const fungegere jo som en slags skrivebeskyttelse...
Avatar billede athlon-pascal Juniormester
29. juli 2003 - 14:40 #3
Nej, vent lidt. Det passer ikke det jeg skrev.
Kan vi få lidt mere kode?
Den fulde ReplaceWords-funktion, f.eks.?
Avatar billede athlon-pascal Juniormester
29. juli 2003 - 14:42 #4
Den procedure du kalder hej i dit eksempel, kan du også vise den?
Avatar billede rozh Nybegynder
29. juli 2003 - 20:39 #5
Jeg har ikke tænkt mig at ændre i OldAndNew i proceduren, derfor må den godt ærklæres som const. ReplaceWords er tom indtilvidere. Nedenunder er den fulde erklæring af den.

function ReplaceWords(const S:string; const Sep :Tsep; const OldAndNew: OldNew): string;
var L,I,J:Integer;
    Words: Tstrings;
begin
end;

Denne kompilerer fint. Det er ligeså snart at jeg kalder den, at den ikke kan kompilerer.

Jeg kalder således:
ReplaceWords(S, sep, [ [har' ,'havde' ],
                      ['får', 'fik'  ],
                      ['kan', 'kunne'] ]);

alt kører fint, indtil jeg inkluderer:
                    [ [har' ,'havde' ],
                      ['får', 'fik'  ],
                      ['kan', 'kunne'] ]
for mig set er denne en: array of array[0..1] of string. Men det er delphi ikke enig i.
Jeg er kede af at jeg ikke kan inkludere hele mit unit, men det er fordi at jeg har prøvet så mange mærkelige ting derinde, at det roder ad h... til, og det vil forvirre mere end det vil gavne.
Hvis bare jeg kan få de simple procedurer 'Hej' og 'ReplaceWords' i mit første oplæg til at virke, så bliver jeg meget glad, idet selv disse to meget simple procedurer ikke kan kompileres.

mvh rozh
Avatar billede rozh Nybegynder
29. juli 2003 - 20:41 #6
OBS: der står selvfølgelig TOldNew og ikke OldNew i funktionserklæringen, så det er ikke derfor...
Avatar billede rozh Nybegynder
29. juli 2003 - 20:46 #7
Debuggeren siger iøvrigt: Ordinal Type required til:
[ [har' ,'havde' ],
  ['får', 'fik'  ],
  ['kan', 'kunne'] ]

rozh
Avatar billede borrisholt Novice
30. juli 2003 - 08:19 #8
Jeg ville lave det sådan her :

//from sysutils.pas
//type
//  TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);


procedure ReplaceWords(const Buffer : TStrings; OldWords, NewWords : Array of String; const ReplaceFlags : TReplaceFlags); overload;
var
  i, len : Integer;
begin
  Len := Length(OldWords);

  if Length(NewWords) <> Len then
    raise ERangeError.Create('Nar der er ikke lige lange');

  for i := 0 to Len -1 do
    Buffer.Text := StringReplace(Buffer.Text, OldWords[i], NewWords[i], ReplaceFlags)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ReplaceWords(Memo1.Lines, ['1', '2'], ['34', '56'], [rfReplaceAll]);
end;



Jens B
Avatar billede rozh Nybegynder
30. juli 2003 - 15:37 #9
Den har jeg også overvejet, men den kan jeg ikke bruge, grundet måden stringreplace virker på (den vil ertstatte ettallet i både '010' OG '1', og det skal min funktion ikke gøre-. Den skal nemlig kun ertstatte '1', dvs. her er mellemrum en seperator).

Jeg vil bare gerne have funktionen i mit første indlæg til at virke.
Men ellers tak for det

mvh
Rozh
Avatar billede borrisholt Novice
01. august 2003 - 08:22 #10
Ja det styrer du blot med ReplaceFlags
Avatar billede rozh Nybegynder
07. august 2003 - 00:12 #11
lukker
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