[Delphi]Array veranderd maar deels mee in procedure

Pagina: 1
Acties:

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Het is een beetj vreemd topictitel, maar wist het even niet beter te omschrijven.

Ik heb het volgende probleem. Mijn code zit ongeveer zo in elkaar:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type
    TFamilieArray= Array of Array of String;
    procedure OnderlingVergelijken(VMA:TVergelijkMatrixArray; FA: TFamilieArray);
...

var
    FamilieArray: TFamilieArray;

...

procedure TForm1.btnStartClick(Sender: TObject);
...
SetLength(FamilieArray,1,1);
...
  if cbOnderlingVergelijken.Enabled then
    OnderlingVergelijken(VergelijkMatrixArray, FamilieArray);

...

procedure TForm1.OnderlingVergelijken(VMA:TVergelijkMatrixArray; FA:TFamilieArray);
...
Setlength(FA[i],high(FA[i+1])+1); //Werkt wel FamilieArray veranderd
SetLength(FA, high(FA)); //Werkt niet FamilieArray veranderd niet van lengte

Ik heb dus een globale variabele FamilieArray. Daarmee werk ik in de procedure btnStartClick. In die procedure roep ik een andere procedure aan, OnderlingVergelijken, en die geef ik die globale variabele FamilieArray mee. Lokaal in OnderlingVergelijken heet die variabele FA.

Het probleem is nu dat FA en FamilieArray bij alles simultaan wijzigen in de watchwindow en in het echt dus, beahlve die laatste SetLength. Nu zal ik het wel weer helemaal fout hebben aangepakt, maar dan nog vind ik het vreemd dat hij alle variabelen wel simultaan veranderd en de lengtes binnen de array ook, maar de "hoofd"lengte dus niet.

Wat doe ik daar fout???

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een Dynamisch array is eigenlijk een pointer en omdat je m nu by value doorgeeft wordt die pointer gecopieerd. Bewerkingen op die pointer zoals het langermaken hebben dus invloed op elk iets anders. Zorg dat je m by Reference doorgeet. var dus.
Delphi:
1
procedure OnderlingVergelijken(VMA:TVergelijkMatrixArray; var FA: TFamilieArray);

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


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
LordLarry schreef op 07 februari 2004 @ 19:50:
Een Dynamisch array is eigenlijk een pointer en omdat je m nu by value doorgeeft wordt die pointer gecopieerd. Bewerkingen op die pointer zoals het langermaken hebben dus invloed op elk iets anders. Zorg dat je m by Reference doorgeet. var dus.
Delphi:
1
procedure OnderlingVergelijken(VMA:TVergelijkMatrixArray; var FA: TFamilieArray);
_/-\o_ Hulde! Ik heb al vaker van dit soort vragen gesteld, maar het zit kennelijk nog niet zo goed tussen de oortjes hier hoe het allemaa nu werkt. Gelukkig is er dan vrijwel altijd LordLarry die mij uit de brand kan helpen :)

Hulde voor jou LordLarry! _/-\o_

  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
Oscar Mopperkont schreef op 08 februari 2004 @ 16:05:
[...]

_/-\o_ Hulde! Ik heb al vaker van dit soort vragen gesteld, maar het zit kennelijk nog niet zo goed tussen de oortjes hier hoe het allemaa nu werkt. Gelukkig is er dan vrijwel altijd LordLarry die mij uit de brand kan helpen :)

Hulde voor jou LordLarry! _/-\o_
Het is wel even de moeite om goed te begrijpen waarom het hier nou niet werkte.. Scheelt veel problemen als je later nog eens dit soort 'bugs' tegen komt..

Het verschil is dus of je het adres van een variabele meestuurt, of alleen de [b]waarde[b] :D

[ Voor 4% gewijzigd door JozyDaPozy op 08-02-2004 16:08 ]


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
jozy2002 schreef op 08 februari 2004 @ 16:08:
[...]


Het is wel even de moeite om goed te begrijpen waarom het hier nou niet werkte.. Scheelt veel problemen als je later nog eens dit soort 'bugs' tegen komt..

Het verschil is dus of je het adres van een variabele meestuurt, of alleen de [b]waarde[b] :D
En als je dus var ervoor zet dan stuur je dus het adres mee?

Maar waarom veranderd de meesgestuurde var (als ik er geen var bijzet) dan wel deels? Want alles veranderde dus mee behalve die laatste setlength?

Verder zou ik eens moeten gaan werken met objectlist, maar moet me daar nog even in verdiepen, want snap daar nog weinig van. :/

  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
Oscar Mopperkont schreef op 08 februari 2004 @ 16:10:
[...]

En als je dus var ervoor zet dan stuur je dus het adres mee?

Maar waarom veranderd de meesgestuurde var (als ik er geen var bijzet) dan wel deels? Want alles veranderde dus mee behalve die laatste setlength?

Verder zou ik eens moeten gaan werken met objectlist, maar moet me daar nog even in verdiepen, want snap daar nog weinig van. :/
Klopt met var geef je het adres mee.

Dat je wel wat kon veranderen is 'toeval', je moet er vanuit gaan dat het gewoon niet werkt.. (Toeval in de zin dat je toevallig in het juiste stukje geheugen aan het schrijven was.. )

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Oscar Mopperkont schreef op 08 februari 2004 @ 16:10:
Maar waarom veranderd de meesgestuurde var (als ik er geen var bijzet) dan wel deels? Want alles veranderde dus mee behalve die laatste setlength?
Graag gedaan :)

Omdat er uiteindelijk wel naar dezelfde gegegevens wordt verwezen. Het gebruik van SetLength veranderd de Dynamische array structuur, maar dan wel alleen van de lokale copy. Met var (of const) heb je precies dezelfde te pakken.

Het gebruik van een TList of afgeleide is zeker te preferen boven het gebruik van Dynamische Array's op deze manier. En zoveel moeilijker zijn ze ook niet hoor.

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

Pagina: 1