[elektro] C - memset

elight elight at gmail.hu
Wed Feb 3 14:43:02 CET 2016


Köszi,
Csak az okokat kerestem
..szóval történelmi oka van..
Tehát mindig az alapértelmezett a gyártó szerinti,
és ahogy ettől függetlenül  használom
azt kell időnként  beállítani.
Így már értem, miért van tele az a progam ilyesmivel,
amit nézegettem. :-)
Üdv István

2016-02-03 14:35 keltezéssel, SZIGETI Szabolcs írta:
> A C szabvány szerint bárhova berakhat kitöltő bájtokat, ha valamiért így
> kívánja. Bizonyos esetben nem is lehet másként, pl a 68000 cpu csak páros
> címen tud 16 bites értéket címezni, különben bus error. De ugyanennek lehet
> teljesítmény oka is, hiszen nem mindegy, hogy egy vagy két memóriaciklussal
> érsz el egy adatot. Manapság általában ez az indok.
> Ezért a fordító úgy pakolja az változókat, hogy páros vagy néggyel osztható
> stb. címre essenek.
> De ez neá mindig jó, pl. ha memóriába ágyazott io van kötött
> regiszterekkel, vagy egy fájlból kell egy kötött formátumú rekordot
> beolvasni, vagy csak simán meg kell spórolni pár bájtot.
> Ekkor utasítod a fordítót, hogy ne rakjon be kitöltő bájtokat.
> Megjegyzés: ezért is javasolt a sizeof() használata mindig.
>
> Szabolcs
> 2016.02.03. 14:24 ezt írta ("elight" <elight at gmail.hu>):
>
>> Szia
>>
>> Elöljáróban,
>>    ennek még nem néztem utána
>> de GCC nél nekem is már bökte a listában a szemem
>>
>> __attribute__((packed))
>>
>> ez alatt pontosan mit is kellene értenem,
>> hogyan is működik? Vagyis mikor illik használni?
>>
>> Üdv István
>>
>>
>>
>> 2016-02-03 14:19 keltezéssel, Moravcsik Szilard írta:
>>> 2016.02.03. 13:26 keltezéssel, uprogc . írta:
>>>> Sziasztok,
>>>>
>>>> ( STM32, gcc )
>>>>
>>>> Van egy strukturam, amelyben van egy 32 bites es ket 8 bites valtozo.
>>>> Ennek a merete 6 byte.
>>>>
>>>> Ha memset() eseten a struktura meretet sizeof(tipus)-al megadom, akkor
>>>> rendben van, ha viszont konstans 6 ertekkel adom meg a meretet, akkor az
>>>> elso byteot nem allitja be a memset :)
>>>>
>>>> Ez mi ?
>>>>
>>> Sziasztok!
>>>
>>> Érdekelt, kipróbáltam (EmBlocks bare-metal-gcc), amíg a friss kávémat
>>> kortyolgattam:
>>>
>>> /* A struktúrám típusa: */
>>> typedef struct{
>>>      uint32_t tag32;
>>>      uint8_t tag8_1;
>>>      uint8_t tag8_2;
>>> } __attribute__((packed)) TEST_t;
>>>
>>> /* A kód: */
>>> int main(void){
>>> TEST_t test;
>>> uint8_t len;
>>>
>>>      len = sizeof(TEST_t);     /* 6 byte lett a pakolás után */
>>>
>>>      memset(&test, 0, 6);
>>>
>>>      test.tag32  = 0x12345678;
>>>      test.tag8_1 = 0x55;
>>>      test.tag8_2 = 0xAA;
>>>
>>>      memset(&test, 0xFF, 6);
>>>
>>>      return 0;
>>> }
>>>
>>> Nálam rendben megcsinálta azt, amit vártam tőle. Először memset()-tel
>>> feltöltöttem 0-kkal, azután egyenként értékekkel, a végén meg
>>> memset()-tel az egészet 0xFF-fel.
>>>
>>> Persze az __attribute__((packed)) attribútum nélkül 8 byte méretű lett
>>> volna.
>>>
>>> Üdv:
>>> Szilárd
>>>
>>>
>>>
>>> ---
>>> A levél vírus, és rosszindulatú kód mentes, mert az avast! Antivirus
>> védelme ellenőrizte azt.
>>> https://www.avast.com/antivirus
>>>
>>> -----------------------------------------
>>>             elektro[-flame|-etc]
>>>
>> -----------------------------------------
>>            elektro[-flame|-etc]
>>
> -----------------------------------------
>            elektro[-flame|-etc]



More information about the Elektro mailing list