Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aufzählung geht nicht

47 views
Skip to first unread message

Rene Kadner

unread,
Nov 2, 2009, 11:37:20 AM11/2/09
to
Hallo,

in Delphi 2009 habe ich folgendes Problem:

var i: integer;
...
if (i in [1..5]) then -> wird compiliert
if (i in [1000..5000]) then -> wird *nicht* compiliert: Fehler E1012
Konstantenausdruck verletzt untere Grenzen.


D�rfen in einer Aufz�hlung nur 'kleine' Zahlen stehen. Wenn ja, wo ist die
Grenze? In der Hilfe habe ich dazu nichts gefunden.
Was kann ich tun (au�er einer doppelten </> Abfrage) ?

Gru�
Ren�

Heinz Zastrau

unread,
Nov 2, 2009, 12:13:25 PM11/2/09
to
Hallo Renᅵ,

> if (i in [1..5]) then -> wird compiliert
> if (i in [1000..5000]) then -> wird *nicht* compiliert: Fehler E1012
> Konstantenausdruck verletzt untere Grenzen.
>
>

> Dᅵrfen in einer Aufzᅵhlung nur 'kleine' Zahlen stehen. Wenn ja, wo ist

> die Grenze? In der Hilfe habe ich dazu nichts gefunden.

> Was kann ich tun (auᅵer einer doppelten </> Abfrage) ?

das Problem ist nicht die Aufzᅵhlung .. sondern die Menge.

Mit 1000..5000 definierst Du ein Aufzᅵhlung von 1000..5000. Durch die
eckigen Klammer drumherum baust du eine Menge die alle Werte der
Ausfzᅵhlung enthᅵlt. Leider kann eine Menge nur bis zu 512 Werte
enthalten. Deswegen erhᅵlts Du die Fehlermeldung.

Alternativen:

if (1000 <= i) and (i <= 5000) then ...;

oder

case i of
1000..5000: ...;
end;

Ciao Heinz Z.

Martin Behrens

unread,
Nov 2, 2009, 12:29:15 PM11/2/09
to
Rene Kadner schrieb:

> in Delphi 2009 habe ich folgendes Problem:
>
> var i: integer;
> ...
> if (i in [1..5]) then -> wird compiliert
> if (i in [1000..5000]) then -> wird *nicht* compiliert: Fehler E1012
> Konstantenausdruck verletzt untere Grenzen.

Mengen d�rfen nur maximal 256 Werte haben.


Martin

Heinz Zastrau

unread,
Nov 2, 2009, 12:37:27 PM11/2/09
to
Hallo Martin,

> Mengen dᅵrfen nur maximal 256 Werte haben.

das ist Richtig. :-)

Ciao Heinz Z.

Holger Lembke

unread,
Nov 2, 2009, 2:03:49 PM11/2/09
to
"Heinz Zastrau" <heinz....@gmx.de> wrote:

>Hallo Martin,
>
>> Mengen d�rfen nur maximal 256 Werte haben.
>
>das ist Richtig. :-)

<aufzeig und h�pf aufgeregt>

Und das mit dem IF war auch falsch!!!!elf

</aufzeig und h�pf aufgeregt>


--
mit freundlichen Gr��en! Password Must Be at Least 18770 Characters
Holgi, +49-531-3497854 ! Can't Repeat Any of Your Previous 30689 Passwords

Rene Kadner

unread,
Nov 3, 2009, 3:49:08 AM11/3/09
to
> [..] Leider kann eine Menge nur bis zu 512 Werte enthalten. Deswegen
> erhᅵlts Du die Fehlermeldung.
Danke. Das hatte ich in der OH nicht gefunden.

> if (1000 <= i) and (i <= 5000) then ...;

die hier nicht ganz :-), aber vom Prinzip her klar.

> case i of
> 1000..5000: ...;
> end;

Das wᅵre nicht schlecht, wᅵrden nicht noch weitere Bedingungen in der IF
Anweisung stehen.

Das mit dem Menge oben wᅵre einleuchtend. Ein "in [1000, 5000]" fᅵhrt aber
zur gleichen Fehlermeldung. Das kᅵnnte der Compiler ja "lᅵssig" in ein OR
wandeln.
-> Durch Versuche habe ich nun herausbekommen, dass innerhalb der []
Klammern nur Zahlen bis 255 akzeptiert werden. Deine 512 oben sind also
leider auch schon zu viel.

Gruᅵ
Renᅵ

Heinz Zastrau

unread,
Nov 3, 2009, 9:32:11 AM11/3/09
to
Hallo Holger,

> <aufzeig und hᅵpf aufgeregt>


>
> Und das mit dem IF war auch falsch!!!!elf
>

> </aufzeig und hᅵpf aufgeregt>

und weil du so aufmerksam bist, darfst Du auch noch erklᅵren was falsch
ist.

Ciao Heinz Z.

Heinz Zastrau

unread,
Nov 3, 2009, 9:39:02 AM11/3/09
to
Hallo Renᅵ

>> if (1000 <= i) and (i <= 5000) then ...;
> die hier nicht ganz :-),

was fehlt DIr denn da noch?

>> case i of
>> 1000..5000: ...;
>> end;
> Das wᅵre nicht schlecht, wᅵrden nicht noch weitere Bedingungen in der IF
> Anweisung stehen.

Wieso lassen denn weitere Bedingungen diese Lᅵsung schlect aussehen?

Ciao Heinz Z.

Holger Lembke

unread,
Nov 3, 2009, 9:59:14 AM11/3/09
to
"Heinz Zastrau" <heinz....@gmx.de> wrote:

>>> if (1000 <= i) and (i <= 5000) then ...;
>> die hier nicht ganz :-),
>
>was fehlt DIr denn da noch?

Ein >

Carsten Thumulla

unread,
Nov 3, 2009, 10:04:55 AM11/3/09
to
Rene Kadner wrote:

> Deine 512 oben sind also leider auch schon zu viel.

Zu Mengen gibt es eine Compileroption, diese hochzusetzen.


Carsten

Heinz Zastrau

unread,
Nov 3, 2009, 10:19:33 AM11/3/09
to
Hallo Holger,

>>>> if (1000 <= i) and (i <= 5000) then ...;
>>> die hier nicht ganz :-),
>>
>> was fehlt DIr denn da noch?
>
> Ein >

das Statement

if (1000 <= i) and (i <= 5000) then ...;

liefert die gleiche Treffer wie

case i of
1000..5000: ...;
end;

und auch die gleich Treffer wie

if i in [1000..5000] then ...;

wenn es sich compilieren lieᅵe. Nehme als Grenzen 10 und 50 und Du kannst
alle 3 Varianten prᅵfen. Mir erscheint da ein ">" eher ᅵberflᅵssig.

Ciao Heinz Z.

Andrej Kluge

unread,
Nov 3, 2009, 10:46:26 AM11/3/09
to
Hi,

Heinz Zastrau wrote:
> das Statement
>
> if (1000 <= i) and (i <= 5000) then ...;
>
> liefert die gleiche Treffer wie

Es liest sich aber sehr ungewohnt, wie du zugeben muᅵt. Oder?

Ciao
AK

Heinz Zastrau

unread,
Nov 3, 2009, 11:12:15 AM11/3/09
to
Hallo,

>> if (1000 <= i) and (i <= 5000) then ...;
>>
>> liefert die gleiche Treffer wie
>
> Es liest sich aber sehr ungewohnt, wie du zugeben muᅵt. Oder?

naja, da ich das schon mehrere Jahre mache ist das fᅵr mich das
natᅵrlichste der Welt. Ich habe mir das aber nicht ausgedacht sondern aus
dem anerkannt guten Buch "Code Complete" von Steve McConnell ᅵbernommen.
Ich fand seine Argumentation schlᅵsssig und seit dem formatiere ich solche
Ausdrᅵcke so. In Delphi Prism kann man sogar gleich einen Schritt weiter
gehen und

if 1000 <= i <= 5000 then ...;

formulieren.

Ciao Heinz Z.

Holger Lembke

unread,
Nov 3, 2009, 2:26:29 PM11/3/09
to
"Heinz Zastrau" <heinz....@gmx.de> wrote:

> Mir erscheint da ein ">" eher �berfl�ssig.

Ja. Danke. Jetzt sehe ich es auch.

Hubert Seidel

unread,
Nov 3, 2009, 6:39:52 PM11/3/09
to
Hallo Carsten,

"Carsten Thumulla" <m...@privacy.net> schrieb im
Newsbeitrag news:e0a9f$4af04698$d9ba1fcb$75...@news1.surfino.com...

> Rene Kadner wrote:
>
> > Deine 512 oben sind also leider auch schon zu viel.
>
> Zu Mengen gibt es eine Compileroption, diese hochzusetzen.

Echt? Ab welcher Version ist das wie m�glich?

In der D5 OH steht:

<Zitat>
Eine Menge ist ein Array von Bits. Jedes Bit zeigt an, ob ein Element in
der Menge enthalten ist oder nicht. Da die maximale Anzahl der Elemente
einer Menge 256 betr�gt, belegt eine Menge nie mehr als 32 Bytes. Die
Anzahl der Bytes, die eine bestimmte Menge belegt, ergibt sich wie
folgt:

(Max div 8) - (Min div 8) + 1

Max und Min sind die obere und die untere Grenze des Basistyps der
Menge. Die Position des Byte eines speziellen Elements E ergibt sich wie
folgt:

(E div 8) - (Min div 8)

Die Position des Bit in diesem Byte ergibt sich aus

E mod 8

Dabei ist E der ordinale Wert des Elements.
</Zitat>

Offensichtlich wird ein Element der Menge mit ein Bit dargestellt.
Gr��ere Mengentyen k�nnen demnach sehr speicherindensiv oder langsam
werden.
Das schliest nat�rlich nicht aus, das es die in sp�teren Versionen geben
k�nnte.

mfg.
Herby

--
http://www.hubert-seidel.eu


Carsten Thumulla

unread,
Nov 4, 2009, 3:39:49 AM11/4/09
to
Hubert Seidel wrote:
> "Carsten Thumulla" <m...@privacy.net> schrieb im

>>> Deine 512 oben sind also leider auch schon zu viel.


>> Zu Mengen gibt es eine Compileroption, diese hochzusetzen.
>
> Echt? Ab welcher Version ist das wie m�glich?

Bei D7 finde ich Mindestgr��e von Enum-Typen.
{$Z1} oder {$Z2} oder {$Z2}

Ich habs noch nicht benutzt, dachte, da� es hilft.

Eigentlich dachte ich mir, da� man damit ja auch die m�glichen Mengen
erh�ht. M��te ich mal probieren.

> Offensichtlich wird ein Element der Menge mit ein Bit dargestellt.
> Gr��ere Mengentyen k�nnen demnach sehr speicherindensiv oder langsam
> werden.

sicher


Carsten
--
"N�, in die Schule will ich nicht. Ich warte lieber noch drei Jahre bis
ich alles wei�."

Carsten Thumulla

unread,
Nov 4, 2009, 3:49:45 AM11/4/09
to
Carsten Thumulla wrote:
>
> Bei D7 finde ich Mindestgr��e von Enum-Typen.
> {$Z1} oder {$Z2} oder {$Z2}

Wirkt nur auf Enum, nicht auf Mengen.


Sieghard Schicktanz

unread,
Nov 3, 2009, 2:28:06 PM11/3/09
to
Hallo Andrej,

Du schriebst am Tue, 3 Nov 2009 16:46:26 +0100:

> > if (1000 <= i) and (i <= 5000) then ...;

...


> Es liest sich aber sehr ungewohnt, wie du zugeben muᅵt. Oder?

Na, jetzt hᅵrt sich das aber langsam schon bisserl nach PISA-Schaden an...

_Was_ ist an der Angabe "1000 <= i <= 5000" ungewᅵhnlich?
Fᅵr eine Programmiersprache, die keine mehrfachen Vergleiche verarbeiten
kann (fast alle) muᅵ das eben ein wenig auseinandergezogen werden - eben
zu "(1000 <= i) and (i <= 5000)".
Versteh' ich nicht, was man dadran nicht verstehen kᅵnnte...

--
(Weitergabe von Adressdaten, Telefonnummern u.ᅵ. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ᅵhnlichem)
-----------------------------------------------------------
Mit freundlichen Grᅵᅵen, S. Schicktanz
-----------------------------------------------------------

Hans-Peter Diettrich

unread,
Nov 4, 2009, 5:09:14 PM11/4/09
to
Carsten Thumulla schrieb:

>>>> Deine 512 oben sind also leider auch schon zu viel.
>>> Zu Mengen gibt es eine Compileroption, diese hochzusetzen.
>>
>> Echt? Ab welcher Version ist das wie m�glich?
>
> Bei D7 finde ich Mindestgr��e von Enum-Typen.
> {$Z1} oder {$Z2} oder {$Z2}
>
> Ich habs noch nicht benutzt, dachte, da� es hilft.

Es hilft nicht, da es sich auf Variablen vom Typ "enum" bezieht, nicht
auf daraus konstruierte *sets*.


>> Offensichtlich wird ein Element der Menge mit ein Bit dargestellt.
>> Gr��ere Mengentyen k�nnen demnach sehr speicherindensiv oder langsam
>> werden.

Solange man die Set-Operatoren f�r boolesche Ausdr�cke verwendet, sind
sie verdammt schnell. Bei Mengen-Operationen wird jede
Programmiersprache langsam.

DoDi

Andrej Kluge

unread,
Nov 5, 2009, 5:03:51 AM11/5/09
to
Hi,

Sieghard Schicktanz wrote:
> Na, jetzt hᅵrt sich das aber langsam schon bisserl nach PISA-Schaden
> an...

Na, na.

> Fᅵr eine Programmiersprache, die keine mehrfachen Vergleiche
> verarbeiten kann (fast alle) muᅵ das eben ein wenig
> auseinandergezogen werden - eben zu "(1000 <= i) and (i <= 5000)".

Nur aus Interesse: steht eine if-Afrage so formuliert in irgend einem der
Delphi-Quelltexte?

Ciao
AK

Christian Gudrian

unread,
Nov 5, 2009, 5:13:12 AM11/5/09
to
Am 05.11.2009, 11:03 Uhr, schrieb Andrej Kluge <kl...@wizzy.de>:

> Nur aus Interesse: steht eine if-Afrage so formuliert in irgend einem
> der Delphi-Quelltexte?

FindResource (System.pas):

if ('A' <= ch) and (ch <= 'Z') then Inc(ch, Ord('a') - Ord('A'));

Christian

--
Erstellt mit Operas revolutionärem E-Mail-Modul: http://www.opera.com/mail/

Andrej Kluge

unread,
Nov 5, 2009, 8:34:53 AM11/5/09
to
Hi,

Christian Gudrian wrote:
>> Nur aus Interesse: steht eine if-Afrage so formuliert in irgend einem
>> der Delphi-Quelltexte?
>
> FindResource (System.pas):
>
> if ('A' <= ch) and (ch <= 'Z') then Inc(ch, Ord('a') - Ord('A'));

Ok, danke.

Ciao
AK

Andreas Mosmann

unread,
Nov 5, 2009, 3:26:14 PM11/5/09
to
Hans-Peter Diettrich schrieb am 04.11.2009 in
<7lecmrF...@mid.individual.net>:

> Solange man die Set-Operatoren f�r boolesche Ausdr�cke verwendet, sind
> sie verdammt schnell. Bei Mengen-Operationen wird jede
> Programmiersprache langsam.

> DoDi

Ich will mich ja nicht streiten, aber das mit dem "langsam" ist relativ.
Ich programmiere v.a. Datenbanksoftware. Wei�t Du, wieviele Millionen
Mengenoperationen Du so machen k�nntest, anstatt eine Datenbankabfrage
zu stellen?
Aus meiner pers�nlichen Sicht ist es wesentlich wichtiger, den Quelltext
so durchschaubar wie m�glich zu halten, als auf Geschwindigkeit (bei der
Verwendung bordeigener Mittel) zu achten. Ich werfe achtlos mit
TStringLists um mich, nur um 2-3 Zeilen formatiert in ein TRichEdit zu
werfen, und bem�he regul�re Ausdr�cke, um ein "A 44 X" in seine
Bestandteile zu zerlegen und habe damit gar kein schlechtes Gewissen.
Wenn ich die gesparte Zeit einsetze, um damit meine DB- Zugriffe zu
optimieren, verringert sich der Zeitbedarf der Anwendung deutlich mehr.

Andreas
der Dir hiermit nicht widersprechen, sondern lediglich andere Akzente
setzen wollte. Wenn Delphi ein Set [0..10000000] m�glich machen w�rde,
dann w�rde ich das begr��en. Nicht, dass ich daf�r im Moment eine
Verwendung h�tte, aber allein, dass es ginge, f�nde ich gut. Zeit spielt
in meinem Kontext keine Rolle, da das Ausbremsende idR immer ein Zugriff
auf eine Datenbank hinter einer notorisch zu d�nnen Leitung ist.
Ich habe viel Aufwand in ein (hauseigenes und sehr spezielles) Framework
gesteckt, dass massgeschneidert dynamische SQL- Abfragen generiert - nur
um einerseits das Quelltext- Handling und andererseits die
Datenbankabfragen zu verbessern. Dazu baue ich im Speicher
verschwenderischst irgendwelche Strukturen auf. Und ich habe nicht ein
einziges mal gemerkt, dass das irgendeinen negativen Einflu� auf das
Laufzeitverhalten oder den Speicherverbrauch hatte. Im Moment reden wir
von Hauptspeicher im Gb- Bereich und von Prozessoren, die im GHz-
Bereich getaktet sind. Wenn mein Rechner das k�nnte, dann f�nde er noch
m�helos Zeit, zwischen den Abfragen f�r mich einkaufen zu gehen.


--
wenn email, dann AndreasMosmann <bei> web <punkt> de

Hans-Peter Diettrich

unread,
Nov 5, 2009, 10:23:52 PM11/5/09
to
Andreas Mosmann schrieb:

>> Solange man die Set-Operatoren f�r boolesche Ausdr�cke verwendet, sind
>> sie verdammt schnell. Bei Mengen-Operationen wird jede
>> Programmiersprache langsam.
>
>> DoDi
>
> Ich will mich ja nicht streiten, aber das mit dem "langsam" ist relativ.
> Ich programmiere v.a. Datenbanksoftware. Wei�t Du, wieviele Millionen
> Mengenoperationen Du so machen k�nntest, anstatt eine Datenbankabfrage
> zu stellen?

Ein Result-Set in einer Datenbankabfrage ist eine Menge (Liste) von
Objekten, wohingegen die Delphi-Sets eher fest dimensionierten Arrays of
Boolean entsprechen.

Wenn schon, dann entspr�che ein Set in einer Datenbankabfrage einem
(dynamischen) Array of T, nicht einem (festen) Set of T. Entsprechend
unterscheidet sich auch die Navigation in solchen "Sets" (relativ oder
absolut). W�hrend bei Datenbanken die Navigation zum n�chsten Element
eine fundamentale O(1) Operation ist, geht das in Sets nur mit einer
O(n) Schleife.

> Aus meiner pers�nlichen Sicht ist es wesentlich wichtiger, den Quelltext
> so durchschaubar wie m�glich zu halten, als auf Geschwindigkeit (bei der
> Verwendung bordeigener Mittel) zu achten. Ich werfe achtlos mit
> TStringLists um mich, nur um 2-3 Zeilen formatiert in ein TRichEdit zu
> werfen, und bem�he regul�re Ausdr�cke, um ein "A 44 X" in seine
> Bestandteile zu zerlegen und habe damit gar kein schlechtes Gewissen.

Da sind wir uns v�llig einig :-)


> Andreas
> der Dir hiermit nicht widersprechen, sondern lediglich andere Akzente
> setzen wollte. Wenn Delphi ein Set [0..10000000] m�glich machen w�rde,
> dann w�rde ich das begr��en.

Schau mal nach TBits :-)

Und �berlege Dir auch, wie gro� so ein Set im Speicher wird. Bei
Datenbanken ist die Gr��e eines Sets undefiniert, sie wird erst zur
Laufzeit bestimmt. In Delphi w�rde ein Set of Char eine betr�chtliche
feste Gr��e haben, wenn Char (neuerdings) ein WideChar ist!

DoDi

0 new messages