AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

darf man das?

Ein Thema von Leuselator · begonnen am 4. Nov 2009 · letzter Beitrag vom 6. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#1

darf man das?

  Alt 4. Nov 2009, 23:12
Was haltet ihr von folgendem Code?

Delphi-Quellcode:
type
TMoeglicheProbleme = (mpKleinesProblem,mpMittleresProblem,mpGrossesProblem);
TProblemSammlung = set of TMoeglicheProbleme;

var
MeineProbleme :TProblemSammlung;
MeinProblemCast : Longword;
begin
  MeineProbleme := [mpKleinesProblem,mpMittleresProblem];
 
  MeinProblemCast := Longword(pointer(@Meinproblem)^); // scheint zu funktionieren...

  MeinProblemCast := 4;

  MeineProbleme := TProblemSammlung(Pointer(@MeinProblemCast)^); // das auch
 
end;
ernsthafte Einwände?
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Aussagekräftiger Titel

  Alt 4. Nov 2009, 23:51
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: darf man das?

  Alt 5. Nov 2009, 00:40
Was ich davon halte: Gornix Gerade Enums und Sets sind dazu gedacht die Lesbarkeit des Codes zu verbessern, und du schaffst es damit diese sogar noch zu verschlechtern. Daher: Völlig entgegen dem Sinne des Erfinders, und entgegen jeglicher Standards. Immer Käse.

Warum das gut gehen kann: Sets sind intern Bit-Felder, ganz ähnlich den diversen aus 2er-Potenzen zusammengebauten Flags in z.B. der WinAPI. Jedem Element ist nun eine Bitposition zugeordnet, ist dieses Bit 1 ist das korrespondierende Element in der Menge (im Set), sonst nicht. Daher kannst du prinzipiell auch einfach von hinten durch die Brust einen Wert an die Speicherstelle kritzeln, und reinterpretiert ist das dann eine Untermenge des Sets. ABER: Welches Element des Enums an welches Bit gekoppelt wird obliegt allein dem Compiler. Der wird sich wahrscheinlich definiert verhalten, jedoch muss das nicht für alle anderen Versionen das selbe Verhalten sein. Zudem kann man Enums auch Werte per Hand verpassen, wo dann auch erstmal fraglich ist wie diese in einem Set gehandhabt werden. Auch bin ich mir grad unsicher, ob Sets immer einem Longword entsprechen.

Fazit: Auch wenn es zunächst einmal geht, tu dir selbst und allen die den Source jemals mal lesen müssen den gefallen und mach solche Vergewaltigungn nicht. Aus technischer Sicht weil es eben unsicher sein kann, aber viel viel mehr weil es dem Sinn der Sache völlig entgegen spricht. Ich denke was du da geposted hast wird nur ein Beispiel sein, ich kann mir gut vorstellen, dass sich für den eigentlichen Zweck deutlich passendere Strukturen finden ließen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#4

Re: darf man das?

  Alt 5. Nov 2009, 05:31
Hi,
wer soll dir das verbieten? Du darfst alles was dir Spass macht.
Sowas macht man natürlich nicht weil der Code einfach unlesbar und unkontrollierbar wird.
Aber: wie immer gibts vielleicht doch eine Anwendungsmöglichkeit:
Ich such seit Monaten eine Möglichkeit mit wenig Aufwand Bytes zu manipulieren.

Wenn ich mir folgendes vorstelle:
TBitset=(Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7) set of TBitset; Man müsste sich mal überlegen ob sowas dann wirklich die Bits0 und 2 eines Bytes setzt.

MeinByte := [Bit0,Bit2]; Werd ich auf jeden Fall ausprobieren.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

Re: darf man das?

  Alt 5. Nov 2009, 06:24
Zitat von R2009:
Hi,
wer soll dir das verbieten? Du darfst alles was dir Spass macht.
Sowas macht man natürlich nicht weil der Code einfach unlesbar und unkontrollierbar wird.
Aber: wie immer gibts vielleicht doch eine Anwendungsmöglichkeit:
Ich such seit Monaten eine Möglichkeit mit wenig Aufwand Bytes zu manipulieren.

Wenn ich mir folgendes vorstelle:
TBitset=(Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7) set of TBitset; Man müsste sich mal überlegen ob sowas dann wirklich die Bits0 und 2 eines Bytes setzt.

MeinByte := [Bit0,Bit2]; Werd ich auf jeden Fall ausprobieren.

Grüsse
Rainer
Korrekt wäre folgendes:
Delphi-Quellcode:
type
  TBit = (Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7);
  TBitSet = set of TBit;

var
  i: Word;
  x: TBitSet;
begin
  x := [];
  i := Word(x); // i = 0

  x := [Bit0];
  i := Word(x); // i = 1

  x := [Bit1];
  i := Word(x); // i = 2

  x := [Bit0, Bit1];
  i := Word(x); // i = 3

  x := [Bit7];
  i := Word(x); // i = 128
end;
Je nach Anzahl Elemente in deinem Enum (Bits) kannst du nur verschiedene Casts deines Sets machen.
Hast du beispielsweise 16 Bits, kannst du nicht in Byte casten, sondern in Word.
Über den Umweg des TE kannst du auch in größere Wertetypen casten, allerdings greifst du dann auf nicht initialisierten Speicher zu - daher Finger weg von sowas.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: darf man das?

  Alt 5. Nov 2009, 06:27
Zitat von R2009:
Man müsste sich mal überlegen ob sowas dann wirklich die Bits0 und 2 eines Bytes setzt.
Heute vielleicht, aber was ist mit der nächsten Compilergeneration?

Wieso nicht die üblichen OR bzw. AND - Operationen auf Bytes?
Bits0And2 := $01 OR $04; Deine Überlegungen und die des Threaderstellers, aus vermeindlichen Performancegründen (oder warum auch immer), die Lesbarkeit von Programmcode auf 0 zu setzen mag im eigenen Kämmerlein keine Auswirkungen haben (außer die der potentiellen Inkompatibilität), aber sobald man den Code veröffentlicht, ist Schluss mit lustig.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#7

Re: darf man das?

  Alt 5. Nov 2009, 06:51
Hi alzaimar,

ist doch klar aber man wird doch nachdenken und spekulieren dürfen?

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: darf man das?

  Alt 5. Nov 2009, 07:05
Zitat von R2009:
ist doch klar aber man wird doch nachdenken und spekulieren dürfen?
Um 06:31 ?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#9

Re: darf man das?

  Alt 5. Nov 2009, 07:28
na und
bin halt Frühaufsteher!
War 10 jahre Systemadministrator und musste um 6:00 Morgens hier sein.
Jetzt bin ich zu alt um das noch zuändern.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: darf man das?

  Alt 5. Nov 2009, 08:00
Einwand:

dein Set ist 1 Byte groß (jedenfalls deiner Deklararion nach)
dein Cast dagegen 4 Byte



also wie Stevie scjon erwähnte
wenn die Größe stimmt, dann läßt es sich auch casten
ansonsten sind deine "wilden" Zwangs-Cast's Scheiße.

Delphi-Quellcode:
type
  a = set of (aa, bb, cc);
  b = LongWord;
  {$MINENUMSIZE 4}
  c = set of (dd, ee, ff);
  {$MINENUMSIZE 1}  // zurücksetzen

  d = (gg, hh, ii);
  e = LongWord;
  {$MINENUMSIZE 4}
  f = (jj, kk, ll);
begin
ShowMessage(Format('%d %d %d %d %d %d', [SizeOf(a), SizeOf(b), SizeOf(c),
  SizeOf(d), SizeOf(e), SizeOf(f)]));
Code:
1 4 4    1 4 1
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 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:19 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