Fórum témák
» Több friss téma |
Idézet: A linkernek nincs joga kihagyni semmit, tehát ha befordítottad a kódba, akkor az ott is lesz.„Azokat a linkernek kellene kiszednie, de ugy nezem a linker nem ilyen okos (hacsak nem magatol csinalja ezt meg). Lehet a Librarian az okosabb es minden fuggvenyt ha kulon konyvtarba teszel akkor csak azt a konyvtarat fogja neked bepakolni amire szukseged van...” A könyvtáraknál (lib) más a helyzet, mivel abból csak igény esetén csatolja be a kódot a linker - ha feloldatlan függvénynevet talál és a linker rendelkezésére bocsájtott lib-ekben megtalálható az adott függvény. Összefoglalva tehát: a linker a projektből kihagyni nem tud, de a libekből tud nem belinkelni. ![]()
Akkor tehát jól értem, hogy nincs megoldás arra, hogy ha van néhány rendszeresen használt függvényem egy fájlban, akkor azok közül csak azok jelenjenek meg a végtermékként előállított kódban, amik használva is vannak? Nekem ez valahogy nem fér a fejembe.
Már hogyne lenne megoldás: lib-et kell csinálni belőlük! Pont erre találták ki.
És azt hogy tudom úgy megoldani, hogy lehetőleg ne legyen sokkal bonyolultabb, mintha normál fordítást csinálnék?
Szerintem a User's Guide leírja. Én legalábbis abban keresném. Az MPLAB-ban biztosan át kell állítani egy opciót: nem normal projekt (nem végrehajtható kód), hanem library lesz a kimenet. Továbbá nem lehet projektben main() függvény. Én még csak újrafordítást csináltam (PIC18 mikrovezérlőkhöz), ott csak a gyári batch fájlokat kellett futtatni.
Valoszinuleg felre ertettel. En az elmeletrol beszelek, nem a gyakorlatrol. Elmeletileg csak a linker tudna, hogy mely globalis fuggvenyekre van hivatkozas, tehat csak es kizarolag a tudna eldonteni, hogy ki lehet-e hagyni a jatekbol vagy sem. Pontosan ugyanugy, ahogy egy libne: Ha nincs hasznalba egy object akkor azt nem teszi be ez evidens -- ha nincs hasznalva egy globalis (tehat nem static kulcsszavazott) fuggveny, akkor a linker kihagyhatna azt, ha nincs ra hivatkozas semelyik forrasbol.
Sajnos ő sem tudhatja, ha pl számított függvénypointerrel hivatkozol rá, honnan tudná?
A számított függvénypointert miből számolod ki?
Akkor a fuggveny pointerbol tudja, hogy hivatkozol ra... Magyaran a fuggveny pointert tudja, hogy pl egy pointeres valtozonak atadod. Ha a valtozot aztan nem hasznalod, akkor az optimalizacio kigyomlalja. Tehat akkor mar az object file-ban a hivatkozas sem lesz benne mikor mar a linker 'kezhez kapja'... Fuggveny kiradiroz, nem kell...
pl ha a függvényeket fix címre fordíttatompl 1000, 2000..., utána azt mondom a=1000, b=....valami egyéb művelet pl soros port majd az a+b-re hivatkozom akkor a linker semmit sem tudhat,
vagy ki tudja még milyen trükköt vetek be függv. címének kiszámításához, ezért nem teheti a linker, de nem kivánok veled vitatkozni
Nem mondom, hogy nem lehetetlen, de hányszor csináltál eddig ilyet? Meg ugye ez egy opció kellene, hogy legyen, és ha arra van szükség, hogy ne vegye ki, akkor ki lehetne kapcsolni és probléma megoldva.
Hali! Én azt mondom erre az esetre, a fordító csinálja azt ami a progiban le van írva, időnként úgyis elég meglepetést okozhat az egyéb optimalizálás
Én is erre próbáltam utalni a #1062332 hozzászólásomban ( igaz, még nem csináltam ilyet! ) !
Steve
Felkeltette az érdelkődésem a szakmai vita
![]() Keil uVision IDE -> C51 fordítóval dolgoztam egy időben, és az nagyon szépen kiírja warningba ha nem hívott függvény van, és nem is linkelni Idézet: „linking... *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_OSSZEAD?PROBA” A függvénypointer esetén ahogy trudnai írta, befordítja függetlenül attól, hogy a pointer egyáltalán bárhol használva van-e.
Amit pipi írt, az is igaz, de az már tényleg extrém hacking ![]() ![]() Idézet: „pl ha a függvényeket fix címre fordíttatompl 1000, 2000..., utána azt mondom a=1000, b=....valami egyéb” Egyreszt en nem hinnem, hogy jo technika ez -- bar lehet extrem esetben szukseg van ilyesmire, de ha minden 100-al oszthato szoko evben van csak szuksegunk erre, nem kellene emiatt egy ilyen optimalizacios lehetoseget eldobni. Masreszt pedig ha megis 100-al oszthato szoko evet irunk eppen, akkor ha azt meg tudod adni, hogy hova keruljon, akkor nyilvan azt is meg tudod adni, hogy ne optimalizalja ki a fordito (akar ez lehet automatikus is egy forditonal, tehat ha te specifikalod egy fuggveny elhelyezkedeset akkor a fordito es a linker lehet akar olyan okos is, hogy nem optimalizalja ki). GCC-nel pl (C30 / C32 forditok gcc alapuak, ki kellene probalni):
Idézet: „used This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly. When applied to a member function of a C++ class template, the attribute also means that the function will be instantiated if the class itself is instantiated.”
Helló. Ha definiálok egy változót annak a bitjeit hogyan tudom defniálni HITECH c fejlesztőkörnyezet alatt?
Köszönöm szépen. Már értem a dolgot.
Ugy latom senkinek sem tunt fel, hogy 'bit_7_4' -nek kellene ott lennie 7_5 helyett
![]()
Aha, tesztelted figyelünk-e, hát megbuktunk eszerint
![]()
Miért? Nem úgy nevezed, ahogy akarod, a méretét utána adtad meg
![]() Steve
Ez igaz, ugy nevezem ahogy akarom, csakhogy programozas technikai okok miatt egy felrevezeto nev, sot egy felresikerult komment is hibanak minosul
![]() ![]()
Vártuk, hogy mikor veszed észre a hibádat
![]()
C18-ban az "ul" jelzés mit jelent?
unsigned long típusú változóba szeretném az alábbi számítást elvégezni:
De az MPLAB SIM szerint a szorzás után 4294958172 kerül bele, nem pedig 22862940. Viszont ha az egyik, vagy mindkét szám mögé írok egy "ul" szócskát, akkor jó lesz az eredmény:
A fordító alapból integer-ként értelmezi a számokat. Az "ul" megmondja neki, hogy unsigned long-ként értelmezze. Oda kell figyelni, mert sok bosszúságot okozhat. Érdemes külön leszimulálni a végeredményt különböző értékekkel, de gondolom te is épp ezért vetted észre, úgy hogy jól csináltad!
![]()
Köszi a választ!
Gondoltam rá hogy az lehet a baj hogy nem long-ként kezeli a számokat, de nem találtam semmi utalást rá sehol. Most használom először ezt a változótípust, ilyenkor (meg mikor hibát keresek) lépésenként nézem a Watch ablakot. ![]()
Szia,
Az ul pontosan azt jelzi a fordítónak hogy unsigned long tipusú legyen a konstans. Ha ezt nem adod meg akkor a C18 16biten tárolja az eredményt ráadásul előjelesen, majd ezt átadja a pro_seb változónak. Ami érdekes hogy előjel kiterjesztést is végez. Hexdecimálisan nézve az eredményt kicsit érthetőbb hogy mi történik: 12345 * 1852 = 0x15CDC5C A 16bites művelet miatt ebből 0xDC5C lesz. Mivel előjelesen értelmezi a számot, a változódba 0xFFFFDC5C kerül, ami decimálisan valóban 4294958172. Általánosan is igaz, hogy egy C fordító maximum int vagy unsigned int szélességre konvertálja egy művelet eredményét, még akkor is ha azt egy long tipusú változóban akarod tárolni.
Neked is köszönöm a részletes leírást!
![]() |
Bejelentkezés
Hirdetés |