Új hozzászólás Aktív témák
-
maestro87
őstag
Sziasztok!
Lenne pár kérdésem egy gyári függvénnyel, mivel nem vagyok egy programozó zseni.
1. while (WR) continue; kifejezésbe minek a continue? Szerintem tök felesleges, vagy mégsem?2. #define EEPROM_READ(addr) ((EEADR=(addr)),(RD=1),EEDATA)
Ezt sem tudom értelmezni, hogy miért vesszővel és nem pontos vesszővel vannak elválasztva egymástól az utasítások.
Ráadásul ezt egy függvény return-nal meghívja: return EEPROM_READ(addr);
És elvileg az EEDATA-val kellene hogy visszatérjen, szóval miért nem egyszerűen return EEDATA?Valaki elmagyarázná ezt nekem?
-
maestro87
őstag
Köszi, ezt így utólag sejtettem, csak sosem láttam/használtam még ezt a módszert. De most már fogom tudni és használni is fogom, hogy más kezdőknek se legyen egyértelmű az ÉN kódom.
Most találtam még egy számomra értelmetlen felesleges utasítást:
EEADRH = (badd >> 8) & 0x03;
EEADR = (badd & 0x0ff);1024 byte-os EEPROM, azaz 10 bites a cím, ezt osztja ketté (8+2 bit). Itt szintén feleslegesnek érzem, hogy 1-esekkel (&0x03, &0xff) 'és'-eli a cím biteket. Mert ha 1 volt, akkor 1 marad, ha meg 0 volt, akkor 0 marad. Kíváncsi lennék, hogy mikor írják a programot a nagy cégek programozói (pl. Microchip), milyen előre megfontolt szándékból tesznek be ilyen felesleges utasításokat? Azért egy 'és' kapcsolat is csak helyet foglal a szűkös program memóriában...
[ Szerkesztve ]
-
maestro87
őstag
A 'badd' az egy 16 bites unsigned int változó. Az 'EEADR' az meg 8 bites regiszter. Szerintem így is úgy is elvész a felső bájt, nem? A 11. 12. ... bit meg nem is írható/olvasható.
buherton: Értem, megpróbálok akkor rászokni, de mi zavarhatja be ezt az egyszerű műveletet?
Meg van valamilyen iromány erről (lehetőleg magyar), hogy milyen esetekben célszerű ezt alkalmazni?(#5446) zka67: Szerintem meg csak megzavarja az egyszerű embert.
-
maestro87
őstag
Sziasztok!
Printf-fel milyen formázó karaktert kell használni milliós nagyságrendek kiírásához?
Tegnap próbálgáttam %u-val és %l-el is kiíratni lcd-re pl. 6 milliót, de csak olyan 400 ezret írt ki helyette. Változót nem használtam, csak direktbe akartam kiíratni.
Egyébként egy float-ot (max. 100.0) kellene összeszoroznom egy 16 bites unsigned int-tel (max. 65535) és az eredménynek egész típusúnak kellene lennie. De így, hogy a printf sem azt írja ki amit akarok, nem tudom érdemben tesztelni a szorzást, debuggolás sajnos meg még nem megy.
Microchip xc8 lenne a fordító ha ez mond valakinek valamit.
Valaki nem tudja mi lehet a hiba? -
maestro87
őstag
válasz dobragab #5469 üzenetére
Pedig azt hittem világos voltam. Ez XC8 fordító ami 8 bites PIC mikrokontrollerek egyik fordítója és eléggé különbözik a programozás órákon megszokott C-től a változó típusok terén. A pdf a 143. oldaltól kezdve ír a változótípusokról.
Ez a %d meg a %f biztos jól működik windows-on/linux-on, de PIC-nél sajnos vannak eltérések még a változók között is. Itt az int pl. csak 2 byte-os. A lebegőpontos típusokra vonatkozó adatokat meg sajnos még a mai napig nem tudom értelmezni, hogy meddig használhatóak. Itt a float is csak 1-2 tizedesjegyig szokott pontos lenni, és nem értem miért.
Tehát, amit itt írtatok sajnos egyik sem működik jól.
Én csak ezzel az egyszerű sorral tesztelem egyelőre:
printf("%d", 6123456); // --> 28608-at ad vissza.
printf("%f", 6123456.0); // --> 6123520.000000
printf("%ul", 6123456); // --> 286081
Tehát amíg ezek sem működnek, nincs értelme szorzásról beszélni.
Ha nem muszáj meg nem szeretném két int típusú változóban tárolni a nem egész számokat is. -
maestro87
őstag
Szia, nem mondtam, hogy csak 16 bites számokat kezel, csak azt, hogy amit pl. windows-on beírsz int változót az alapból talán 24 vagy 32 bites emlékeim szerint, míg itt alapból csak 16 bites és előjeles. Előjel nélkülire %u-t kell használni, és ezek a \n, \r-ek sem igazán működnek itt. Ez utóbbihoz talán a write_lcd függvényemet kellene módosítanom.
A 6 tizedes pontosságot hogy számoltad ki, vagy hol írja?
Hogy számolod ki pl. a 24 bites float maximális értékét 3 tizedesjegy pontosság esetén?Amúgy #pragma --FLOAT=32 utasítással most lefordult, mindjárt kipróbálom a változást, de mint említettem már, jelenleg csak egy tizedesjegy pontosságra van szükségem (0.0-tól 100.0-ig), amit most is ki tudok íratni %f-fel gond nélkül,
csak ennek az egész számmal való szorzatát már nem (pl. 6 milliót). Tehát az eredményt már kerekíteni kellene egész típusra!
És ez a 32 bitre való állítás a fent általam leírt hibásan printf-felt egész értékeket még nem befolyásolja.Lehet, hogy még átállok az 10-zel, 100-zal, 1000-rel való szorzásra/osztásra,
de a milliókat akkor sem fogom tudni megjeleníteni.Egyébként még azt nem értem, hogy mi a különbség a 32 bites float, 32 bites double és a 32 bites long double között.
update: 32-bites float esetén is ugyanezt kapom: printf("%f", 6123456.0); // --> 6123520.000000
Ki kellene számolni már csak kíváncsiságból is, hogy meddig pontos, csak nem tudom hogy kell. Biztos a milliós nagyságrend már nem tetszik neki, de még a százezres sem. Illetve megnéztem az előbb, a %u is csak 65535-öt tud kiírni túlcsordulás nélkül, long-ra (32-bit) pedig végre megtaláltam, hogy a %lu-t kell használni (eddig %ul-lel próbáltam) és ugyanez jó unsigned short long-ra is. Bár utóbbi esetben szerintem feleslegesen felkonvertálja a printf függvény a short long-ot 32-bites long-ra, de most annyi baj legyen.[ Szerkesztve ]
-
maestro87
őstag
válasz jattila48 #5475 üzenetére
Köszi a kimerítő választ majd átrágom rajta magam.
Egyébként még azt találtam a printf-fel kapcsolatban (ha netán másnak is szüksége lenne rá), hogy az unsigned short long-ot nem támogatja, mert nem szabványos típus. Így a következő trükkel lehet kiírni:
unsigned short long valtozo = 16777215;
printf("unsigned short long: %lu", (unsigned long)valtozo); -
maestro87
őstag
válasz dobragab #5477 üzenetére
Parancssorból szerintem senki se fordít PIC programozásnál. Én még nem láttam ilyet. MPLAB-ban rábökök a build gombra és lefordítja. Pragma utasításokban kell pl. megadni a PIC beállításait: órajel, kódvédelem, egyes lábak funkcióit...
De ettől függetlenül lehet nem pragma-val kell átállítani, de csak így fordult le. Lehetne beszédesebb is az az adatlap... Most guglival sem találtam semmit, de most mindegy is mert átálltam inkább egész számokra. -
maestro87
őstag
Sziasztok!
Adott egy hasonló struktúra (ezt a netről szedtem):
struct Employee
{
char ename[20];
int ssn;
float salary;
struct date
{
int date;
int month;
int year;
}doj[3];
}emp = {"Pritesh",1000,1000.50,{{22,6,1990},{10,7,1980},{27,9,1970}}};A kérdésem az lenne, hogy csak a date struktúra tömböt (doj változót) hogyan lehet egy másik fájlban alapértékekkel feltölteni? Külön-külön tudom hogy kell az elemekre hivatkozni, de én egyszerre szeretném feltölteni, az értékeket kapcsos zárójelek között megadva.
A tippem ez lenne, de valamiért nem akar működni:
extern struct date doj[3] =
{
{22,6,1990},
{10,7,1980},
{27,9,1970},
};Annyi eltérés van az én kódomban, hogy én typedef-fel kívül hoztam létre a "date" struktúrát.
Előre is köszi a válaszokat! -
maestro87
őstag
válasz buherton #5650 üzenetére
Ezt így nem fordítja le. Szintaktikai hiba, nincs azonosító a deklarációban stb.
Pontosabban az én kódom így néz ki lefordítva erre a példára:header fájlban:
typedef struct
{
int date;
int month;
int year;
} date;
typedef struct
{
char ename[20];
int ssn;
float salary;
date doj[3];
} Employee;
Employee emp;A main függvénybe írva ezt, nem működik:
emp.date[]=
{
{,,},
{,,},
{,,}
};A pointer-est hogy gondoltad?
[ Szerkesztve ]
-
maestro87
őstag
válasz buherton #5653 üzenetére
Nem tudom működésre bírni.
Eddig csak úgy ment, hogy a fő struktúrán kívül is deklaráltam illetve extern taggal kivittem másik fájlba, de akkor szerintem az nem ugyanaz a változó volt mint a struktúrában lévő. Egyébként eeprom-ba íráshoz kellene, hogy a struktúrában lévő elemeket egy függvényhívással be tudjam írni, ne kelljen minden elemnél külön meghívni az eeprom-ba író függvényt. -
maestro87
őstag
-
maestro87
őstag
válasz dobragab #5657 üzenetére
Én ugyan C-ben még nem használtam
goto
utasítást, de sosem értettem, hogy miért félnek tőle az emberek. Még talán assembly-ben is megkérdőjelezik a használatát, pedig ott tudtommal más megoldás nem nagyon van ciklusok létrehozására.Viszont a
continue
utasítást valaki eltudná magyarázni, mert ebből nem nagyon értem. Ugyanaz lesz a kimenetcontinue
-val és nélküle is, akkor meg minek bele? -
maestro87
őstag
válasz ToMmY_hun #5662 üzenetére
Lehet online futtatni a kódot és ha kitörlöd a
continue
-t ugyanaz lesz a kimenet. Aza = a + 1
miatt nem printeli ki a 15-öt, nem acontinue
miatt.Értem, tehát akkor a
continue
után elölről kezdődik a ciklus.
Akkor viszont ez a helyes példa kód a használatára:#include <stdio.h>
int main ()
{
/* local variable definition */
int a = 10;
/* do loop execution */
do
{
a++;
if( a == 15)
{
/* skip the iteration */
continue;
}
printf("value of a: %d\n", a);
} while( a < 20 );
return 0;
}Kimenetek:
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
value of a: 20continue
nélkül itt tényleg kiírja a 15-öt is.Már van is egy ötletem hol tudnám ezt használni a jelenlegi kódom optimalizálására. Köszi.
-
maestro87
őstag
válasz ToMmY_hun #5664 üzenetére
Nem vagyok már annyira kezdő, kb 5 éve hobbi szinten programozgatok mikrokontrollereket.
Nekem újra fordítja (már amikor bírja a szerverük).
De a kedvedért most gyorsan lefuttattam CodeBlocks-ban is, és az van amit mondtam, semmivel sem másabb a kimenetcontinue
nélkül. Szerintem nézd át azt a kódot még egyszer.
Acontinue
itt csak annyit csinál, hogy a feltételt még egyszer leellenőrzi a hatására ami már nem fog teljesülni a feltételben lévőa = a + 1
miatt. Tehát itt semmi szerepét nem látom, ellenben az én példámmal ahol azif
előtt van értékadó utasítás is.[ Szerkesztve ]
-
maestro87
őstag
válasz EQMontoya #5667 üzenetére
Én az ilyeneket mindig egy
++i
-vel oldottam meg. Amíg nem találok (csinálok) olyan példát, amiben tényleg hasznos lesz acontinue
(értsd. lerövidíti a kódot), addig csak olyan felvágós utasításként fogom kezelni. Felvágós, mert szerintem kevesebben értik vagy később tanulják meg a használatát (mint most én is) és sokszor feleslegesen használják, mint pl. most te is a++i
helyett.
Ráadásul a++i
szerintem kevesebb utasításból áll, mint acontinue
, mármint asm-re lefordítva.
Bár lehet mindjárt visszavonom az egészet, ahogy jobban nézegetem a kódodat.
Vissza is vontam, mertcontinue
nélkül meghívná a függvényt a negatív számokra is, azaz kimaradna a tesztelés.A C++-t is elkezdtem már tanulgatni, de még nem jöttem rá, hogy mitől jobb a C-nél, mit lehet C++-ban megoldani amit C-ben nem, vagy csak jóval bonyolultabban...
[ Szerkesztve ]
-
maestro87
őstag
válasz dobragab #5672 üzenetére
Igen, közben rájöttem, hogy két egymásba ágyazott
if
(vagy egyif
-ben két feltétel) többet ehet memóriában is.Ha struktúrákat használok az nem nevezhető már objektumorientált programozásnak? Nekem egyszer valaki azt mondta a forráskódomra, hogy olyan mintha C++-ban lenne, pedig akkor még nem is nagyon használtam struktúrákat sem.
(#5673) ToMmY_hun: C++-t Visual Studio-ban szeretném majd használni, azért tanulgatom, nem MCU-hoz.
(#5674) EQMontoya: Sok lúd disznót győz. Meggyőztetek.
(#5675) ToMmY_hun: Már azzal is baj van?
[ Szerkesztve ]
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Sony MILC fényképezőgépcsalád
- WoW avagy World of Warcraft -=MMORPG=-
- Kerékpárosok, bringások ide!
- sziku69: Fűzzük össze a szavakat :)
- Építő/felújító topik
- Telekom mobilszolgáltatások
- Poco X6 Pro - ötös alá
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Politika
- Épített vízhűtés (nem kompakt) topic
- További aktív témák...