C xc8

Jan Waclawek konfera na efton.sk
Středa Prosinec 6 09:49:09 CET 2017


To su prave tie body kde sa ukazuje, ze C++ je iny jazyk. V C je taka
konverzia dovolena, ale nemusi dopadnut dobre; C99 6.3.2.3#6:

Any pointer type may be converted to an integer type. Except as previously
specified, the
result is implementation-defined. If the result cannot be represented in
the integer type,
the behavior is undefined. 

Ak by si skusil gcc, nie g++:

f.c:3: warning: initialization makes integer from pointer without a cast
f.c:3: error: initializer element is not computable at load time

Inaksie povedane, bez ohladu na ten zavinac-operator, prekladac nemusi
vyhlasit chybu, ba dokonca moze prekladac mat aj implementovanu taku
konverziu, ktora je v char reprezentovatelna, a potom je vysledok
implementacne zavisly (t.j. mal by byt zdokumentovany v dokumentacii k
prekladacu).

wek


PS. To C++ nepoznam. Pozrel som si mojho oblubeneho Dereka Jonesa a tam sa
pise, ze aj v C++ je to dovolene, ale formulacia je inaksia:

A pointer can be explicitly converted to any integral type large enough to
hold it.

Z toho potom vyplyva ta rozdielna chyba v gcc a g++. V g++ nastane chyba
pri konverzii; v gcc - a tu musim povedat, ze som pouzil avr-gcc, lebo to
je dolezite -  pri tej konverzii len vyhlasi warning a chyba nastane pri
pokuse generovat direktivu "zober najnizsi byte z integeru" pre linker,
pretoze hodnota toho pointra nie je v okamihu kompilacie znama. 

const int iitLoader = "BootLoader";

skonci v gcc len tym warningom.




----- Original Message ---------------

Subject: Re: C xc8
   From: Miroslav Šinko <sinkomiro at gmail.com>
   Date: Wed, 06 Dec 2017 01:07:11 +0100
     To: HW-news <hw-list at list.hw.cz>

>Problem je, ze pri tom druhom zapise sa kompilator snazi vobec nieco robit.
>
>Definicia adresy je velmi specificka, bez nej konci kompilacia inymi 
>kompilatormi nasledovne:
>
>const char ootLoader = {"BootLoader"};
>
>VC:
>error C2440: 'initializing' : cannot convert from 'const char [11]' to 
>'const char'
>There is no context in which this conversion is possible
>
>g++:
>error: invalid conversion from 'const char*' to 'char'
>
>miro
>
>On 5.12.2017 22:28, konfera at efton.sk wrote:
>> To prve definuje pole charov dlzky danej inicializatorom, a nainicializuju ju tym retazcom.
>>
>> Tie druhe dva definuju na adrese 0x30 premennu typu char (t.j. jedeb jediny byte), do ktorej sa snazia narvat (nainicializovat ju na) pointer na retazcovu konstantu (string literal). Ta pochopitelne moze byt potom umiestnena kdekolvek.
>>
>> wek
>>
>>
>>
>> -----Original Message-----
>>
>> From:  "Miroslav Draxal"<evik at volny.cz>
>> Subj:  C xc8
>> Date:  Tue 5. Dec 2017 17:24
>> Size:  2K
>> To:  "'HW-news'"<hw-list at list.hw.cz>
>>
>>       Dobrý den,
>> Ne3 to ode1lu jako bug vxc8, optám se zdej1ích odborníku.
>>
>> const char ootLoader [] @0x30 = {"BootLoader"};
>>   ulo3í do ROM od adresy 0x30
>>
>> const char ootLoader  @0x30 = {"BootLoader"};
>>
>> ulo3í do ROM od adresy 0x100 pro procesory do 8kW, 0xf00 pro procesory do 64kW bez upozorniní.
>> Myslíte, 3e je ktomu nijaký duvod?
>> Díky za reakce, Míra
>>
>> Ps. Navazuje na vlákno PIC XC8 Bootloader
>>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list at list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>_______________________________________________
>HW-list mailing list  -  sponsored by www.HW.cz
>Hw-list at list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list