alle Variablen auf 0 setzen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

alle Variablen auf 0 setzen

Beitrag von Jakane »

Hallo :mrgreen:
Ich habe in einer Prozedure etwa 20 Variablen, gibt es eine Möglichkeit sie ALLE mit einem Befehl auf 0 zu setzen oder muss ich jede Variable einzeln auf 0 setzen? :|
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: alle Variablen auf 0 setzen

Beitrag von pluto »

Du könntest ein Statischen Array verwenden. Sonst musst du es manuell machen.

Z.B. wenn alle Variablen vom Gleichen Typ sind, bietet sich ein Array an. Wenn die vom Unterschiedlichen Typ sind, könntest du ein array of const verwenden. Ist aber im allgemeinen langsamer.

Vielleicht kannst du auch Variablen einsparen. In der Regel ist das möglich.
MFG
Michael Springwald

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: alle Variablen auf 0 setzen

Beitrag von Jakane »

hmm ok 8) bleib ich bei der Einzelzuweisung

aber hätte ja sein könn :D
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: alle Variablen auf 0 setzen

Beitrag von pluto »

Wenn das Eigenschaften einer Klasse, wären, könntest du mit Hilfe der RTTI Alle Eigenschaften auf 0 setzten *G*.
MFG
Michael Springwald

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: alle Variablen auf 0 setzen

Beitrag von carli »

pluto hat geschrieben:Wenn das Eigenschaften einer Klasse, wären, könntest du mit Hilfe der RTTI Alle Eigenschaften auf 0 setzten *G*.
Mal abgesehn, dass Klassenvariablen vor dem Aufruf des Konstruktors genullt werden, um den Destruktor bei Exceptions während der Konstruktion aufrufen zu können.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: alle Variablen auf 0 setzen

Beitrag von pluto »

Mal abgesehn, dass Klassenvariablen vor dem Aufruf des Konstruktors genullt werden, um den Destruktor bei Exceptions während der Konstruktion aufrufen zu können.
Mag sein. Aber drauf verlassen kann man sich nicht. Z.B.müssen Boolean Variablen immer auf False oder True gesetzt werden. Weil sonst nicht der Wert drin ist, der erwartet werden könnte. Bei anderen Datentypen ist das ebenfalls so.

Klassenvariablen kenne ich im Moment nicht so. Meinst du damit Felder wie class test? oder meinst du einfach nur Variablen die in Klassen deklariert werden? oder meinst du damit Eigenschaften?

Am Sichersten ist es immer noch: Alle notwendigen Variablen einmal mit den Anfangs Wert zu belegen, den ich brauche.
MFG
Michael Springwald

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: alle Variablen auf 0 setzen

Beitrag von carli »

pluto hat geschrieben:
Mal abgesehn, dass Klassenvariablen vor dem Aufruf des Konstruktors genullt werden, um den Destruktor bei Exceptions während der Konstruktion aufrufen zu können.
Mag sein. Aber drauf verlassen kann man sich nicht. Z.B.müssen Boolean Variablen immer auf False oder True gesetzt werden. Weil sonst nicht der Wert drin ist, der erwartet werden könnte. Bei anderen Datentypen ist das ebenfalls so.

Klassenvariablen kenne ich im Moment nicht so. Meinst du damit Felder wie class test? oder meinst du einfach nur Variablen die in Klassen deklariert werden? oder meinst du damit Eigenschaften?
Damit meine ich Attribute.
Und eine 0 bedeutet boolsch immer noch falsch, darauf kannst du Gift nehmen.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: alle Variablen auf 0 setzen

Beitrag von Socke »

Jakane hat geschrieben:Ich habe in einer Prozedure etwa 20 Variablen
Du könntest Annahmen darüber treffen, wie diese Variablen auf dem Heap verteilt sind und den entsprechenden Speicherbereich mit FillByte() auf Null setzen -- ist aber sehr fehleranfällig.

Erstelle dir einen lokalen Record-Typen mit allen Variablen und lege dir nur eine Variable (Typ Zeiger auf diesen Record-Typen an). Beim Start erstellst du dir diesen Record neu und gibst ihn am Ende wieder frei. Zwischendurch einfach mit FillByte() überschreiben (sicher, da das Speicherlayout/Größe bekannt ist).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: alle Variablen auf 0 setzen

Beitrag von MAC »

zur Sockes Recordtheorie :)

Code: Alles auswählen

TMyRecord = record
a,b,c:integer;
end;
 
const
  NullRecord:TMyRecord = (a:0;b:0;c:0);
und dann in der procedure

Code: Alles auswählen

procedure abc(arec:TMyRecord);
begin
arec := NullRecord;
end;
ist sogar noch relativ einfach ;)

Code: Alles auswählen

Signatur := nil;

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: alle Variablen auf 0 setzen

Beitrag von mschnell »

AFAIK.
- Globale Variablen werden beim Start des Programms genullt,
- Variablen die im Header einer Klasse definiert sind werden beim instanzieren (.Create) genullt.
- "0" heißt bei Boolean "False"

-Michael

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: alle Variablen auf 0 setzen

Beitrag von pluto »

AFAIK.
- Globale Variablen werden beim Start des Programms genullt,
- Variablen die im Header einer Klasse definiert sind werden beim instanzieren (.Create) genullt.
- "0" heißt bei Boolean "False"
Ich habe da immer schlechte Erfahrung gemacht. Z.b. ein einfacher Vergleich: if not test then geht nicht zu zuverlässig, wenn man test nicht auf False gesetzt hat. Es gibt sogar einen Grund dafür: So wird eine Doppelte Installisierung vermieden. Ob es ausnahmen gibt weiß ich nicht.

Am Sichersten und einfachsten ist immer noch: Die Variablen Manuell auf False setzten, oder ein Record schreiben und dann eine Funktion wie InitRecordName schreiben. Dann braucht man das nur einmal zu machen.
MFG
Michael Springwald

Antworten