[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