GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Leírások/Útmutatók => A témát indította: krisk - 2010. november 07. - 22:08:32

Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: krisk - 2010. november 07. - 22:08:32
A makrók lényege, hogy apró feladatokban megkönnyítse a programozót, tehát egy-egy rutint gyorsan el tudjon végezni, anélkül hogy külön funkciókkal tömné tele a modját. Ám van egy pár fontos dolog, aminél az ember - ha nem gondolkodik eléggé - elakadhat. Nem hiszem hogy mindenkinek egetrengetõ, de ha csak egy embert is ki tudtam ezzel segíteni, megérte.
Elég sokat fáradozhat egy kezdõ programozó azon, hogy a PAWN preprocesszorával hogy lehet egy értelmes többmûveletes matematikai képletet összerakni, mivel hasonlóan a többi programnyelvhez, alapvetõen a PAWN sem képes a mûveleti sorrend megértésére, így nekivágtunk a vakvilágnak, és teszteltünk pár makró megoldást, hogy bemutassuk, hogy kell ezt megoldani:
 

#define HOZZAAD(%0,%1)                  %0 + %1
main()
{
    printf(\"%d\", HOZZAAD(3, 3) * 7);
}

 
A preprocesszor ezt a következõnek fogja fordítani: 3+3*7=42 ami nem egyenlõ a várt 24-gyel. Rendben, ez túl alap volt, próbáljunk ki zárójelket használni a kódban:
 

#define SZOROZ(%0,%1)                  (%0 * %1)
main()
{
    printf(\"%d\", SZOROZ(3 + 3, 7));
}

 
Eredmény? Az összes tag zárójelben marad! [ (3 + 3 * 7) ], tehát az eredmény mindig 42! A megoldás: használjunk duplazárójelet.
 

#define SZOROZ(%0,%1)                 ((%0) + (%1))
main() {
   printf(\"%d\", SZOROZ(3,  3*7));
}

 
A preprocesszor ezt a megfelelõ képlettel fogja lefordítani ((3)+(3*7))=24. Ezért nagyon fontos hogy matematikai mûveleteknél
hogy a mûvelet egészét zárójelbe rakjuk makróíráskor.
Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: Epsilon - 2010. november 08. - 21:44:51
Finom.
Aki átlátja a logikáját a dolognak annak felesleges a tut.
Aki nem, az sürgõsen próbálja meg átlátni.
Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: krisk - 2010. november 08. - 22:03:29
Zárójelbe, ennek a bõvítését akartam közzétenni itt, csak sajnos az SFM közbekavart, én meg egy jódarabig nem fogom leírni újra, majd talán pár hónap múlva.
Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: kurta999 - 2010. november 12. - 21:00:32
Azt igen nem értem, hogy mér épp 24 lett belõle.
Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: krisk - 2010. november 12. - 21:48:04
A szorzás és az osztás magasabbrendû mûvelet mint az összeadás ill a kivonás, így azt kell a hatványok után elõször elvégezni.
 [ 3+(3*7) = 24 ]
Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: kurta999 - 2010. november 13. - 12:34:01
Ja értem, ezt már én is észrevettem a matek scriptben.
Cím: Leírás: Mûveleti sorrend PAWN makrókban.
Írta: krisk - 2011. június 26. - 10:52:19
Elõkapartam a témát, és átírtam az utolsó fordításnál az eredményt, mivel az nem
 
(3+(3*7))

 
hanem
 
((3)+(3*7))