Re: C: ja přiřadit ukazateli pevnou adresu v paměti?
Miroslav Mraz
mrazik na volny.cz
Sobota Leden 12 20:58:50 CET 2019
Ten typ přetypování by měl být úplně stejný jako má deklarace ukazatele.
Zkuste
volatile uint8_t *pPokus0;
pPokus0 = (volatile uint8_t*) 0;
i když takovýto typ ukazatele bude (nebo by měl být) konstantní, tedy
měl by být při deklaraci zároveň definován (inicializován).
volatile uint8_t * const pPokus0 = (volatile uint8_t * const) 0;
pak už jeho hodnotu nemůžete měnit (např. pPokus0++ je chyba), ale to
zřejmě ani není žádoucí.
Mrazík
Dne 12. 01. 19 v 17:45 Miroslav Draxal napsal(a):
> pPokus = (uint8_t *)0 ; // jsem zkoušel
>
> pPokus = (void *)0; // jsem nezkoušel
>
> jde o XC8
>
> volatile uint8_t *pPokus0;
>
> volatile uint8_t *pPokus1;
>
> volatile uint8_t *pPokus2;
>
> pPokus0 = (uint8_t*) 1;
>
> pPokus1 = (void*) 2;
>
> pPokus2 = 3;
>
> zkompiluje jako
>
> ! volatile uint8_t *pPokus0;
>
> ! volatile uint8_t *pPokus1;
>
> ! volatile uint8_t *pPokus2;
>
> ! pPokus0 = (uint8_t*) 1;
>
> ! pPokus1 = (void*) 2;
>
> 0x7C5E: MOVLW 0x2
>
> 0x7C60: MOVWF pPokus1, ACCESS
>
> 0x7C62: CLRF c, ACCESS
>
> ! pPokus2 = 3;
>
> 0x7C64: MOVLW 0x3
>
> 0x7C66: MOVWF value, ACCESS
>
> 0x7C68: CLRF 0x4A, ACCESS
>
> Z toho jde vidět, že
>
> pPokus0 = (uint8_t*) 1; //nezkompiluje,
>
> pPokus1 = (void*) 2; // je vítěz
>
> pPokus2 = 3; // tady upozorňuje.
>
> Takže pPokus1 = (void*) 2; je vítězem. Díky, Míra
>
Další informace o konferenci Hw-list