Fórum témák
» Több friss téma |
Rendben, köszi!
Közben rájöttem, hogy végül is ez a kód, amit az előbb írtam, egy sorba is beírható, így a rövid ideig történő "kinullázást" el is lehet kerülni. Bár nem szép, de ha nincs más megoldás, marad ez a maszkolás.
Tedd egyetlen sorba!
De makrot is gyarthatsz ra ha az egyszerubb neked:
Idézet: „Ezzel csak az a gond, hogy egy nagyon rövid időre ugyan, de a lábak alacsony jelszintet adnak majd, mielőtt az új értéket megkapnák.” A legtisztességesebb módszer a kizáró vagy kapcsolattal történő módosítás, ami konkurens folyamatoknál is használható. Például vegyük azt a helyzetet, hogy interrupton matatsz bizonyos biteket, a főprogramban pedig ugyanazon regiszter más bitjeit. Kínos volna, ha a főprogramban beolvasom a regisztert, közben az interrupt módosítja bizonyos bitjeit, én pedig a saját bitek módosítása után visszaírnám a többi bit RÉGI értékét! Az alábbi inline "függvény"-ben szereplő formula megoldja ezt a gondot:
A példádat ezzel így kell írni:
Természetesen az RMW probléma miatt a PORTB nem a legszerencsésebb példa, ezért vezették be a PIC18-tól fölfelé a LATA, LATB, stb. hozzáférést a kimeneti adatbufferhez. PIC24/dsPIC33-hoz pedig ebben a topikban található a téma diszkussziója és egy lehetséges megoldása.
Így van, az utolsó hozzászólásomban írtam is, hogy egy sorba is írható ez a kifejezés, így a rövid ideig történő kinullázást is elkerüljük. A makrós megoldás viszont tényleg szép, hiszen ezt a számomra "csúnya" kódot legalább csak egyszer kell leírni...
Sziasztok!
A feltételes fordítási direktívákkal gyűlt meg a bajom, de végül is sikerült orvosolni a problémát. Mivel elég furcsa a hibajelenség, gondoltam megosztom veletek. A projektem több forrásfájlból áll. A gondot az #if defined(...) direktíva lezárásaként szolgáló #endif direktíva jelentette. A main.c forrás végén elhelyezett #endif direktíva csak akkor nem okozott fordítási hibát, ha a direktíva után volt egy soremelés is. Ha pl. a soremelés kimaradt, vagy a soremelés után egysoros komment volt, akkor különböző hibákkal leállt a fordítás. Nem tudom, hogy ez bug avagy feature, de szerintem ez nagyon nem jó így. A rendszer: MPLAB IDE 8.63 C18 Compiler 3.36
Tipikus elkövetési hiba szerintem a C programozóknál, főleg include fájloknál.
Valahogy úgy felfogható, ha a fájlokat egybemásolod, akkor ugye a 2. fájl első sora, az első fájl utolsó sorába folytatásként másolódik be, és a fordító eszerint "értelmezi" azt az utolsó sort...
Szia!
Köszönöm a választ, bár szerintem félreérted (vagy én nem értelek meg rendesen). Az én olvasatomban a válaszod csak arra az esetre korlátozódik, amikor az #endif után nincs soremelés. Viszont akkor is kiakad a fordító, ha van soremelés, de utána pl. komment helyezkedik el. Valami ilyesmire gondolok:
Ekkor fordítási hibát dob. Szerintem nem kéne, hogy kiakadjon erre. Egyébként #if #endif nélkül mindig jól fordított, akár volt soremelés, akár nem.
A forráskód utolsó sora mindig egy újsor karakter kell, hogy legyen, függetlenül, hogy az utolsó előtti sor csak komment vagy valós utasítás.
Amúgy én sem értem, hogy a fordítóprogramok miért nem tesznek a fájlok végére a feldolgozás során sajátmaguktól egy plusz újsor karaktert.
Na erre látod nem gondoltam, pedig így, hogy említed nekem is beugrott. Köszönöm a válaszodat.
Idézet: Szerintem azért, hogy ne lehessen "véletlenül" fordítani, csak a megfelelő szabályok betartásával! Ugyanígy nem fogadja el például, ha a megjegyzésnek csak az elejét jelölöm (/* ) és így érne véget a program ( pedig néha jól jönne ), ez is biztosítja, hogy ne "bambulhassak el", oda kelljen figyelni.„Amúgy én sem értem, hogy a fordítóprogramok miért nem tesznek a fájlok végére a feldolgozás során sajátmaguktól egy plusz újsor karaktert.” Ez csak a magánvéleményem volt Steve
A kommentelésben igazad van, ugyanakkor ha a fájl végére betenne egy újsor karaktert, akkor nekem nincs elképzelésem róla, hogy ez bármilyen problémát is felvetne. Gondolom olyat senki se akar szándékosan csinálni, hogy egyik fájlban elkezdi a kommentet // jelekkel, majd másik fájlban fejezi azt be.
Sziasztok!
Látszólag tök egyszerű kérdésem van, de én a pdf-ek böngésésével nem találtam meg a választ. Szóval hogy lehetne constanst alkotni a rom-ba, hogy egy számot adok a karakterek elé, mögé. Ez az alap:
Ez kéne úgy, hogy működjön:
VB-ben ez a Chr$(10)&"Akármi" módon megolható, itt mi a megoldás? Soha nem kellett még így, de most igen. A legalapvetőbb dolgokat nem találom meg, miközben már ezer éve írom a kódokat. Szép mi?
A tömbelemeket vesszővel kell elválasztani, eddig OK, de az egészet kapcsos zárójelek közé kell tenni.
Azt nem tudom, hogy ez hogyan kombinálható stringgel.
Letre kell hoznod egy strukturat:
Most ez a pelda nagyon le van egyszerusitve, de remelem ertheto...
Köszi, de nem egészen ez a feladat. A fenti első kódrészlet a programmemóriába tárol le konstansként szöveg ASCII kódokat. Közé kéne tenni olyan értékeket, amik nem írhatóak le karakterekkel, mint pl. a 0, 12 stb. Tehát nincs szükség változókra, strutúrára, hanem arra lenne szükségem, hogy valahogy a előfordítónak el tudjam mondani, hogy a CHR$(0)-t tegye be a karaktereim közé.
Igen, ez is megvan, de pont az kéne, hogy kombináljam.
![]() Ez sajnos nem működik:
Elvileg birsz ilyet csinálni:
De egyelőre nem tiszta számomra, hogy ebből miért lesz a memóriában hexadecimálisan: 0A 61 01 62 02 63 03 64 00. A végén a 00 világos, a 0A-t nem értem, hogy hogyan keletkezett a 12-ből...
Alakul! Tényleg érdekes, hogy 2-vel kisebb szám kerül be a memóriába az első ponton! ?
A 128-as értéket még mindig valami karakterrel tudnám bevinni, jobb lenne számmal, mert ez egy cím és beszédesebb lenne. De eddig még ez áll a legközelebb a megoldáshoz! Köszönöm!
Azt hiszem megoldódott, legalább is így áttekinthető és jó is:
Köszönöm a segítségeket!
Egy indexszel akarsz végigmenni a két tömbön? Mert azt nem garantálja senki, hogy ezek mindig egymás után lesznek elhelyezve a memóriában.
Ja ertem mar mit szeretnel! Es valami ilyesmi?
es akkor ennek egy valtozata lenne:
UI: Stringbe 0-t ill '\0' -t ne tegyel lehetoleg, mert az a string kezelo fuggvenyeket fejre boritja...
Igen, de eddig úgy tűnik egymás után vannak, többet is deklaráltam. Azt mondod elkeverheti a fordító? Végül is miért ne! Na mindegy, majd ha megteszi, akkor eszembe fog jutni, hogy van ilyen, és akkor korrigálok!
Igen, elkeverheti. Valószínű, hogy nem fogja, de előfordulhat.
Ez is jól néz ki, köszönöm!
0-t nem teszek, azt beteszi a fordító a karakter végére. A te verziód végére nem tesz, ezért ha karakter vektorként akarom kezelni, akkor bizony nekem kell! Az én példámat is csak azért lehet összefűzni, mert egyrészt két változót teszek a szöveges elé, másrészt nem tesz be 0-t a végére. Két karakter vektort ezért nem is lehet össszefűzni simán a végén lévő 0 miatt. Idézet: „Igen, elkeverheti. Valószínű, hogy nem fogja, de előfordulhat.” Ezt ugye semmi sem garantalja -- pl egy bankon keves a hely, es lehet az egyiket meg oda be tudja nyomni a masikat mar nem... Az en verziomban a 0-t valoban illene oda biggyeszteni, azt kifelejtettem Idézet: „Ezt ugye semmi sem garantalja -- pl egy bankon keves a hely, es lehet az egyiket meg oda be tudja nyomni a masikat mar nem...” Az jutott eszembe, hogy ugye ezeknek a konstansoknak a memóriacímük ismert fordítási időben. Vajon lehetne-e valami ilyesmit csinálni?
Ez persze nem jó, de hátha valaki tud valamit, hogy lehetne ilyen ellenőrzést csinálni. Idézet: Szerintem fordításkor még nem ismert, csak linkeléskor dől el. „Az jutott eszembe, hogy ugye ezeknek a konstansoknak a memóriacímük ismert fordítási időben.”
Közben én is erre jutottam, hogy ez lehet, csak már nem tudtam az előzőt szerkeszteni...
Viszont futas idoben ellenorizheto, igy bekapcsolaskor / inicializalaskor meg kiabalhat, hogy valami nem stimmel. Azonban az osszes ilyesmi nekem kicsit ganyolasnak tunik.
Ezek az adatok szövegek, ha valami nem stimmel a sorrenddel, az könnyen kiderül a program kipróbálásánál. Eddig nem volt gond, meglátjuk lesz-e, ahogy bővül a lista. Egyébként egy 18F-nél nem nagy gond a programmemória olvasása a táblacímző regiszterekkel, szerintem nem lesz baj...
|
Bejelentkezés
Hirdetés |









