[Delphi] Array meegeven als parameter procedure

Pagina: 1
Acties:
  • 389 views sinds 30-01-2008
  • Reageer

  • Coltrui
  • Registratie: Maart 2001
  • Niet online
Even een korte schets:

Ik moet een bepaalde initiële volgorde van records bijhouden.
Vervolgens worden wat bewerkingen die records toegepast waardoor de initiële volgorde kan veranderen. De originele volgorde van de records moet daarom
getoetst worden aan de nieuwe.

Om de volgorde bij te houden heb ik de volgende procedure, waarbij ik vóór de bewerkingen een globale var (Array of integer) meegeef, en ernà een andere.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//------------------------------------------------------------------------------------
  procedure TForm1.VulOrdreDepots(OrdreDepots: Array of integer);
//------------------------------------------------------------------------------------

var
QryHulp: TADOQuery;
Ind: Integer;

begin
  Ind := 0;
  QryHulp := TADOQuery.Create(Application);
  with QryHulp do
  begin
    Connection := dmFixed_files.adocon_spo_vente;
    SQL.Text := 'SELECT ORDER'; //Knip -->layout
    Open;
    if not eof then
    begin
      First;
      SetLength(OrdreDepots,RecordCount); //Hier fout: Incompatible Types
      While not eof do
      begin
        OrdreDepots[ind] := FieldByName('RE_DEORDRE').Value;
        inc(ind);
        Next;
      end;
    end
    else exit; //Fout opvangen "Geen data"
  end;
end;



Bij het compileren krijg ik de melding "Incompatible Types" op de SetLength-regel.
Call by value/reference maakt geen verschil, hoewel ik geen compileerfout krijg als ik de in de Setlength regel rechtstreeks de te wijzigen Array meegeef (die globale var dus).

Ik heb het al anders opgelost, dus eventuele andere oplossingen zijn niet nodig...
Ben gewoon benieuwd wat de reden van deze foutmelding is...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Er zijn in Delphi inmiddels verschillende soorten array's.

Origineel in pascal had je alleen arrays met een vaste lengte. Dat was vervelend als je het als paramater aan een procedure mee wilde geven. Dus toen is er een conctrutie gemaakt zodat je een paramater kan maken met een array van verschillende lengte en in de procedure zelf kan kijken hoe lang het array is. Let wel dat bij de declaratie van het array de lengte nogsteeds vast was. Delphi heeft uiteindelijk dynamische arrays gebracht waarbij je met SetLength de grote kan aanpassen.

Al met al zijn er voor array paramaters dus verschillende mogelijkheden die er op het eerste oog erg hetzelfde uitzien. Jij had de verkeerde te pakken.

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Array parameters (vaste lengte)
type TDigits = array[1..10] of Integer;
procedure Sort(A: TDigits);

// Open array parameters (lengte bepalen in procedure)
// Werkt ook met dynamische arrays of enkele variable
// SetLength en Length werken niet. SizeOf wel
function Find(A: array of Char): Integer;
var I: Integer;
begin
  for I := Low(A) to High(A) do
    A[I] := ....
end;

// Specifiek Dynamic array parameters
// Nu werkt SetLength wel
type TDynamicCharArray = array of Char;
function Find(A: TDynamicCharArray): Integer;

// Variant open array parameters
// Hoort misschien niet helemaal in het rijtje thuis
procedure DoSomething(A: array of const);

[ Voor 0% gewijzigd door LordLarry op 16-10-2002 10:10 . Reden: verbetering Dynamic array parameters ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Waarschijnlijk komt het doordat je een vaste parameter niet kunt wijzigen.
Probeer er eens "var" voor te zetten, dus:

procedure TForm1.VulOrdreDepots(var OrdreDepots: Array of integer);

Alleen op deze manier kun je namelijk weer een gewijzigde array/waarde terruggeven!
(of via een function natuurlijk...)

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:38
Verwijderd schreef op 16 oktober 2002 @ 10:04:
Waarschijnlijk komt het doordat je een vaste parameter niet kunt wijzigen.
Probeer er eens "var" voor te zetten, dus:

procedure TForm1.VulOrdreDepots(var OrdreDepots: Array of integer);

Alleen op deze manier kun je namelijk weer een gewijzigde array/waarde terruggeven!
(of via een function natuurlijk...)


Wordt een array niet standaard als var doorgegeven? Ik weet dat in C++ arrays standaard by reference worden doorgegeven.

Al zou dat in Delphi niet het geval zijn, dan zou ik het toch vreemd vinden. Binnen die procedure gaat die array gekopieerd worden naar een variable die enkel binnen die procedure zichtbaar is. Daar kan je dus alles wijzigen wat je maar wilt, maar die wijzigingen gaan niet toegepast worden op de originele variable.

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

whoami schreef op 16 oktober 2002 @ 10:08:

[...]


Wordt een array niet standaard als var doorgegeven? Ik weet dat in C++ arrays standaard by reference worden doorgegeven.

Al zou dat in Delphi niet het geval zijn, dan zou ik het toch vreemd vinden. Binnen die procedure gaat die array gekopieerd worden naar een variable die enkel binnen die procedure zichtbaar is. Daar kan je dus alles wijzigen wat je maar wilt, maar die wijzigingen gaan niet toegepast worden op de originele variable.
Juist, dat is precies wat er gebeurd. Daarom moet je er erg goed mee oppassen als je niet elke keer het hele array wilt kopieeren. :)

code:
1
2
3
var A: TMyArray // gebruiken als je waarden uit het array wilt aanpassen
const A: TMyArray // gebruiken als je waarden NIET uit het array wilt aanpassen
A: TMyArray // gebruiken als je geheugen en tijd teveel hebt (nooit) :p

[ Voor 0% gewijzigd door LordLarry op 16-10-2002 10:14 . Reden: code tags ]

We adore chaos because we like to restore order - M.C. Escher


  • Coltrui
  • Registratie: Maart 2001
  • Niet online
Verwijderd schreef op 16 oktober 2002 @ 10:04:
Waarschijnlijk komt het doordat je een vaste parameter niet kunt wijzigen.
Probeer er eens "var" voor te zetten, dus:

procedure TForm1.VulOrdreDepots(var OrdreDepots: Array of integer);

Alleen op deze manier kun je namelijk weer een gewijzigde array/waarde terruggeven!
(of via een function natuurlijk...)
Nee, ik heb zowel parameter passed by value als by reference geprobeerd, dat maakte dus niet uit.
Wordt een array niet standaard als var doorgegeven? Ik weet dat in C++ arrays standaard by reference worden doorgegeven.

Al zou dat in Delphi niet het geval zijn, dan zou ik het toch vreemd vinden. Binnen die procedure gaat die array gekopieerd worden naar een variable die enkel binnen die procedure zichtbaar is. Daar kan je dus alles wijzigen wat je maar wilt, maar die wijzigingen gaan niet toegepast worden op de originele variable.
Alle parameters worden default by value doorgegeven, uitgezonderd
indexes and pointer dereferences

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Wezen schreef op 16 oktober 2002 @ 10:14:
Nee, ik heb zowel parameter passed by value als by reference geprobeerd, dat maakte dus niet uit.
Maakt wel uit. Jij wilt zeker bij reference gebruiken (var), maar dat is niet waardoor je die eerste fout krijgt. Die krijg je omdat, zoals al eerder aangaf, je een open array parameter gebruikt hebt. Daar mag je geen SetLength gebruiken. Je moet een Dynamische array parameter gebruiken.

We adore chaos because we like to restore order - M.C. Escher


  • Coltrui
  • Registratie: Maart 2001
  • Niet online
Woei! Meer dan één fout dus :P
Heb trouwens ondertussen de betreffende help-file gevonden.
Ik moest enkel even zoeken op "open array parameter ", moeilijk als je nog nooit van die term gehoord hebt.
Dank u wel :)
Pagina: 1