Soubory *.h nemají ochranu proti vícenásobnému vložení (doplněno).
Makra se píšou velkými písmeny (jinak je to nepřehledné).
Parametrická makra musejí být důsledně závorkována.
Neuškodilo by si zvyknout na jeden formátovací styl a ten dodržovat, tohle je celkem chaos.
Nic nevracející funkce (void) nemusí mít “return”, lze ho však použít např. pro předčasné ukončení fce.
Jsou-li některé definice globální (potřeb ve více souborech), je vhodné si je dát do samostatného .h souboru a dle potřeby ho vkládat (každý .h nemusí mít svůj .c).
V souborech se podívej po po textech “todo” - jsou tam nějaké komentáře a návrhy.
Soubor ddd.h není nikde použit (ani použití zakomentováno). Každopádně je v něm výkonný kód - ten tam nemá co dělat.
Soubor převeden na .c a vytvořen .h. Tento programový modul sám o sobě však nemá smysl - nepůjde přeložit, patrně byl součástí jiného souboru (využívá definice z 1wire_PIC.c - spouštěcího souboru).
Některé soubory mají globální proměnné definované v .h souborech. Zcela špatně. Když už musí být proměnná globální a viditelná ve všech souborech (rozhodně nedoporučuji), deklaruje se v patřičném .c a do .h souboru se vloží s prefixem “extern” (nevytvoří novou proměnnou v každém souboru, pouze jim řekne, že už někde je a linker si ji najde).
Tento rozoraný projekt nejspíš přeložit nepůjde. Možná by bylo vhodnější sem dát na inspekci něco jednoduššího a podle toho pak upravovat ten větší projekt (nemám nainstalováno vaše IDE a překladač abych to uvedl do přeložitelného stavu). 1wire_PIC.zip (10.4 KB)
Uz som to nejako urobil aby to chodilo. Kontrolne otazky, ked chccem pridat nejake podprogramy ktore su v inom C subore, musim v hlavnom C nalinkovat H aj C, doteraz som bol v tom ze staci H, je pravda ze som maval C v zlozke source C.
CCS neumoznuje vypisovanie textu priamo z ROM ? ale musim zvlast kopirovat do ram pripadne ukladat priamo v ram ?.
By ma zaujimala nejaka vyhoda oproti Htech kompileru lebo zatial vidim same minus, vsetko sa robi komplikovane.
Nemusí, ani “nesmí”. Překladač ví, že .h a .c se stejným jménem patří k sobě. Naopak .h soubor se vkládá do svého .c pokud je potřeba (bývají tam různé definice, které .c soubor potřebuje).
Tak to vysvetlite prekladacu ze to tak ma byt, v Hlavnom*.C musim mat #include “lcd.c” inak to nechodi… v lcd.C zasa #include “lcd.h”, a je aj ina moznost v hlavnom*.C mat lcd.h aj lcd.c
Vtom případě je to blbě napsaný nebo je blbě nastavený IDE (který volá překladač), případně není zdroják přidán v projektu a IDE o něm neví (vloží ho tam až preprocesor).
Že je vložen lcd.h v lcd.c je vpořádku.
Ahoj, nevím jak toto specifikovat do googlu.
Chci mezi sebu vynásobit 2 int čísla a výsledek by se mi měl uložit do proměnné long. Jenomže kompilátor C30 mi výsledek násobení ukládá jako int a horních 9 bitů výsledku zahodí.
unsigned int U_BAT;
unsigned long UBAT;
U_BAT = 740;
UBAT = U_BAT * 31439;
V MPLABu v okně Watch vidím, že mám UBAT reprezentován jako 32b registr, ale při vynásobení se naplní jen spodních 16b a zbytek se mi nikam neuloží a ztratí se.
no ,je to logicky , U_BAT je 8bit tak vysledek bude taky max 8bit
UBAT = (U_BAT * 31439); zapis to takle
U_BAT * 31439 -> vysledek se ti ulozi do U_BAT a ten pak do UBAT
Panda38: Díky moc, funguje. Přesně jsi pochopil co potřebuju.
MiloPS3: No mě to vůbec logický nepřijde, že když mezi sebou nasobím 2 16b čísla a chci je uložit jako 32b že to uloží opět jen jako 16b.
Protože, to samo dělám se sčítáním, tam to funguje samo a bez problémů.
to je prave ono, neulozin se ti to do 32b ale nejdriv do 16b(U_BAT) a pak teprve do 32d proto se ti zdejchne nekam ten zbytek…
kdyz zapises U_BAT jako 32b tak to chodi,ze? , takze staci to dat do zavorek a nemusi mit U_BAT jako 32b,