Jump to content

Tanga

Uživatel
  • Příspěvků

    1278
  • Registrován

  • Aktivní

  • Vítězných dnů

    29

Everything posted by Tanga

  1. Tanga

    pomoc Existuje?

    Stačí ti fopen(). Lebo ako hovorí wiki o fopen, Return Values: Returns the file handle. This handle is used for reading and writing. 0 if failed to open file. Pomocou fopen() sa pokúsiš vytvoriť súbor v jednom z tých priečinkov. Skontroluješ návatovú hodnotu funkcie - ak bude 0, nebolo možné daný súbor vytvoriť.
  2. Bitové operátory Obsah Úvod Bitové operácie Operácia not Operácie and, or Operácie shl, shr Operácia xor 1. Úvod K napísaniu tohoto návodu ma inšpiroval tento príspevok z roku 2012, ktorý podľa môjho názoru má k dnešnej úrovni našich návodov celkom nízku kvalitu a tiež v ňom chýbajú určité informácie. Niektoré body z neho som podobne použil aj ja. V príspevku budú tiež cvičenia, ktoré kým spravíte, rozhodne budete bitovým operáciám rozumieť. Nejaký čas nad cvičeniami určite strávite. V praxi majú tieto operácie veľký význam, predsalen, ak jeden bit môže mať hodnotu 0, alebo 1, tak so znalosťami bitových operátorov je možné do jedného 32-bitového čísla (klasická premenná v Pawn) uložiť 32 true/false hodnôt. Do úvodu však ešte uvediem, že síce dokážu neuveriteľne šetriť pamäť (v prípadne jednej bool hodnoty až 32násobná úspornosť), tak každá operácia trvá určitý čas a z úmyslu ušetriť pamäť by výsledok mohol byť až strata rýchlosti. Ak potrebujete pracovať s binárnymi číslami, Windows kalkulačka je najvhodnejší nástroj (Štart->calc.exe->Možnosti->Programátorská). Otázky sa môžete pýtať v komentároch. Veľa šťastia a nových vedomostí. 2. Bitové operácie Najmenšia dátová jednotka na počítači je bit, ktorý patrí do množiny {0, 1}. Vždy nadobúda práve jednu hodnotu. Operácie prebiehajú v dvojkovej sústave. Desiatková sústava pozostáva z {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Jeden bajt má osem bitov. Keďže v Pawn sa používajú len 4-bajtové premenné, všetky bunky majú 32 bitov. Množina {0, 1} sa dá zobraziť do množiny {false, true}. Premenná, ktorá môže nadobúdať iba hodnoty true a false máva typ "bool", po matematikovi Georgeovi Booleovi. Pawn umožňuje vypisovať čísla v binárnom tvare na konzolu. Stačí do printf() dať namiesto "%d" (decimal - desiatková sústava) "%b" (binary - binárna sústava). Kód si spustite. #include <a_samp> main() { for (new i; i < 16; i++) { printf("%2d = 0b%04b", i, i); } } Cvičenie 1. V Pawn existujú kľúčové slová true a false. Keďže je to beztypový jazyk, je možné zamieňať typy premenných (vyskočí iba warning). Zistite k akým celočíselným hodnotám sa dajú priradiť výrazy true a false pomocou nasledujúceho kódu: #include <a_samp> main() { new a = ??; if (a) { ?? } } 3. Operácia not Všetky bity naraz je možné znegovať operáciou not, ktorá má len 1 argument a značí sa '~'. #include <a_samp> main() { new a = 0b11001100; printf("%032b", a); printf("%032b", ~a); } 4. Operácie and, or Operácie and a or majú dva parametre a ich výsledkom je jedna premenná s rovnakým počtom bitov. Operácie and a or sa v Pawn vykonávajú na všetkých bitoch premennej zaradom, akoby v cykle. Najprv sa vykoná operácia na prvých bitoch premnenných, potom na druhých bitoch premenných, atď. Pawn obsahuje operátor '&' pre operáciu and, ktorá je tiež nazývaná "bitový súčin". Súčin preto, lebo výsledok tejto operácie je "1" iba v prípade, že obidva parametre sú "1". Operáciu or (tiež nazývanú logický súčet) zapisujeme v Pawne operátorom '|'. To, ako Pawn chápe '&' a '|', nám môže sám ukázať. Vašou úlohou je tieto operácie pochopiť priamo od neho. Výstup programu kvôli prehľadnosti pripomína mechanické sčitovanie "pod sebou na papieri". #include <a_samp> main() { new a = 0b1010, b = 0b1100; printf("0b%b\n0b%b &\n------\n0b%b\n\n", a, b, a & b); printf("0b%b\n0b%b |\n------\n0b%b\n\n", a, b, a | b); } Cvičenie 2. Pri prenose dát sa z kontrolných dôvodov pridáva k preneseným dátam jeden bit navyše, jedná sa o tzv. paritný bit. Prenáša sa 8 dátových bitov a jeden paritný - ten úplne naľavo je paritný. (tj. "100000101"). Vašou úlohou je naprogramovať detekciu hodnoty paritného bitu. Doplňte do nasledujúceho kódu operáciu binárneho súčinu, aby kód správne fungoval. Rada: Chcete detekovať, či bol daný bit nastavený na "1". #include <a_samp> main() { new number = 0b100101101; if (parityBitSet(number)) { print("Paritny bit je nastaveny na 1."); } } parityBitSet(number) { if (??) { return true; } else { return false; } } Cvičenie 3. V zastaralej databáze údajov, ktorá musela šetriť maximálny možný priestor, sú údaje o obyvateľoch uložené v bitoch. Napr. nultý bit (úplne vpravo) obsahuje pohlavie (0-muž/1-žena), ten vedľa neho obsahuje informáciu, či osoba poberá dávky v hmotnej núdzi, nasledujúci hovorí o zamestnanosti danej osoby, atď. Databáza používa celkovo 16 bitov, ostatné sú nedefinované. V novej verzii databázy sa zmenil význam piateho bitu a preto chceme bez zmeny ostatných informácií vynulovať daný bit každej osobe. Doplňte procedúru update() tak, aby databáza spĺňala nové požiadavky. #include <a_samp> new people[] = { 0b1100111100110101, 0b0011001101010101, 0b1111111001110111 }; main() { update(); for (new i; i < sizeof(people); i++) { printf("%016b", people[i]); } } update() { for (new i; i < sizeof(people); i++) { ?? } } 5. Operácie shl a shr Nasledujúce dve operácie vykonávajú aritmetické bitové posuny. Aritmetické znamená, že pri posune sa zachová (záporné), alebo vznikne (záporné) znamienko. SHL a SHR sú skratky pre shift left a shift right. Operátormi pre tieto operácie sú "<<" a ">>". Argumentom bitového posunu je počet bitov, o ktoré chceme číslo posunúť. Pri operátore "<<" je novo-pridaný bit 0. #include <a_samp> main() { new a = 1; for (new i; i < 8; i++) { printf("%08b", a << i); } printf(""); a <<= 3; // je mozne pouzit aj tuto syntax printf("%08b", a); } Na binárnej úrovni sa rozlišujú záporné a kladné čísla najvyšším bitom, tj. celková kapacita 4 bajtov je rozdelená na 2 polovice - kladnú a zápornú. U záporných čísel je 31. bit (ten úplne naľavo) vždy 1, pričom u kladných 0. Aritmetický posun vpravo sa teda správa ináč než ten vľavo. Znamienko čísla sa zachováva pri operácii ">>". Operácia ">>" akoby preskočí bit, ktorý určuje zápornosť čísla a posúva všetky ostatné bity. Lepšiu predstavu o tomto procese získate spustením nasledujúceho kódu. Existuje ešte tretí, logický operátor pre posun vpravo, ktorý (záporné) znamienko nezachováva ani nevytvára. Tento operátor je ">>>". #include <a_samp> main() { new a = -10; printf("%032b = %d", a, a); printf("%032b = %d", a >> 1, a >> 1); printf("%032b = %d", a >> 2, a >> 2); printf("%032b = %d", a >>> 1, a >>> 1); printf("%032b = %d", a >>> 2, a >>> 2); } Cvičenie 4. Majme v desiatkovej sústave číslo "65421". Toto číslo z hlavy vydeľte číslom "100", resp. "10^2". Zvyšok zanedbajte. Výsledok si overte. Cvičenie 5. Majme v binárnej sústave číslo "1101010". Z hlavy vydeľte toto číslo číslom "4", resp. "2^2". Zvyšok zanedbajte. Výsledok si overte. Rovnakým spôsobom výsledok vynásobte číslom "4". Dostali ste pôvodné číslo? Cvičenie 6. Doplňte riešenie cvičenia 2 tak, aby nie len kontrolovalo paritný bit, ale aby kontrolovalo, či je paritný bit správny. Skontrolujte hodnotu všetkých bitov a rozhodnite, či ich počet (či sú párne) sedí s informáciou z paritného bitu. Takáto kontrola sa v praxi používa pri prenose dát. Cvičenie 7. Doplnením do kódu nižšie vygenerujte číslo s takýmto tvarom: "0b1010101010101010". Rada: použite okrem operácie na bitový posun aj bitový súčet (na nastavenie bitu) a bitový súčin (na overenie/zistenie hodnoty nejakého bitu). #include <a_samp> main() { new number = 0; for (new i; i < 15; i++) { if (!(??)) { ?? } ?? } printf("0b%016b", number); } 6. Operácia xor Ako aj v názve, tak aj vo funkcionalite sa podobá operácii or. #include <a_samp> main() { new a = 0b1010, b = 0b1100; printf("0b%b\n0b%b ^\n------\n0b%04b\n\n", a, b, a ^ b); } Cvičenie 8. Istý fanúšik jazyka assembler, Rendall Hide, má rád prácu s bitmi. Posledne o sebe tvrdí, že našiel vlastnosť, ktorá dokáže nastaviť zázračným spôsobom hodnotu akejkoľvek premennej na 0. Mnohí ho majú za blázna a nepočúvajú čo hovorí, ale je naozaj blázon, alebo len neodborná programátorská verejnosť nerozumie kráse jeho mágie? Tvrdí, že dokáže vynulovať premennú bez použitia iných konštánt ako "0" a bez operácií ako násobenie, odčítanie či and. Údajne je táto vlastnosť zapísaná tu: n xor n = 0 Preskúmajte túto údajnú vlastnosť a overte, či Rendall Hide bol naozaj blázon, alebo majster majstrov. Cvičenie 9. Nádejný programátor Peter "VlastneŠifrovanieJeNajlepšie" Skutočný si všimol neuveriteľnú a jedinečnú vlastnosť operácie xor. Nazdáva sa, že by možno odhalil niečo, čo by nazýval "symetrické šifrovanie", hoc názvom si ešte nie je istý. Prezrite a vylúštite na bitovej úrovni pozadie tejto operácie. #include <a_samp> const secret = 123456; main() { new number = 9087324; number = encode(number); printf("My new hashed password is: %d", number); number = decode(number); printf("The real password is: %d", number); } encode(number) { return number ^ secret; } decode(number) { return number ^ secret; } Cvičenie 10. Alen During, známy hejter, si s obľubou prezerá internet a hľadá veci na kritiku. Po zlej noci počas ranného rituálu s telefónom našiel príspevok Petra Skutočného a jeho procedúry encode() a decode(). Nemal však chuť sa niečím takým zaoberať a tak mu zo svojho smartphone-u poslal jediný snippet bez slov. Čo ním asi chcel povedať? #include <a_samp> main() { new crackedSecret = gimmeSecret(9087324, 9128732); printf("%d", crackedSecret); } gimmeSecret(pass, hashedPass) { return pass ^ hashedPass; }
  3. Každý nástroj je len taký mocný, ako ten čo ho používa. Podľa môjho názoru, s tvojimi požiadavkami asi všeobecne by bolo najlepšou (najjednoduchšou) voľbou C#.
  4. Tanga

    pomoc auto

    Asi máš na mysli includ file.inc, ktorý sa nachádza v priečinku pawno/include. Toto je jeho obsah, teda funkcie, ktoré môžeš používať:
  5. Príliš veľa otázok v jednom threade a ani jedna konkrétna. Ak chceš dostať odpovede, rozdeľ to na niekoľko tém a každú popíš detajlne.
  6. Tanga

    pomoc CreateHouse

    Aký includ / house system používaš?
  7. Missing Brackets Detector Pri chybnom počte zátvoriek v Pawn súbore sa stáva, že kompiler crashne. Nájsť takýto problém (resp. či ide práve o tento problém) je časovo náročné a nudné. Všimol som si, že neexistuje podobný funkčný program (na zahraničných fórach sa dajú nájsť, no niektoré chybne detekujú zátvorky vnútri stringov, alebo komentárov a iné sú strašne pomalé kvôli zlému návrhu, prípadne nevhodnému jazyku. Preto som dal dokopy malý program, ktorý rieši daný problém a môžete si ho tu stiahnuť. V prípade, že by ste našli nejakú chybu, nezrovnalosť, alebo máte nejaký návrh, prosím napíšte mi. Použitie Jedná sa o command-line utilitu, čiže sa spúšťa z príkazového riadku. Po stiahnutí a uložení do nejakého priečinka, v ktorom je "testskript.pwn", je možné použiť program takto: C:\Users\..>cd brackets C:\Users\..\brackets>brackets.exe testskript.pwn No incorrect / unmatching brackets were found. C:\Users\..\brackets> Download Source - https://gist.github.com/ts12311122014/b8763c771a30bfc75d1961676d393245
  8. Tanga

    pomoc sscanf

    Pekný help thread. Čitateľný, zrozumiteľný, so všetkým čo treba. Nemôže byť chybné va_SendClientMessage? Odhadujem z videa a crashdetectu čo si priložil. Skús tam dať obyčajné SCM.
  9. Predpokladám, že úplný začiatočník s programovaním by si chcel overiť funkčnosť jeho premenných, no nevedel by ako na to. Na vypisovanie informácií na konzolu sa používa funkcia printf(). Prekopírujte, skompilujte, spustite a preštudujte si nasledujúci kód a malo by vám to byť jasné. #include <a_samp> // obsahuje definiciu funkcie printf main() { printf("Tento text sa zobrazi na konzole."); // vypise obycajny text new number = 42; printf("Hodnota cisla je: %d.", number); // vypise hodnotu premennej typu cislo new string[]= "simple message"; // o stringoch sa viac dozviete v dalsich z vEndovych navodov printf("String obsahuje text: %s a nase predosle cislo bolo: %d.", string, number); new character = '@'; printf("Nejaky znak: %c.", character); // @ new Float:real = 0.61; printf("Nejake krasne desatinne cislo: %f", real); new pole[] = { 1, 2, 3 }; // opat vec na ktoru narazis v nasledujucom vEndovom navode printf("%d %d %d", pole[2], pole[1], pole[0]); }
  10. Nauč sa základy programovania. Začni v sekcii návody pre začiatočníkov a prejdi si všetky. Potom napíš a bude možné ti konkrétne pomôcť.
  11. Tanga

    pomoc textdraw

    Na disconnecte nerušíš hodnotu textdrawu, nie je možné, že po pripojení má hráč textdraw z predošlého hráča (minimálne na chvíľu)? Ale hlavne, prečo nepoužívaš PlayerTextdrawy? Nie je možné, že prekračuješ limit globalnych textdrawov a deje sa to isté ako keď sa bugujú dialogy (rovnaké IDčka)?
  12. Tanga

    pomoc textdraw

    Daj kód od GetPlayer2DZone(). Nie je chyba tam? Daj si to vypisovať do chatu prípadne a tak to otestuj. A kukni si GetPlayerPoolSize().
  13. Tanga

    pomoc sscanf

    Súhlasím, v praxi som videl sscanf iba ako plugin. Tento plugin tiež obsahuje .inc súbor (ktorý musíš použiť), ale nenachádza sa v ňom žiadny kód (iba prepojenie s pluginom).
  14. Tanga

    pomoc textdraw

    Pochopil som ťa správne, že ti chybne aktualizuje textdraw, resp. že má stále hodnotu "Blueberry Acres" aj keď si fyzicky v inej oblasti?
  15. Nenapísal si v čom je problém a celý systém ti nikto nenakódi. Buď si nejaký nájdi, alebo napíš ktorú časť nevieš urobiť... Jo a kód dávaj do "code", nie ako obrázok.
  16. O tom som ešte nepočul, že by to nefungovalo.
  17. Nebolo by logickejšie opraviť tú chybu v Auta.inc?
  18. Chyba je v súbore Auta.inc.
  19. Vyzera ze nevies co su ,,funkcie,, v programovani atd... Fakt najdi si knihu pre zaciatocnikov v programovani a to ti pomoze. Neodporucam jazyk java (na pawn sa vobec nepodoba) PS. Vsetci co su tu a chceli programovat ked mali 13 rokov tak to tak museli urobit. (Pripadne tutorialy na webe, ale musis iim fakt porozumiet)
  20. Tanga

    hledám Samp Sever

    Odporúčam ti zmazať z príspevku svoje skutočné meno a nastaviť si, že ti príde mejl keď niekto odpíše na tento príspevok / keď ti pošle súkromnú správu.
  21. Na prístup k všetkým súborov z priečinka v SAMP potrebuješ plugin, skús napr. rl_files. Na spodku príspevku je aj kód ako prejsť všetky súbory.
  22. Tanga

    pomoc Test Server

    Nič ine mi nenapada nez chyba operacneho systemu. Možno preinštalovat windows by som skusil. Ale radšej si ešte počkaj či nenapiše niekto iny.
  23. Tanga

    pomoc Test Server

    Jedna sa iba o prikazy? OnPlayerUpdate ti funguje? Resp. OnPlayerKeyStateChange ide normalne?
  24. Tanga

    pomoc Ukazatelé

    Čo je to pointer Využitia sú rôzne a pointery sa nachádzajú všade. Asi najznámejší ukazovateľ je "CIP" - current instruction pointer na architektúre x86. Všeobecne sa mu hovorí program counter. Na čo slúži? Jednoducho keď sa vykonáva kód, musíš vedieť ktorú inštrukciu vykonávaš.. A adresa tejto inštrukcie je vždy uložená na špeciálnom mieste - CIP. CIP sa zvyšuje prípadne upravuje s tokom programu. Napríklad pred volaním funkcie v Pawn je adresa nasledujúcej vykonávanej inštrukcie uložená do RAM. Do CIP sa vloží adresa na začiatok volanej (novej) funkcie. Po návrate z nej sa obnoví pôvodný CIP a pokračuje sa vo volajúcej (starej) funkcii. Pointer v Pawn Pawn bol navrhnutý tak, aby neobsahoval pointre, pretože pre neskúsených programátorov predstavujú riziko (ak uložíš dáta na miesto kam nemôžeš, jednoducho ti crashne appka). Napriek tomu na pointery môžeš naraziť. Väčšina významnejších kódov ich priamo používa (viaceré z knižnice y_ysi). Využívajú sa aj tu: new Float:x, Float:y, Float:z; GetPlayerPos(playerid, x, y, z); // tato funkcia nevracia returnom hodnotu, ale ulozi hodnoty do premennych x, y, z GetPlayerPos() prevezme adresy (resp. referencie), nie hodnoty a upraví to, čo je na daných adresách. Ak by si chcel urobiť niečo podobné (použiť referencie (referencie pracujú ako pointery) a prebrať adresy premenných namiesto hodnôt), môžeš definovať referencie pomocou '&': stock GetPlayerPosEx(playerid, &Float:x, &Float:y, &Float:z) { // vsimni si znak '&' x = y = z = 0; return; } Pokročilejšie využitia pointerov v Pawn už moc nemajú pre tvorcu módu význam a vyžadujú hlbšie znalosti nízkoúrovňových programovacích jazykov.
×
×
  • Create New...