AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObject kein ordinaler Typ?

Ein Thema von himitsu · begonnen am 20. Jan 2010 · letzter Beitrag vom 21. Jan 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#11

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:41
Zitat von Muetze1:
Zitat von Stevie:
Nein, das stimmt, die Ausdrücke von Himi würden eh nicht hinhauen, weil die auf Integer umgecasteten Objekt-Referenzen auf 1 Byte verkürzt würden.
1 Byte? Was? Wo?

Integer sind 4 Bytes und die kann er nicht weiter kürzen, weil dann signifikante Stellen verloren gehen. Da würde er warnen und man müsste einen expliziten Cast machen. Implizite Casts macht er nur, wenn keine signifikante Stellen verloren gehen (wie in allen Programmiersprachen). Aber 1 Byte? Wie kommst du auf den Wert?
Probier mal folgendes:
Delphi-Quellcode:
procedure Test;
var
  i, k: Integer;
begin
  i := MaxInt;
  k := MaxInt;
  if k in [Integer(i)] then
  begin
    ShowMessage('Integer');
  end;
  k := 255;
  if k in [Integer(i)] then
  begin
    ShowMessage('Byte');
  end;
end;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:42
Zitat von 3_of_8:
Es geht hier aber um Sets, und ein Set über einen 4 Byte großen Zahlentyp kannst du vergessen. ;)
Aber das macht der Compiler nicht von Haus aus, sondern er warnt vorher bzw. bei Sets mit zu großen Enums (mehr als 64 Elemente) bricht er sogar mit einem Compilerfehler ab. Der Pascal Compiler legt die Größen seiner Elemente so fest, wie er sie braucht. Also ein Enum kann von 1 Byte bis 4 Byte groß sein, ganz abhängig von der Anzahl der Elemente. Beim Set ist es genauso, alles zwischen 1 Byte bis 8 Bytes, da jedes Set Element in einem Bit zugeordnet wird. Alles klar soweit, aber wo hier nun eine Verkürzung auf 1 Byte vorgenommen wird, das sehe ich noch immer nicht. Also bitte klärt mich auf...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#13

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:48
Zitat:
if k in [Integer(i)] then
also hier warnt der Compiler vor nix ... ist ja voll nett.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:50
Mit anderen Worten: Meine Aussagen ist die Theorie, nur CodeGear hat mal wieder Mist gebaut (beim Umsetzen in die Praxis) und gibt keine Warnung aus. Wieder was gelernt - und ein neues Manko einer doch so typensicheren Sprache...
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#15

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:52
Zitat von Delphi-Hilfe:
Sets may have at most 256 elements

This error message appears when you try to declare a set type of more than 256 elements. More precisely, the ordinal values of the upper and lower bounds of the base type must be within the range 0..255.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:53
Es ist aber doch schwachsinnig hier eine compile-time only Meldung einzubauen anstatt auch den runtime Fall mit abzuprüfen.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#17

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 12:57
Aktiviert man in den Compileroptionen die Bereichsüberprüfung, bekommt man die Meldung:

Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse ERangeError mit der Meldung 'Fehler bei Bereichsprüfung' aufgetreten.
---------------------------
Anhalten  Fortsetzen  Hilfe  
---------------------------
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#18

Re: TObject kein ordinaler Typ?

  Alt 20. Jan 2010, 13:55
Hi himitsu,

ich möchte mal auf deinen Eingangspost eingehen. Dazu ersetze ich die Variablen durch ihre Typbezeichnungen. Dadurch wird der Code zwar syntaktisch falsch, aber vielleicht fällt unseren Spezialisten dann auf, das sie mit ihrer Diskussion über Mengen nicht gerade zur Aufhellung dieses Delphi-Fehlers(?) beigetragen haben:

If Integer in [Integer, Integer, Integer] Then ... Beide Seiten des 'IN'-Operators sind vom Typ her identisch. Klar geht das.

If TObject in [Integer, Integer, Integer] Then ... Äh. Beide Seiten des 'IN'-Operators sind nicht typkompatibel. Ich komme darauf zurück.

If TObject in [TObject , TObject , TObject ] Then ... Gottseidank meckert wenigstens da der Compiler, vonwegen "ordinaler Typ erforderlich".

Wieso geht das Konstrukt '<ObjectRef> IN <OrdinalSet>' durch den Compiler? Hmm. Mal sehen, was die Delphi-OH dazu sagt:
In der Tabelle der Mengenoperatoren steht bei 'IN', das die Operatorn "Ordinalwert, Menge" sein müssen. Hupsa. Eine <ObjectRef> ist doch aber kein Ordinalwert. Oder?

Um also himitsus Frage aufzugreifen
Zitat von himitsu:
Warum?
Würde ich derzeit mit einem 'Weil Irgendwer bei BorlInpCodeGarcadero mal geschlampt hat' beantworten.


Zitat von Stevie:
... weil Objekt-Referenzen nicht implizit zuweisungskompatibel zu diesem Datentyp sind (Stichwort Typensicherheit)
Das stimmt dann wohl nicht.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#19

Re: TObject kein ordinaler Typ?

  Alt 21. Jan 2010, 06:39
Ich weiß ja nicht, ob du es ausprobiert hast, oder es einfach geglaubt hast.
Eventuell ist es auch einfach nur zu früh für mich, aber
if Components[i] in [Integer(Panel1), Integer(Panel2), Integer(Panel3)] then ... gibt bei mir einen "E2010 Inkompatible Typen: 'TComponent' und 'Integer'" compiler error.
Somit dürfte meine Aussage nach wie vor stehen.

Schau dir außerdem einmal den asm an, der für ein in-Statement erzeugt wird, dann siehst du, warum ein Hardcast eines 32-Bit Pointers auf ein Integer nix bringt (und warum in der OH das von mir zitierte steht)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#20

Re: TObject kein ordinaler Typ?

  Alt 21. Jan 2010, 08:20
Hatte es ausprobiert, aber wegen eines Fehlers im Set war ich da nicht bis Then gekommen, so daß diese Fehlermeldung noch nicht angezeigt wurde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz