Forum: Compiler & IDEs sizeof() eines Arrays


von David H. (davidm)


Lesenswert?

Die Frage ist, aus wievielen Arrays besteht mein Array?
Ich würde hier nun eine 8 erwarten.
1
IO_DIGITAL digital[8] = { [0 ... 7] = 0 };
2
3
sizeof(digital) // gibt mir 128 zurück, was der größes der IO_DIGITAL structure entspricht.
4
5
sizeof(digital[0]) // hingegen gibt 16 zurück, was mir nicht in die Birne will.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Verwechselst du eventuell Bits und Bytes?

Leider ist meine Kristallkugel schon wieder in der Reparatur, sodass
ich nicht erkennen kann, wie IO_DIGITAL genau aufgebaut ist.

(Btw.: Konvention für ALLES_GROSS ist, dass man sowas nur für
Präprozessormakros benutzt.)

von David H. (davidm)


Lesenswert?

Jörg Wunsch schrieb:
> Verwechselst du eventuell Bits und Bytes?

Naja, aber ich komme da denoch nicht auf 16

vielleicht treibe ich hier auch einfach nur Bullshit, ich könnte ja 
genauso gut auch

"#define NUMBER_OF_IO 8"
und das anstelle von sizeof() verwenden

> Leider ist meine Kristallkugel schon wieder in der Reparatur, sodass
> ich nicht erkennen kann, wie IO_DIGITAL genau aufgebaut ist.
1
typedef struct                      // 128 Bit
2
{
3
    UINT32    value;                // 32 current value
4
    rtccDate    dt;                 // 32 date
5
    rtccTime    tm;                 // 32 Time
6
    UINT8       io;                 //  8 IO Number (Pin Number)
7
    UINT8     block_time;           //  8 blocktime counter
8
    UINT8      rsvd;                // 16 reserved
9
    union
10
    {
11
        struct
12
        {
13
   UINT8 bEventOnMin : 1;
14
   UINT8 bEventOnMax : 1;
15
         UINT8 bEventOnValue : 1;
16
         UINT8 bEventOnTime : 1;
17
         UINT8 bReserved : 4;
18
  } bits;
19
        UINT8 val;
20
    } flags;
21
} IO_DIGITAL;

von (prx) A. K. (prx)


Lesenswert?

Wie gross sind die "rtcc*" Dinger?

sizeof(digital) => gesamte Grösse, nicht Anzahl Elemente
sizeof(digital[0]) => Grösse von IO_DIGITAL

Wenn man bei Arrays die Anzahl Elemente wissen will, dann nimmt man 
üblicherweise sowas wie (sizeof(a) / sizeof(a[0]))

von Yalu X. (yalu) (Moderator)


Lesenswert?

Stimmt doch: Die Größe von IO_DIGITAL ist
1
  3 · 4 Bytes (value, dt und tm)
2
+ 3 · 1 Byte  (io, block_time und rsvd)
3
+ 1 · 1 Byte  (flags)
4
—————————————
5
     16 Bytes

Da das Array acht Elemente enthält, ist es achtmal so groß, also 128
Bytes.

von chris (Gast)


Lesenswert?

> sizeof(digital[0]) // hingegen gibt 16 zurück

ist auch klar weil

>typedef struct                      // 128 Bit
>{
>...
>} IO_DIGITAL;

128bit = 16 Byte gross ist.

Damit ergibt

> sizeof(digital)

128 Byte, da 'digital' aus 8 'IO_DIGITAL' Datensätzen mit je 16 Byte 
besteht

von chris (Gast)


Lesenswert?

..., da war schon jemand schneller ...

von David H. (davidm)


Lesenswert?

Ich glaub ich hab da echt einfach Bit und Byte verwechselt :-)
Aber auch nen schöner Zufall das dieses array 8 groß ist.

Danke jungs!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.