Frage zu setlength() und Übergabevariablen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Frage zu setlength() und Übergabevariablen

Beitrag von mintpc »

Hallo zusammen,

ich habe 2 Fragen:

1) Gehe ich richtig in der Annahme, dass bei setlength(a,10) der Inhalt des Arrays a gelöscht wird?

2) Warum ist es nicht möglich, eine Objektvariable und eine Übergabevariable wie im Beispiel EINS gleich zu benennen?
Falls es zu einem Namensmissverständnis kommen würde, könnte doch einfach die Übergabevariable zählen, wie in Beispiel ZWEI.


Beispiel : EINS (gibt eine Fehlermeldung wegen Namensgleichheit)

Code: Alles auswählen

TTest = class
    a : integer;
    constructor create (a: integer);
  end;
 
   procedure TTest.create(a: integer);
   begin
     a := a;
   end;


Beispiel ZWEI: (Gibt keine Fehlermeldung)

Code: Alles auswählen

var
  a : integer;
 
   procedure testen (a: integer);
   begin
     a := a;
   end;

Vielen Dank schonmal

mintpc

Benutzeravatar
theo
Beiträge: 10958
Registriert: Mo 11. Sep 2006, 19:01

Re: Frage zu setlength() und Übergabevariablen

Beitrag von theo »

Zu 2: Das hängt vom Modus ab. Mit {$mode delphi} ist es erlaubt. Der Mode objfpc ist strikter gegenüber solchen "Verwirrspielen".

Zu 1: Nicht zwangsläufig, ich würde aber sicherheitshalber davon ausgehen. Da weiss vllt. jemand anderes mehr.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Frage zu setlength() und Übergabevariablen

Beitrag von mschnell »

mintpc hat geschrieben:1) Gehe ich richtig in der Annahme, dass bei setlength(a,10) der Inhalt des Arrays a gelöscht wird?
Das wäre ja blöd. Man möchte ein dynamisches array ja auch vergrößern und verkleinern können. Deshalb vermute ich, dass der die ersten 10 Elemente unverändert bleiben.

-Michael

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Frage zu setlength() und Übergabevariablen

Beitrag von mintpc »

Danke für die Antworten.

mintpc

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 172
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Lazarus 3.8 FPC 3.2.2 x86_64-win64-win32/win64 x86_64-linux-gtk2
CPU-Target: i386, win64, arm

Re: Frage zu setlength() und Übergabevariablen

Beitrag von willi4willi »

Zu 1.

versuche das mal:

Code: Alles auswählen

program TestArray;
 
var a : array of integer;
    i : integer;
 
begin
  for i:=0 to 10 do
  begin
    setlength(a,i+1);  // Vergrößere immer um 1
    a[i]:=i*3;         // fülle Element
  end;
  for i:=0 to 10 do writeln(i,' --> ',a[i]); // alles ist da!
  readln;
  setlength(a,6);                            // verkleinere Array
  for i:=0 to 5 do writeln(i,' --> ',a[i]);  // ersten 6 Werte sind auch noch da
  readln;                                    // aber der restl. Speicher ist frei
  setlength(a,11);                           // vergrößere wieder
  for i:=0 to 10 do writeln(i,' --> ',a[i]); // ersten 6 Werte sind o.k. der Rest undefiniert
  readln;                                    // wenn noch was drin steht, ist das Zufall
 
end.
Viele Grüße
Willi4willi

Edit: Ja, kleiner Fehler. Natürlich sind das im Beispiel 11 bzw 6 Elemente. Danke für den Hinweis!
Zuletzt geändert von willi4willi am Sa 22. Sep 2012, 01:41, insgesamt 2-mal geändert.
 

Viele Grüße

Willi4Willi

------------

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Frage zu setlength() und Übergabevariablen

Beitrag von Eclipticon »

Da wird's aber Probleme geben, weil du bei jedem Array ein Element zu viel abfragst: ein dynamisches Array der Länge 10 hat die Elemente 0 bis 9. Aus diesem Grund würde ich immer mit low() und high() arbeiten

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Frage zu setlength() und Übergabevariablen

Beitrag von Eclipticon »

Da wird's aber Probleme geben, weil du bei jedem Array ein Element zu viel abfragst: ein dynamisches Array der Länge 10 hat die Elemente 0 bis 9. Aus diesem Grund würde ich immer mit low() und high() arbeiten

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Frage zu setlength() und Übergabevariablen

Beitrag von Euklid »

mintpc: Beim Befehl setlength bleiben die Array-Inhalte vollständig erhalten, sofern Du das Array nicht kleiner machst.

- Euklid

Antworten