[elektro] PIC C sztring

hg12345 hg12345 at freemail.hu
Tue Feb 28 08:37:02 CET 2012


Hi!

Igazad is van meg nem is !

Hogy egy fordító, hogyan helyettesíti a kódot az szerintem nem mérvadó

egy másik implementáció:

definiálva egy másik fordítási egységben:

char  Test2[]="123456789";
char *Test1;

a felhasznált fordítási egység:

extern	char *Test1;
extern	char  Test2[];

Test1=Test2;
Test1[3]=0xFE;
Test2[4]=0xFF;

A lefordult kód:

ldr r1,[pc#300]      ;Test1=Test2
ldr r0,[pc,#292]
str r0,[r1,0x00]

movs r1,#0xFE        ;Test1[3]=0xFE
strb   r1,[r0,#0x03]

movs r1,#0xFF        ;Test2[4]=0xFF
strb   r1,#[r0,#04]  

Azért abban igazad van, hogy az 
extern char [] 
egy konstans pointer definiál, ami nem módosítható (mint pointer nem lehet bal érték! :-) és a pointert azonnal címmel tölti fel, de ettől eltekintve minden másban egyezik a két eljárás. 

kiegészítve a kódot 

char Test3[]="Test";     //definiciós forditási egység

extern char *Test3;     //Ez már elvileg hülyeség, mert ez nem konstans pointer, de jól müködik mert átveszi a cimet!, a forditó meg nem tudja :-()

Test3=Test2;             //módosította a pointer értékét  (jogosan)     
Test3[5]=0xAA;         //  Test2[5]  adatát átírta

- A fenti megoldást a fordító jogosan lefordítja, mert nem tudja, hogy az eredeti helyen hogy van definiálva. Egy korrekt linkernek ezt a hibát jeleznie kéne, de a C linkerek ennyire nem állnak a helyzet magaslatán. Ha van a rendszerben MMU és a linker segmensek és az MMU összehangoltak, akkor Test3 pointer átírásakor egy végrejtási (irási) hibát kell az IT rendszernek jeleznie. 

- A konstans és a konstans pointer a C-ben csak fordító szinten kezelt megkötés, ha nem FLASH/ROM környezetben használod és nem ide fordul a pointer ill. a konstans tárolási helye (ez könnyen elöfordulhat, mert a sebesség miatt, RAM-ban tárolja az adatokat) akkor nagyon könnyen módosítható a konstans érték átvéve a címet és egy pointerrel rámutatva.....

----------------------------------------------------------------------------------------

Egy konstans pointer és egy pointer között csak annyi a különbség, hogy a fordító hibát dob a értékadás esetén.

----------------------------------------------------------------------------------------

Remélem a leírásom nem hibás és hiányos ;-), ha igen elnézést 






Palasik Sandor <palasik at mail.datanet.hu> írta:
>> extern char hello[];>
>
Igen, én is így gondolom.>
>
Azt szeretném elérni, hogy azok, akik szerint mindegy, hogy extern char * >
vagy extern char[], próbálják már ki mindkettőt, hogy mi történik.>
>
Palasik Sándor>
>
----------------------------------------->
          elektro[-flame|-etc]>




More information about the Elektro mailing list