Enumeration sollte doch eigentlich ein Byte sein...

pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1344
Dabei seit: 02 / 2009
Betreff:

Enumeration sollte doch eigentlich ein Byte sein...

 · 
Gepostet: 26.10.2014 - 12:22 Uhr  ·  #1
Hallo rolf,

habe ich da was falsch verstanden?

Code
type
...
// Timer
// Timername
TTimeName = (TimeAuf, TimeGesamt, TimeHupe );

TTime   = record
             FUNC      : byte;    // Funktion  0=TON 1=TOF 2=TP
             PT        : WORD;    // Ziel TimerCounter
             ET        : WORD;    // Timer Aktuell
             RESET     : boolean; // Reset anstoßen
             Q         : boolean; // Ausgang aktiv
             INPUT     : boolean; //Timer aktiv
             xINPUT    : boolean; //Timer Schmiermerker für Flankenauswertung
          end;

...
var
  TimeBlock     : ARRAY [0..10] of TTime;  //Timer Routine Speicher
...


Wenn ich jetzt im Code eingebe:
Code
ONLStatus.WM0018_AufZeit              := TimeBlock[ TimeAuf].ET;


Dann erhalte ich einen Fehler: Error: number expected.

Also erstelle ich eine direkte Konvertierung:
Code
ONLStatus.WM0018_AufZeit              := TimeBlock[ byte(TimeAuf)].ET;


Damit übersetzt es der Compiler, aber eigentlich sollte doch lt. Compilerhandbuch Typen mit enumeration / Aufzählung ein Byte sein, oder?

Gruß
Thorsten
miparo
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 989
Dabei seit: 09 / 2007
Betreff:

Re: Enumeration sollte doch eigentlich ein Byte sein...

 · 
Gepostet: 26.10.2014 - 17:39 Uhr  ·  #2
Hi Thorsten,
eine Enumeration ist 1 Byte groß.
Du definierst aber einen neuen Typ TTimeName und das ist nunmal kein Byte Type.

Wenn du dir das casten sparen willst dann so:
Code

Var
 TimeBlock     : Array [TTimeName] of TTime; 


Gruß
miparo
AVRfan
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 69
Beiträge: 16
Dabei seit: 11 / 2009
Betreff:

Re: Enumeration sollte doch eigentlich ein Byte sein...

 · 
Gepostet: 26.10.2014 - 20:02 Uhr  ·  #3
ein boolean hat auch die Grösse eines Bytes und ist trotzdem keins
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1344
Dabei seit: 02 / 2009
Betreff:

Re: Enumeration sollte doch eigentlich ein Byte sein...

 · 
Gepostet: 26.10.2014 - 22:06 Uhr  ·  #4
Zitat geschrieben von miparo

Hi Thorsten,
eine Enumeration ist 1 Byte groß.
Du definierst aber einen neuen Typ TTimeName und das ist nunmal kein Byte Type.

Wenn du dir das casten sparen willst dann so:
Code

Var
 TimeBlock     : Array [TTimeName] of TTime; 


Gruß
miparo


Hallo miparo,

ja so geht's auch. Im Compiler-Handbuch steht aber "Im obigen Beispiel ist der Typ Operator eigentlich ein Byte." Da steht nicht es ist ein Byte groß. ;) Oder sollte das "eigentlich" der Verweis sein? ;)
Eigentlich bin ich bei diesem Hinweis davon ausgegangen, das der Compiler dies automatisch macht.
Da das Beispiel im Handbuch wie folgt:

Code
type
TDay = (Mon,Tue,Wed,Thur,Fri,Sat,Sun);
TMonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
TMArr = array[Jan..Dec] of TDay;
var
MonArr = Tmarr;
...
MonArr[Aug]:= Sun;
If MonArr[Jan] = Fri then ...

eben auch direkt das "Jan..Dec" nutzt, ohne den verweis in der VAR auf TMonth

Oder liegt der Unterschied daran, das der Typ nicht in den VARs als Array, sondern bereits im Type-Bereich erstellt wurde?

Aber wie gesagt, dann arbeite ich mit Deinem Vorschlag, Hauptsache der Code lässt sich gut lesen :) und man spart sich das Casting.

@AVRfan:
Zitat geschrieben von AVRfan

ein boolean hat auch die Grösse eines Bytes und ist trotzdem keins
Hallo AVRfan,
klar. Und ein Pointer zeigt auch nur auf ein BYTE und trotzdem kann da alles andere dahinter stehen. ;)

Aber wenn man es genau nimmt, sind alle Typen nur BITs, also 0 oder 1 :O

Gruß
Thorsten
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 26
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Enumeration sollte doch eigentlich ein Byte sein...

 · 
Gepostet: 27.10.2014 - 13:43 Uhr  ·  #5
Hallo Thorsten,

im AVRco ist ein Pointer vollkommen neutral, im Gegensatz zu Delphi.
Er zeigt immer auf eine Byte-Speicherstelle. Ein typisierter Pointer zeigt immer auf
eine Variable des im Pointer vorgegeben Typs.

Das oben angeführte Beispiel ist syntaktisch vollkommen korrekt. Eine Enumeration
ist die Definition eines Aufzählungstyps und ist damit eine vollkommen neue Zahlen
Reihe (Konstante) die nicht von 0..xx läuft sondern von enum0..enumxx

rolf
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   96   110 · Page-Gen-Time: 0.023446s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI