Zacatecnicke dotazy v C

Pavel Kutina hw na prelude.cz
Čtvrtek Prosinec 17 22:26:16 CET 2015


Zdravim,

mozna me ukamenujete a mozna odkazete do prisusnych adres, ale mel bych par 
nejasnosti v uplnych zakladech C, tak jestli nekdo muzete a budete mit tu 
trpelivost... Pro poradek (hraje-li to roli, asi ano) uvadim, ze pisu v 
Energii (Arduino pro TI MSP a Stellaris, vcetne toho dementniho editoru).

//--------------------------------------

a) jak na zapis retezce nejak inteligentne? Potrebuju textove menu na 
displeji, texty mam v tomto tvaru:

char mnu[][17] =
{
     {'P' ,'r' ,'v' ,'n' ,0xED },
     {'D' ,'r' ,'u' ,'h' ,0xE1 },
}

Ten hex je samozrejme znak s diakritikou, pri primem zapisu ho prekladac 
preklada jako unicode a k dalsimu zpracovani podhodi dvojznak, neumim ho to 
odnaucit. Je to pouzitelne, ale cokoliv, nez par pismen se timhle zpusobem 
pise hodne pitome.

Pokud jsem pouzil zapis

char* mnu[] = {
    "Prvn\xED",
    "Druh\xE1",
};

tak to bylo vcelku OK, i -dejme tomu- pouzitelne a citelne v editoru. Hacek 
nastal v okamziku, kdy po takhle zapsanem znaku v retezci nasledovalo 
pismeno "e" - prekladac to pochopil jako unicode znak a ten s tou 
diakritikou plus to nasledujici "e" prelozil jako jeden (a zmrsil). Netusite 
nekdo, jak to obejit?

//--------------------------------------

b) jak funguje extern promenne? Mam vedle projektu odlozeny fonty ve 
fonts.c, v nem v podstate jen:

const uint8_t simpleFont[][8] =
{
 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 0x00
 {0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, 0x00, 0x00}, // 1
...

Kdesi v jednom header u jedne z knihoven je
extern uint8_t simpleFont[][8];

OK, funguje to - ale z ceho se linker dozvedel, kde tu promennou hedat? 
Obsah se nacita spravne, ale samotny fonts.c nemam nikde inkludovany, jen 
lezi ve stejnem adresari - to to fakt prolejza vsechny soubory v adresari, 
co kdyby tam ta deklarace nahodou nekde byla?

//--------------------------------------

c) asi jsem uplne nepochopil include, resp. rozdil mezi
#include <xxx.c>
a
#include "xxx.c"

Chapu dobre, ze pri pouziti hranatych zavorek prekladac hleda prislusne 
soubory nekde v definovanych mistech (nejake search paths, libraries atd.), 
kdezto s uvozovkami zacina prohledavat od aktualniho adresare?

//--------------------------------------

Mam samozrejme asi tak pet set dalsich drobnych nejasnosti, ale jednak se 
snazim googlit, druhak opisovat, ale nektere veci jsou tak obecne, ze ani to 
googleni k rozumnym vysledkum nevede. Hodne pomaha Herout, ale k tomu mi 
zase chybi druhy dil :)

Jako obvykle koncim mail provolanim "Zlaty Pascal!" (ostatne soudim, ze 
Kartago...), ale je pravda, ze syntaxe C se mi zacina libit cim dal vic a 
hodne ocenuju #define, to mi v Pascalu posledni dobou znacne chybi - to 
provolani uz neni tak hlasite, jako byvalo... Ale zase ta prace s retezci...

Diky za kazde navedeni spravnym smerem.

Pavel Kutina 



Další informace o konferenci Hw-list