Enumeration sollte doch eigentlich ein Byte sein...

pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Enumeration sollte doch eigentlich ein Byte sein...

 · 
Posted: 26.10.2014 - 12:22  ·  #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
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

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

 · 
Posted: 26.10.2014 - 17:39  ·  #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
Gender: n/a
Age: 68
Posts: 16
Registered: 11 / 2009
Subject:

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

 · 
Posted: 26.10.2014 - 20:02  ·  #3
ein boolean hat auch die Grösse eines Bytes und ist trotzdem keins
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

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

 · 
Posted: 26.10.2014 - 22:06  ·  #4
Quote by 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:
Quote by 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
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

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

 · 
Posted: 27.10.2014 - 13:43  ·  #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
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   95   109 · Page-Gen-Time: 0.036745s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI