Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   132 / 153
(#) otvenkilenc hozzászólása Aug 25, 2016 /
 
Tud valaki abban segíteni, hogy van e olyan szótár, táblázat amivel a C nyelv egye elemét letudnám forditani értelmezni? Példa:

if (PIR1.TMR1IF) {
TMR1_counter++;
PIR1.TMR1IF = 0;
}

Az If utáni kifejezés nem világos számomra, a PIR1.TMR1IF -t tudom mit jelent de hogy a kapcsos zárójel mit azt nem. Mi a feltétel a kettő között? Valamint a

TMR1_counter++; -ban a két kereszt. Azt tudom, hogy egyébként erős méreg De itt is azt jelenti? (nekem igen mivel fogalmam sincs mit akar jelenteni)

vagy ez: TMR0_counter==3906 nagyon egyenlő? Annyira hogy ennél már nincs egyenlőbb?
másik: TMR0_counter&19 ezt se értem
for( ; ; ) ezt sem, -szét kellett húzni mert a weblap smájlinak érzékelte.
init_ports() a zárójel mit jelent? Melyik portot állítja be? A semmit ami a zárójelek között van?
Köszi előre is a segítséget.

Ebben volt ami így kezdődik:
if (PIR1.TMR1IF) {
TMR1_counter++;
PIR1.TMR1IF = 0;
}

nem találom az if végét azt mivel jelölik a C -ben?
A hozzászólás módosítva: Aug 25, 2016
(#) Elektro.on válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Szia!

Többször írtam, hogy én nem vagyok C goro, inkább pascal-t használok, de ehhez muszály hozzászolnom.
Erősen úgy érzem, hogy a program nyelvekben egyáltalán nincs semmi tapasztalatod.
Idézet:

if (PIR1.TMR1IF) {
TMR1_counter++;
PIR1.TMR1IF = 0;
}

Az If utáni kifejezés nem világos számomra, a PIR1.TMR1IF -t tudom mit jelent de hogy a kapcsos zárójel mit azt nem. Mi a feltétel a kettő között? Valamint a
Ha a PIR'.TMR1IF jelző bit értéke 1 akkor lefut a kapcsos zárójelben lévő kód.
Idézet:
„TMR1_counter++; -ban a két kereszt”

C ben a változónév++ Inkrementálást jelent (egyel növeli az értékét).
Idézet:
„vagy ez: TMR0_counter==3906 nagyon egyenlő?”

A két egyenlőségjellel az azonosságot vizsgálják és nem értéket ad.
Idézet:
„init_ports() a zárójel mit jelent?”

Ez egy parémer nélküli függvény. Ha lenne valami változó deklaráció a zárojelben azt a függvény meghíváskor megkapná bemenő adatnak.
(#) cross51 válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Ahogy olvasom amit írtál, kicsit meg vagy kavarodva.

Nagyjából a kérdésekre gyors válasz:
a {} arra utal, ha a feltétel igaz, jelen esetben PIR1.TMR1IF == 1 akkor végrehajtja a TMR1_counter++ és PIR1.TMR1IF = 0-át.

A TMR1_counter++ ekvivalens a TMR1_counter = TMR1_counter + 1-el (inkrementálás a neve és a fordítottja a -- dekrementálás)

Ezt a nagyon egyenlő dolgot már egy gépes programozótól hallottam, nem tudom honnan szedik a gépesek ezt a hülyeséget, az (1 db) = egy változót egyenlővé tesz egy x értékkel, a (2 db) == meg vizsgálja a változót, hogy egyenlő-e y értékkel.

TMR0_counter & 19 ez azt jelenti, hogy egy ideiglenes érték egyenlő lesz a TMR0_counter (AND) 19.

() a zárójel ide a függvény/metódus (ki hogy szereti) argumentumai kerülnek az init_ports prototípus függvénye valószínűleg így néz ki void init_ports(void) tehát nem vár bementi paraméter is nem is tér vissza értékkel, de ezt ha nem ismered erről többet kell olvasni.

Az if vége mint az elején írtam a (eleje){ (amit csinálni akarsz) }(vége).

Én innen tanulgattam a C-t mikor először assembly után bele kezdtem a C-be a for-t azért nem fejtettem ki mert akkor a for, while, do while, if, switch, case, break, default, stb... le kellet volna írjak, de ez a linken mélyebben ki van fejtve.
(#) Hp41C válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Idézet:
„Az If utáni kifejezés nem világos számomra, a PIR1.TMR1IF -t tudom mit jelent de hogy a kapcsos zárójel mit azt nem.”

A C feltételes utasításában a feltétel után csak egy utasítás állhat. A kapcsos zárójelle körülvett utasításokat a fordító egy utasításnyi egységnek veszi.
Idézet:
„TMR1_counter++; -ban a két kereszt.”

A ++ egy növelést, a -- egy csökkentést jelent. A módosítás elvégzésének idejét a leírás határozza meg: --TMR1_counter a kiolvasás előtt csökkenti, a TMR1_counter++ a kiolvasás után növeli a TMR1_counter értékét.
Idézet:
„TMR0_counter==3906 nagyon egyenlő?”

A szimpla = az értékadás a dupla az egyenlőség vizsgálat jele.
Idézet:
„for( ; ; )”

A for (utasítás1; utasítás2;utasítás3) elfajult alakja. egyik utasítás helyén sem áll tényleges teendő. Ez egy végtelen ciklius, ha nincs benne break.
Idézet:
„init_ports() a zárójel mit jelent?”

Függvényhívást. A () különbözteti meg a változó névektől.
BRIAN W. KERNIGHAN – DENNIS M. RITCHIE A C programozási nyelv
A hozzászólás módosítva: Aug 25, 2016
(#) cross51 hozzászólása Aug 25, 2016 /
 
Sziasztok!

Valaki meg tudná mondani, hogy az aligned(x) és a packed attribute mit jelent/jelöl?
Próbáltam az XC32 User Guide-ból kiszedni, de nem tudom átértelmezni magyarra.
(#) otvenkilenc válasza Elektro.on hozzászólására (») Aug 25, 2016 /
 
"Erősen úgy érzem, hogy a program nyelvekben egyáltalán nincs semmi tapasztalatod." Biztosan így van ahogyan írtad). De erről megtudnád azokat is győzni akiknek annó programokat írtam nagy gépekre ( IBM370)? Folytatva amikor meg megjelentek a ZX-k aComodorok és a PC -n használatos program nyelv, stb.
No de ez nem érdekes.

"Ha a PIR'.TMR1IF jelző bit értéke 1 akkor lefut a kapcsos zárójelben lévő kód."
(PIR1.TMR1IF) ebből hogyan állapítom meg, hogy logikai 1 nek kell lennie és végrehajtódnia ?

(PIR1.TMR1IF=1) ez a kifejezés ránézésre érthető

Ha nincs oda írva akkor nulla az értéke? Érted mi az amit kérdezek? Az ami ránézésre okoz gondot ha a nyelvet nem ismerje nézi?

"C ben a változónév++ Inkrementálást jelent (egyel növeli az értékét)."
Mi baja volt a fordító programkészítőjének a +1 formával ami logikus is?

akarmi+1

karakterszámban is ugyanannyi és ránézésre tudni, hogy megnövelte az értékét eggyel.

"A két egyenlőségjellel az azonosságot vizsgálják és nem értéket ad."
TMR0_counter EQ 3906 ezt kapásból érti az ember

"init_ports( Ez egy parémer nélküli függvény. Ha lenne valami változó deklaráció a zárojelben azt a függvény meghíváskor megkapná bemenő adatnak. "
Ha nincs bemenő adat akkor minek adja meg, mit álíit be és Én azt honnan tudom hogy mit milyen értékre állít?

No és ez for( ; ; ) ? mit is jelent?
(#) otvenkilenc válasza cross51 hozzászólására (») Aug 25, 2016 /
 
"Ahogy olvasom amit írtál, kicsit meg vagy kavarodva." Pontosan így van ahogyan írtad. Nem beszédesek az utasítások a szintaktika nehezen érhető ránézésre. egy olyannak aki nem ismeri mélységében a C nyelvet. Sosem volt a kedvencem ez a program nyelv.

TMR0_counter & 19 ez azt jelenti, hogy egy ideiglenes érték egyenlő lesz a TMR0_counter (AND) 19.
Ezt elmagyráznád?
Valami olyasmi, hogy TMR0_counter tartalmával és a 19-l (ami lehet bármilyen számrendszerbeli érték) És műveletet végez?

"void init_ports(void) tehát nem vár bementi paraméter is nem is tér vissza értékkel, " Akkor mi értelme van? Akkor mit is csinál? Csak hogy több sort írjanak?

Az if vége mint az elején írtam a (eleje){ (amit csinálni akarsz) }(vége). Mivel jelzi a végét? End vagy itt_a_vége_fuss_ el_ véle sor is jelezhetné az If végét.
(#) Elektro.on válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
if(PIR1.TMR1IF) a fordítók úgy értelmezik, hogy (PIR1.TMR1IF=True) jelen esetben a True azonos az 1 értékkel. 2, 3 nem is lehet csak 0 és 1 ebben az esetben mivel boolean típus.
Idézet:
„"C ben a változónév++ Inkrementálást jelent (egyel növeli az értékét)."
Mi baja volt a fordító programkészítőjének a +1 formával ami logikus is?”

Akár hány C leírást olvastam azt írják, hogy gyorsabban fut le ebben a formában. valószínűnek tartom, hogy csak PC re érvényes. Viszont a nyelvi sajátosságokat örökölte. Mélyebben nem tudom az okát, nem én
írtam a C fordítót
. Pascalban nincs ilyen.
Idézet:
„init_ports()”

Ez egy függvény! Nem állít be semmit. Illetve az általad beleírt feladatot végrahajtja. Mint Bármelyik, akár PC re írt függvény. Ha korábban programoztál akkor tudod mi a függvény fogalma. Illetve akár matematikára is lehet asszociálni. Az, hogy a függvény nevében benne van a "port" szó , ne tévesszen meg. Lehetne az akár fizu_szamitas() is. Vagy mondjuk
Fizu_szamitas(ledolgozott_napok: integer; oraber: integer) (tudom ez egy kicsit pascalos ...)

Az általad említett init_ports() függvényben valószinűle a port irányok , illetve AD konvertel és egyéb beállítások vannak.
Ennek nyilván nincs visszatérési értéke. Pascalban ezt Procedure() eljárással csinálnám függvény helyett.
A hozzászólás módosítva: Aug 25, 2016
(#) Hp41C válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Látom, ismered a FORTRAN nyelvet, de ez most a C. Belinkeltem egy magyar nyelvű könyvet róla. Benne van minden kérdésedre a válasz...
Idézet:
„if (PIR1.TMR1IF) ...”

Az if utasítás leírása szerint az if után egy kifejezés áll. "Az utasítás először kiértékeli a kifejezést, és ha ennek értéke igaz (azaz a kifejezés értéke nem nulla), akkor az 1. utasítást hajtja végre. Ha a kifejezés értéke hamis (azaz nulla) és van else rész, akkor a 2. utasítás hajtódik végre." Történetesen a PIR1.TMR1IF egy logikai változó aminek értéke hamis azaz 0 vagy igaz azaz (nem 0) lehet. Másrész ki is írhatod: if (PIR1.TMR1IF==1) alak is helyes.
Idézet:
„"C ben a változónév++ Inkrementálást jelent (egyel növeli az értékét)."
Mi baja volt a fordító programkészítőjének a +1 formával ami logikus is?”

Kicsit bonyolítsuk már tovább (előre is bocsánatot kérek....):
Legyen két tömbünk:
unsiged char innen[10], ide[10];
unsiged char i,j;
Másoljuk át az innen tartalmát ide -be, de fordított sorrendben:
  1. i = 0;
  2. j = 9;
  3. do {
  4. ide[j--] = innen[i++];
  5. } while (j);
  6. for (; ;)

A fenti programban már lényegesen többet kellene írni, ha külön utasításban módosítanám az indexeket.
Idézet:
„"A két egyenlőségjellel az azonosságot vizsgálják és nem értéket ad."
TMR0_counter EQ 3906 ezt kapásból érti az ember”

Az == és az EQ is két - két karakter... Ezt írja elő a nyelv, így kell írni.
Idézet:
„"init_ports( Ez egy parémer nélküli függvény. Ha lenne valami változó deklaráció a zárojelben azt a függvény meghíváskor megkapná bemenő adatnak. "
Ha nincs bemenő adat akkor minek adja meg, mit álíit be és Én azt honnan tudom hogy mit milyen értékre állít?”

Lehetne egy init_ports nevű változód és egy init_ports() függvényed. A zárójel különbözteti meg őket.
Ha van parakétere a függvénynek, akkor a paraméterek aktuális értékét a zárójelek között kell megadni (számosságra és a típusukra is ügyelve).
  1. float r;
  2. int k;
  3. k = floor(r); // lebegőpontos szám egész részét teszi a k -ba.


Idézet:
„No és ez for( ; ; ) ? mit is jelent?”

Nézd meg az előző hozzászólásomat és a for utasítás leírását.
A hozzászólás módosítva: Aug 25, 2016
(#) rolandgw válasza cross51 hozzászólására (») Aug 25, 2016 /
 
Ebből talán érthetőbb.
(#) otvenkilenc válasza Elektro.on hozzászólására (») Aug 25, 2016 /
 
Hehe tetszik, hogy mennyire kezdőnek néznek. ) Gondoltam, hogy itt ebben az estben Bool algebra érvényes. De azért köszönöm, hogy leírtad, )

A függvényt tudom mi csak ebben az esetben akkor sem tudom, hogy a portokat hogyan állítja be mert ahol maga a függvény van leírva azt nem látom. Titkolja ) Lehet nem is a portokat állítja be csak annak álcázta. )
Ha a függvény kimenet nem változik az alap folyamatban beállítottaktól -amit a függvény egyébként is tesz amikor lefut - akkor nevezhetné rutinnak is nem? Mert nincs bemenő adat amitől változna valami. )
A lényeg, hogy nincs infó a függvény viselkedéséről. Valamit biztosan csinál, de hogy mit azt csak a függvény írója tudja. Tehát ha olvasok egy programot amiben így van megadva és a függvénytartalmáról nincs infóm akkor csak a képzeletem szab határt annak, hogy mit is csinál ez a program rész )

"Az == és az EQ is két - két karakter... Ezt írja elő a nyelv, így kell írni. "
Értem én azt hogy lusta volt írni a készítő de ha mindkettő két karakter akkor miért azt használják ami ránézésre nem adja magát? (olvashatóság)

Mindegy használják ezt a nyelvet azok akik önsanyargatóak. )) Lehetne még használni &,@ § # jeleket ) azok is rövidek és tökéletesen értehetettlenné teszik a programot ) . Az assembler nyelv sokkal logikusabb és egyszerűbb gyorsabb mint a C ) Ha már "magasszintű" nyelvet hoznak létre akkor az legen könnyen olvasható ne rejtjeles. Tulajdonképen azért hozták létre azokat, a nyelveket, hogy könnyen áttekinthető értelmezhető legyen. Gyorsabb meg mitől lenne hiszen mindent a gépi nyelve fordít vissza. Max az utasítások értelmezése és a fordítás. De mai processzorokkal ez nem jelent előnyt.
(#) Elektro.on válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Nem láttam a teljes program környezetet ahonnan ezeket kiemelted.
Valószínűnek tartom, hogy az általad írt Init_ports() az a függvény meghívása, és valahol a kód elején van egy olyan, hogy
void Init_ports(void){
utasiítás 1
utasítás 2
stb
}
A hozzászólás módosítva: Aug 25, 2016
(#) szilva válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Bocsáss meg, de Neked most az a problémád, hogy szerinted nem elég "beszédes" vagy "egyértelmű" egy C nyelvű forráskód egy olyan ember számára, aki nem ismeri a nyelvet? Na de mi ebben a meglepő?

Ha én nem beszélek németül, akkor lehet akármilyen jó leírás valamilyen dologról egy német nyelvű lapon, akkor sem fogom érteni - maximum ha annyira fontosnak tartom, akkor elkezdek valami alapszinten németet tanulni, és egy szótár segítségével megpróbálom megérteni a leírtakat.

A programozás is ugyanilyen: van millióféle programnyelv, vagy nyelvjárás, amit az ember hasznosnak talál a munkájához vagy a hobbijához, azt legalább alapszinten megtanuja. Az első programnyelv megtanulásakor olyan elveket és fogalmakat, egyfajta látásmódot és logikát fogsz elsajátítani, amiket utána már felhasználsz a következő nyelv tanulásakor, így a második, harmadik, sokadik programnyelvet általában sokkal könnyebben megtanulja az ember - talán a valódi, beszélt nyelvekkel is így van ez.

Amint megtanulod a C alapokat, máris minden sokkal világosabb lesz, persze vannak olyan apró ravaszságok (C-nél főleg a pointeres világban), amik gyakran még a "profiknak" is fejtörést okoznak.

Az megint másik dolog, hogy mitől "hatékony" egy programnyelv. A C-t azért szeretjük sokan itt, mert az assemblytől lényegesen jobban olvasható, karban tartható kódot lehet benne írni, mégis lehetőséget ad a nagyon alacsony szintű, hardverközeli műveletek leírására is. A C-ben megfogalmazott elemi műveletek elég egyszerűek ahhoz, hogy bármilyen processzoron tömör és hatékony kóddal megvalósíthatók legyenek, és mivel szinte minden hardver platformra létezik is valamilyen C fordító, a programok emiatt elég jól hordozhatók.
(#) otvenkilenc válasza Elektro.on hozzászólására (») Aug 25, 2016 /
 
Kerestem a programban de nem találtam.
No meg ez a void ) aminek a jelentése értelmetlen üres kitöltetlen, hiányos. ( A használni kívánt szó aláhúzandó ) ha nincs semmi benne és értelmetlen minek írja le? Létrehoznak egy nyelvet azért, hogy egyszerűbb legyen. Miközben többször használnak egy szót egy folyamat elindításához.-void Init_ports(void)- A fordító programban ezt a sort alaposabban kell megvizsgálni mintha csak egy nevet adott volna a függvénynek. { Akkor most hol van az egyszerűség a gyorsaság?
(#) cross51 válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Végig olvastam közben az összes kommentet és nem csak erre jön a válasz.
Kicsit úgy érzem a hozzáállásodban, mintha azt sugározni mi ez a sz*r nyelv...
"A keres az talál" C-ben az alapértelmezett számrendszer a 10-es tehát, ha nem írsz elé 0x akkor decimális (lehet itt is működik, ha mögé írsz 'h' vagy 'o' betűt, de sose próbáltam). a többit jól értetted belőle.

A void init_ports(void), ha van 20 fájlból álló kódot nem akkor strukturálni? De ez a kérdés már nem a C-vel, hanem a C++-al megy szemben ami a legtöbb mai nyelv alapja értsük itt akár a "szuper jó" Javát, C#, VSC++ stb..

Az inkrementálás megértéséhez kis assembly, gondolkodás
valtozo = valtozo + 1; // C

movlw 0x01
addwf valtozo, f // assembly 8 bit

valtozo++; //C

incf valtozo, f //assembly 8 bit

Jöhet a kérdés, miért nem tudja az incf-et használni a fordító, ha 1 adsz hozzá, "A programot ne írjam meg helyetted"?

Értem én, hogy nem minden nyelvben van {}, de mér zavar téged, hogy itt a függvény/metódus tartalmát {} jelölik?

És egy utolsó gondoltat a C/C++ nem az a nyelv ami egy féle programozási stílust támogat, azért mert neked nem tetszik nem kell hőzöngve elítélni, írd át úgy ahogy neked tetszik.

Szerk.:
Azért írják le, hogy void, hogy tudd, hogy nem vár elemet a függvény, de ha nem tetszik C++ erősen típusos nyelv nem írják, hogy void..., de elfelejted, hogy van olyan eset mikor nem tudjuk milyen objektumra mutatunk és akkor jön a void* na a C kiíró függvénye a printf(const char* f, ...) a három pont egy void*, hogy tudjon float-ot, int-et, long-ot, char-t, és mindent fogadni, de kérlek még egyszer olvass minden le van írva...
A hozzászólás módosítva: Aug 25, 2016
(#) Hp41C válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Úgy érzem, hogy jól elbeszélgetsz cross51 -et, a többire nincs reakció...

Egy kicsit lássad azt is , ami a C mögött van:
Init_ports(void): A fordító innen tudja, hogy a híváskor nem kell paramétert a stack (verem)-re tenni.
void Init_ports(void): A fordító innen tudja, hogy nem kell a hívás után a stacket visszafejteni. A többi programnyelvvel ellentétben C fordító a függyényből való visszatérés után fejti le a stack -ot, ismenie kell a visszaadott adat méretét.

Statisztikai alapon egy programban több értékadás van, mint egyenlőség vizsgálat (vö. PASCAL). Ugyanígy a { és a } sokkal rövidebb, mint a begin ill. az end... Ha mindez nem tetszik nem is a C -t tanuld meg, hanem a Python -t ( csak egyszer írjál space helyett tab -ot...)

Kezd olyan lenni, mintha a kézikönyvvel a kezedben állnál egy új elektromos autóval a benzinkútnál és kerenéd a beöntőnyílást...
A hozzászólás módosítva: Aug 25, 2016
(#) cross51 válasza rolandgw hozzászólására (») Aug 25, 2016 /
 
Nem olvastam még végig, de a képek azonnal majdnem minden megmagyaráztak, most már értem mért van/lehet szükség az aligned-re.

Köszi!
(#) otvenkilenc válasza cross51 hozzászólására (») Aug 25, 2016 /
 
""A keres az talál" C-ben az alapértelmezett számrendszer a 10-es tehát, ha nem írsz elé 0x akkor decimális (lehet itt is működik, ha mögé írsz 'h' vagy 'o' betűt, de sose próbáltam). a többit jól értetted belőle."

Na pont ez az, minek kell bonyolítani azzal hogy elé ír 0x-t? Ha a decimálistól eltérő számrendszerről van szó akkor jelzi H, B stb. Túl van bonyolítva ez a rész, és zavaró.

"Az inkrementálás megértéséhez kis assembly, gondolkodás
valtozo = valtozo + 1; // C"

Isten bizony az eddigi életem során sosem tudtam mi az inkrementális míg ezt most meg nem magyaráztad. Az első osztályban igaz nem igy neveztük hanem valami meg egy )

"Jöhet a kérdés, miért nem tudja az incf-et használni a fordító, ha 1 adsz hozzá, "A programot ne írjam meg helyetted"?"
Hol írtam én ilyet? ) Kisiklottál a mondandóddal. )

Írtam ez a nyelv nem a kedvencek közé tartozik mert vannak értelmetlen dolgai. Ez a véleményem. ennyi ) Ami idegesítő.

"Értem én, hogy nem minden nyelvben van {}, de mér zavar téged, hogy itt a függvény/metódus tartalmát {} jelölik?"
Az a zavaró, hogy mindenhol használja mindenhez, mintha ebből lett volna annak egy zsákkal aki a nyelvet megalkotta.
(#) _BiG_ válasza otvenkilenc hozzászólására (») Aug 25, 2016 / 1
 
Kicsit én is belevau, ha nem baj.

A C nyelv nem mai darab, ráadásul platformfüggetlenítés szándékával alkották meg. Mielőtt leszólod, elárulom, hogy a gép, ami előtt ülsz, annak az operációs rendszerét (a Winfos esetében a kernelt biztosan, de a Unixot, Linuxot teljes egészében) C-ben írták meg. Mert olyan vacak egy nyelv, hogy operációs rendszereket lehet rajta megírni...

Az, hogy egy nyelv milyen, mire jó, azt a megalkotóik kitalálták. Olyan, amilyen, ha használni szeretnéd, meg kell tanulni.
A C elég rugalmas, emiatt oda kell figyelni, miként programozol. A szintaktikai felépítése elég tömör forráskódot tud eredményezni, ha kihasználják, de ember legyen a talpán, aki visszafejti

Az inkrementálásról (dekremtálásról): egyszerű forrást eredményez a ++ vagy a --, de oda kell figyelni a végrehajtás sorrendjére! Ugyanis a C fordító egy kifejezés kiértékelési mechanizmusát úgy építi fel, hogy balról jobbra, de vannak a műveletek között prioritások is.
Egy z = x * y++ nem ugyanazt adja, mint a z = x * ++y. Az előbbi esetben elvégzi a szorzást, aztán megnöveli eggyel az y értékét (balról jobbra, ugye), a második esetben előbb megnöveli az y értékét és csak utána szoroz (itt is balról jobbra, de ugye egy ++ becsúszott...).
Legyen x = 5 és y = 6. Első eset: z = 30 lesz (5 * 6) és az y értéke 7 lesz. A második esetben előbb lesz az y 7-tel egyenlő, így a szorzás eredménye (5 * 7) 35 lesz.

Ez az egyoperandusú ++/-- nagyon jól használható pointerekkel, csak nem mindegy, hogy a pointert növeled meg/csökkented, vagy a pointer által mutatott értéket Erre figyelni kell. Különben lazán túlcímezhetsz pl. tömböket, amik érdekes eredményre vezetnek... És a fordító nem fog szólni, hogy nem jót csinálsz. Na, de ez már haladóbb szint.
(#) otvenkilenc válasza _BiG_ hozzászólására (») Aug 25, 2016 /
 
A Unix előtt is léteztek operációs rendszerek sőt a C megalkotása előtt is.. És azokon tudták megírni a C- t Annyira jól volt megírva a UNIX operációs rendszere -hogy ha kis áramkimaradás volt akkor az egész rendszert újra kellett húzni. Sérülékeny volt rendszerleíró.

A szabály a matematikában az hogy előbb a zárójelben lévőkkel kell a műveletet elvégezni, a C ezzel szakított. Ezért lehet téveszteni vagyis beépítette a tévesztés lehetőségét Te írtad most. Nem a programban kellene szétszórni a zárójeleket hogy hagy fogyjon.
Az agyatlan meghatározások miatt tartom utálatosnak. C -t Ha valamit nagyon rugalmasnak készítenek az elfog fajulni. Nos a példákon is látszik. Pl a másik gyöngyszem Z += 1 )
A hozzászólás módosítva: Aug 25, 2016
(#) kissi válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Szia!
Idézet:
„Pl a másik gyöngyszem Z += 1 )”

Ez csak annyit jelent, hogy rövidítve írta le, hogy Z=Z+1 ! Meg kell tanulni a nyelv szintaktikáját és akkor olvasható és röviden írható utasításokat tudsz használni, de nem tilos a hosszabb vagy zárójelezett formulák alkalmazása sem !
Döntsd el, hogy meg akarod-e tanulni ( ebben az esetben olvasd el pl. a HP41C kolléga által beírt könyvet kezdésnek ) vagy nem és akkor ne "szapuld" a mások által kedvelt nyelvet ( tudod, "nem erőszak a disznótor, csak a disznónak! " )!
(#) killbill válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Idézet:
„"C ben a változónév++ Inkrementálást jelent (egyel növeli az értékét)."
Mi baja volt a fordító programkészítőjének a +1 formával ami logikus is?”
Nem volt vele semmi baja. A ++ es -- operator nem csak arra jo, hogy egy valtozot eggyel megnovelj vagy csokkents. Ha pl. azt irod, hogy
a = b++;
akkor a-b betolti b-t, majd b-t eggyel megnoveli. Tomorebben irhatod le a mondandodat, es a 40 evvel ezelotti forditoknak segitett ez, hogy a PDP-11-en (azt is programoztal?) tomorebb, gyorsabb kodot forditson. Azon felul olvashatobb tole a program.
A b++ az postincrement, a ++b meg preincrement, tehat az
a = ++b;
elobb megnoveli b-t, es csak utana tolti be a-ba.
Az if() eseten csak az szamit, hogy a zarojelek koze irt kifejezes (lehet az barmi, konstans, fuggvenyhovas, valtozo, egy muvelet) erteke 0 vagy nem. Ez igaz a while-ra, a ?: operatorra es a for(kif1; kif2; kif) kif2 reszere is. De, ahogy azt mar linkelte valaki, a K&R konyvben ez mind le van irva erthetoen, peldakkal.
(#) otvenkilenc válasza kissi hozzászólására (») Aug 25, 2016 /
 
Egy olyan programnyelvet nem érdemes megtanulni amelyik felrúgja a matematika általános formuláit.
Miért nem lehet ezt így írni? Z=Z+1 Van a billentyűzeten rengeteg Z nem kerül semmibe, ha azzal akar spórolni? Azt eltudod nekem mondani i, hogy milyen előnye van annak az írásmódnak?

Ez olyan mint amikor a hogy szót h -nak a vagyok-t vok-nak írják. Azt nem értem akkor a többi szót miért írja ki? Ha mindegyiknek csak a kezdő betűjt írná mennyivel gyorsabb és értelmetlenebb lenne. ) De elmondhatjuk róla, hogy rugalmas ) Csak nem értik azok akik rendes nyelvet és írásmódot tanultak. Vagy tanuljuk meg az azt? ))
(#) killbill válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Idézet:
„A szabály a matematikában az hogy előbb a zárójelben lévőkkel kell a műveletet elvégezni, a C ezzel szakított.”
Jézusom! Ezt te honnan veszed? Ki mondta ezt?
(#) szilva válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Már megbocsáss, de a "Z=Z+1" sem matematikai megfogalmazás. Ha matematikailag tekinted, akkor ez egy egyenlőség, vagy egyenlet, aminek nincs megoldása. Matematikailag az ilyet valahogy úgy kéne írni, hogy "Z+1 -> Z". z eredeti megfogalmazás ("Z=Z+1") már egy, a programozásban bevezetett jelölésmód.

A C nem rúg fel semmiféle matematikai megszokásokat, vannak műveleti prioritások, lehet zárójelezni, a matematikai kifejezések nagyon szépen leírhatók vele. Persze vannak olyan operátorok, amik a matematikában nem megszokottak.

Az az érzésem, hogy Te csak trollkodsz, és nem tanulni vagy valamit megérteni akarsz...
A hozzászólás módosítva: Aug 25, 2016
(#) otvenkilenc válasza killbill hozzászólására (») Aug 25, 2016 1 /
 
BIG hozzászólása példában mutatja be hogyan lehet félrecsúszni,
A hozzászólás módosítva: Aug 25, 2016
(#) _BiG_ válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
Idézet:
„Az agyatlan meghatározások miatt tartom utálatosnak.”

Nem agyatlan, csak egyfajta logika szerint van megalkotva. De nem kötelező a ++/-- használata! Ha nem tetszik, ne használd. Van az if utasítás helyett ? operátor is, azt se kötelező használni. Lehet terjengős forrást írni, de minek? A program nem lesz se jobb, se kezelhetőbb, se átláthatóbb. Utóbbi elősegítésére meg ott a kommentelési lehetőség.

Idézet:
„A szabály a matematikában az hogy előbb a zárójelben lévőkkel kell a műveletet elvégezni, a C ezzel szakított.”

Ez nem igaz. A matematikai művelet-sorrend zárójeles befolyásolási lehetőségét igenis használja a C. Miért ne tenné? Tök logikátlan lenne, na nem lenne értelmezve.
De kellett egy szabály az alap kiértékelési sorrend meghatározására és ez lett az értékadás felépítésénél megállapított balról jobbra irány. Teljesen logikus. És egy logikai leven működő számítógépen csak logikus dolgok értelmezhetőek.

Idézet:
„Ezért lehet téveszteni vagyis beépítette a tévesztés lehetőségét Te írtad most.”

Tévedni bármiben lehet, aki dilettáns, az a saját lábában is hasraesik. És ez nem a cipője, vagy az út hibája...

Idézet:
„Nem a programban kellene szétszórni a zárójeleket hogy hagy fogyjon.”

A zárójel is szintaktikai elem - például függvények argumentumainak felsorolásához, meg egyáltalán, ha egy karaktersor mögött közvetlenül zárójel van, az a fordító számára azt jelenti, hogy a karaktersorozat egy függvény neve.
És ne tessék összekeverni a sima zárójelet a kapcsos zárójellel, mert a kettő nem ugyanaz és nem ugyanarra a célra szolgál!
(#) otvenkilenc válasza szilva hozzászólására (») Aug 25, 2016 /
 
A kezdet az volt, hogy nem érthető a C -ben alkalmazott algebrai kifejezés azoknak akik a hagyományos algebrát tanulták. Többek között azt sem értem, hogy mire jók azok a jelölések amiket használ a C Pl == EQ és stb. Miért nem jó a régi bejáratott jelölési rendszer? De erre még mindig nem kaptam választ. Előnye ami érthető is stb.

No mára elég ennyi. )
A hozzászólás módosítva: Aug 25, 2016
(#) _BiG_ válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
A hagyományos algebra táblára krétával, aztán elolvassuk.
Egy számítógépes programnyelv viszont úgy épül fel, hogy le lehessen fordítani lépésről-lépésre. Ehhez meg kellett szabni bizonyos szabályokkal a felírási módot. Különben a fordító (ami maga is egy program saját algoritmussal) nem lenne képes végigmenni rajta.

Az. hogy == van az EQ helyett, az egy megoldás, de semmivel sem rosszabb. Minek mégegy írásmódot (rövidítés) bevezetni, mikor ott van a jól ismert egyenlőségjel, csak a funkció elkülönítésére (megkülönböztetésül az értékadástól) meg kell duplázni és kész.
Pláne, ha sok betűvel felírt funkciót csinálnának, a kód olvashatatlanabb lenne. Viszont a műveleti jel jól elkülönül a változónevektől és a függvénynevektől, meg az utasításoktól.

Remélem sikerült megvilágítanom, miért is csinálták így.

(Különben, ha a Fortran jelöléseit használnák, akkor miért neveznék C-nek a C-t? Ráadásul a Fortran főleg matematikai műveletekhez lett kifejlesztve, ehhez a célhoz igazodik, a C nem. A C még általánosabb, adatkezeléshez is igazodik némileg.)
(#) ha1drp válasza otvenkilenc hozzászólására (») Aug 25, 2016 /
 
A mikroelektronikának van PASCAL, BASIC fordítója , ha a C nem tetszik jó alternatíva lehet neked.
Következő: »»   132 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem