Právě je úte 22. kvě 2012 10:54:23
Hosting WEDOS.cz
SLEVA 25% (slevový kód:PAWNO25)

Nejnovější témata:
[OCHRANA] FS Control [Identifikovac hack prikazov] od Om3n
[HELP] NHL 09 od MajkX
[Hlasovanie] Pridanie teamov do PICH od MajkX
[Ms 2012] NHL 2009 Remake od MajkX
[ HELP ]NPC od UpiR

Vyzkoušejte antivirus ESET Smart Security 5

Vyhledat témata bez odpovědí | Zobrazit aktivní témata Zobrazit nové příspěvky | Zobrazit vaše příspěvky


Všechny časy jsou v UTC + 1 hodina [ Letní čas ]





Odeslat nové téma Odpovědět na téma  [ Příspěvků: 10 ] 
Autor Zpráva
 Předmět příspěvku: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 19:11:00 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2873
Bydliště: Továrna na marmeželádu / Sklad bagrů

Pisu to proto, ze stale vidim ve scriptech co mi lidi posilaji na ICQ, ze v nich maji chyby to, ze cykly skoro vsichni delaji spatne.. Proto, uz jsem to nemohl vydrzet a musel jsem napsat tento tut.. Cely tut venuju cyklum i prave proto, ze tahle problematika muze nekomu prijit slozitejsi nez se zda.. Ovsem pokud si zapamatujete zakladni pravidla o tvorbe smycek (cyklu) nebudete mit problemy.

OK. Podivame se na zakladni smycku, ktera vypise jmena vsech hracu na serveru do logu z pohledu novacka (tedy jak by to udelala vetsina z vas na ICQ)
Kód:
for(new i=0;i<MAX_PLAYERS;i++);
{
     printf("%s",Jmeno(i));
}


Predem doufam, ze Jmeno(playerid) zname vsichni co cteme tutorial.. Jestli ne tak v sekci normalnich navodu urcite neco najdete..

Uz ted vam muzu ukazat, ze ta smycka bymohla vypadat o nec lepe psanim takhle:
Kód:
for(new i ; i < MAX_PLAYERS ; i++)


Pak dale je chyba pouzivanim MAX_PLAYERS kdyz pro nas samp tym udelal krasnou funkci GetMaxPlayers(), ktera zjistuje pocet slotu serveru z configu. Proto priste budeme psat smycku takto:
Kód:
for(new i ; i < GetMaxPlayers() ; i++)


O moc vetsi to neni a kdyz mame 50 slotovy server tak ustrime 450 zbytecnych smycek.. A kdyz tu smycku mate v 1 - 5 sekundovym timeru, tak nam to opravdu usetri CPU (Vzdyt ani tech 50 slotu zadnej CZ server nevyuzil :D)

Pak dalsi nehorazna ptakovina je umistovani cyklu do jinych cyklu.. To je ta nejvetsi ptakovina co by jste mohli vymyslet.. Nejlepe pochopitelne na prikladu:
Kód:
for(new i ; i < GetMaxPlayers() ; i++)
{
    printf("%s",Jmeno(i));
    for(new p ; p < GetMaxPlayers() ; p++)
    {
        printf("%d",GetPlayerPing(p));
    }
}


Na nic lepsiho jsem neprisel, proste ja uz to mam zafixovany proto tyhle smycky nedelam.. Samozrejme ty smycky v sobe co mi posilate vy vypadaji jinak.. Tohle je 7 vec co me napadla a ja ji uznal za nejlepsi..

A ted vam konecne vysvetlim proc vlastne je to chyba davat smycky do sebe.. Je to jednoduchy .. Rekneme si, ze mame 50 slotovej server.. A dame tyhle dve smycky.. Vysledkem bude celkove provedeni cyklu 50 * 50 = 2 500. Protoze v prvni smycce mame druhou smycku, ktera se provede 50x a pak tepve prvni smycka prejde do dalsiho kroku tedy druheho z 50ti.. Takze jeden loop v prvnim cyklu provede 50 dalsich loopu druheho cyklu a tak to pokracuje dal.. Tim docilime 2 500 loopu celkem.. Pritom, kdyby jsme tu druhou smycku dali az za tu prvni dosahli bychom jen 100 loopu.. A to je sakra velkej rozdil..

Pak se dostavam k cyklu while, kterej je jeste horsi na pochopeni (Jeste mam zivou pamet z mejch zacatku..). Vubec jsem nemohl pochopit k cemu je dobry a jak se vubec pouziva, pritom je to jednoduche.. While se pouziva k tomu, kdy potrebujete loopovat do doby dokud plati podminka.. Tim by se dalo docilit i jednoduche logicke podminky s prikazem "goto" v jejim tele, ale while je prece jen k tomu delany, tak proc ho nevyuzit..

Kód:
while(a == 1)
{
    print("Promenna a je stale 1");
}


Tento cyklus, vam zaspamuje log a s nejvetsi pravdepodobnosti shodi server.. Jde o to, ze kdyz promenne a prirovnate hodnotu 1 a udelate cyklus while na rovnost a k jedne, tak se smycka bude opakovat do te doby, co promenne a neprirovnate zase jinou hodnotu nez 1.. Ja osobne ted v tuhle chvili nevidim, zadnou situaci, kde by se to dalo pouzit, ale vyuzit to muzete jak chcete.. Takze vlastne while je neco jako if s tim rozdilem, ze dokud podminka plati, bude vykonavat akce ve svem telu..

A jeste upozorneni: Pokud se podminka while ukonci, tak script jede dal a i kdyby jste promenne a prirovnali zase hodnotu 1 tak uz se while nespusti..

Doufam, ze jsem napsal vse co jsem chtel a na nic nezapomel.. Pripominky a komntare piste jak chcete..

_________________
*Brain reset*
With new brain, new personality, new ffredyk..


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 19:13:28 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: stř 18. úno 2009 12:34:23
Příspěvky: 2626

dobrý ještě si mohl dát upozornění že když dají cyklus a pak spustí funkci ve ktere je další cyklus tak vziknou bugy...

_________________
AdminBot Osfald v4.0

Aktuální práce:
The BlueShark
AdminBot Osvald v4.1

Pub4Fun Freeroam RELOADED


Další práce v budoucnu:
AdminBot Osvald v5.0
- (90% že bude)
Game Over - The Next Series - nejisté


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 19:22:06 
The Truth
The Truth
Uživatelský avatar
Registrován: sob 29. srp 2009 17:20:55
Příspěvky: 422
Bydliště: Šumperk

pěkný jen funci GetMaxPlayers() jsem už zjistil a funkci while nyní nemám jak použít ale až budu tak se sem vrátím :)


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 22:06:13 
Carl Johnson "CJ"
Carl Johnson "CJ"
Uživatelský avatar
Registrován: čtv 29. led 2009 20:03:51
Příspěvky: 4540
Bydliště: Blava ne ?

ja while moc nepoužívam, dakujem za vysvetlenie ale radšej si to trénujem v praxi, to znamená že ked mám
new pocet;
while(pocet != 100){
pocet++;
}

bude ten cyklus opakovať dovtedy pokiaľ nebude premena pocet na 100 ?
ešte si mal pridať večné chyby ako npr. IsPlayerConnected

ak ťa smiem doplniť
Ak máte 500 slotový server je dobré využívať miesto GetMaxPlayers() alebo MAX_PLAYERS premenu viz na príklade
hore
Kód:
new Pripojenych;


do onplayerconnect
Kód:
Pripojenych++;

do onplayerdisconnect
Kód:
Pripojenych--;

a potom cyklus
Kód:
for(new i; i<Pripojenych; i++){
...
}


Dalej, ak chcete zlepšovák tu je
Spoiler:
#define ForConnect(%0,%1) for(new %0; %0<%1; %0++) if(IsPlayerConnected(%0))

&
Spoiler:
#define ForEx(%0,%1) for(new %0; %0<%1; %0++)

využitie
Spoiler:
ForConnect(i,GetMaxPlayers()){
printf("%s %d %d"Jmeno(i),GetPlayerScore(i),GetPlayerIp(i));
}

a využitie ForEx
Spoiler:
ForEx(i,10)
{
DestroyObject(Objects[i]);
}
npr. admin chata (miesto move object,)

tut 10/10

_________________
Moja tvorba http://pastebin.com/u/PatchwerkQWER
Ak chceš byť lepší ako ja, a budeš sa snažiť budeš lepší ! Už len pri pomyslení na to, že si lepší než ja, ťa posunie dopredu. Ale nezabudni ! Musíš sa snažiť. A potom zistíš to, čo vie pár ľudí - že som lama a moje scripty sú nič oproti tomu, čo môžeš vytvoriť ty. Tak sa prekonaj ako kedysi ja, a natri to všetkým ! Uprav budúcnosť pre svoj prospech


Naposledy upravil QWER dne sob 04. zář 2010 22:19:49, celkově upraveno 1

Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 22:08:44 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2873
Bydliště: Továrna na marmeželádu / Sklad bagrů

QWER píše:
ja while moc nepoužívam, dakujem za vysvetlenie ale radšej si to trénujem v praxi, to znamená že ked mám
new pocet;
while(pocet != 100){
pocet++;
}

bude ten cyklus opakovať dovtedy pokiaľ nebude premena pocet na 100 ?


Jo presne tak.. Jak rikam (pisu) je to jen "IFová smyčka" :lol:

_________________
*Brain reset*
With new brain, new personality, new ffredyk..


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 22:11:33 
Carl Johnson "CJ"
Carl Johnson "CJ"
Uživatelský avatar
Registrován: čtv 29. led 2009 20:03:51
Příspěvky: 4540
Bydliště: Blava ne ?

ok diky to som potreboval vedieť :D a dopln tam ten môj text pod tou praktickou otázkou, možno sa to hodí :)

_________________
Moja tvorba http://pastebin.com/u/PatchwerkQWER
Ak chceš byť lepší ako ja, a budeš sa snažiť budeš lepší ! Už len pri pomyslení na to, že si lepší než ja, ťa posunie dopredu. Ale nezabudni ! Musíš sa snažiť. A potom zistíš to, čo vie pár ľudí - že som lama a moje scripty sú nič oproti tomu, čo môžeš vytvoriť ty. Tak sa prekonaj ako kedysi ja, a natri to všetkým ! Uprav budúcnosť pre svoj prospech


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: sob 04. zář 2010 22:12:24 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2873
Bydliště: Továrna na marmeželádu / Sklad bagrů

QWER píše:
ok diky to som potreboval vedieť :D a dopln tam ten môj text pod tou praktickou otázkou, možno sa to hodí :)


Uz jsi to napsal ty.. Mas to kousek podemnou a je to dlouhej prispevek.. Urcite na to kazdej mrkne ;)

_________________
*Brain reset*
With new brain, new personality, new ffredyk..


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: ned 05. zář 2010 8:58:46 
Carl Johnson "CJ"
Carl Johnson "CJ"
Registrován: stř 19. srp 2009 17:31:39
Příspěvky: 6369

QWER - to me nenapadlo to takhle udelat a urcite to ma neco do sebe diky za info :D

ffredyk - TuT peknej ale mohl by si udelat TuT na tyhle veci z wiki, protoze s nema se naucit potrebuje kazdej pawner - http://wiki.sa-mp.com/wiki/Keywords:Statements


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: ned 05. zář 2010 9:14:11 
Marc Wayne "B-Dup"
Marc Wayne "B-Dup"
Registrován: úte 13. říj 2009 17:56:16
Příspěvky: 846

QWER píše:
do onplayerconnect
Kód:
Pripojenych++;

do onplayerdisconnect
Kód:
Pripojenych--;

a potom cyklus
Kód:
for(new i; i<Pripojenych; i++){
...
}



A napadlo te, ze kdyz se pripoji hrac s id 0 pak 1 pak 2 pak 3 a ten s ID2 se odpoji tak to prejede jen 0,1,2 a na 3. bude zapomenuto ? ...



A ja sem while pouzil kdyz jsem projizdel vsechny zaregistrovany uzivatele na serveru (jejich nicky jsem mel v textaku) .

_________________
Anarchie je jen sekundární název samovolného pořádku.
<?php
while(true)
{
echo "<script>";
echo "alert('Strašně XSSáckej text!')";
echo "</script>";
}


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: ned 05. zář 2010 9:17:24 
Carl Johnson "CJ"
Carl Johnson "CJ"
Uživatelský avatar
Registrován: čtv 29. led 2009 20:03:51
Příspěvky: 4540
Bydliště: Blava ne ?

fakt, skúsim to upraviť diky nenapadlo ma to

_________________
Moja tvorba http://pastebin.com/u/PatchwerkQWER
Ak chceš byť lepší ako ja, a budeš sa snažiť budeš lepší ! Už len pri pomyslení na to, že si lepší než ja, ťa posunie dopredu. Ale nezabudni ! Musíš sa snažiť. A potom zistíš to, čo vie pár ľudí - že som lama a moje scripty sú nič oproti tomu, čo môžeš vytvoriť ty. Tak sa prekonaj ako kedysi ja, a natri to všetkým ! Uprav budúcnosť pre svoj prospech


Offline
 Profil  
 Předmět příspěvku: Re: [F]Lekce 5. - Problematika cyklu
PříspěvekNapsal: čtv 30. zář 2010 16:00:52 
Marc Wayne "B-Dup"
Marc Wayne "B-Dup"
Registrován: úte 13. říj 2009 17:56:16
Příspěvky: 846

slo by to takto

new connected;

connect >
Kód:
connected ++;

disconnect >
Kód:
connected --;

a pak
Kód:
for(new i=0;i<connected;i++)
{
new idPlus;
if(IsPlayerConnected(i+idPlus))
{
funkce (pouzivat 'i+idPlus')
} else idPlus ++;
}


ale nevim ..

_________________
Anarchie je jen sekundární název samovolného pořádku.
<?php
while(true)
{
echo "<script>";
echo "alert('Strašně XSSáckej text!')";
echo "</script>";
}


Naposledy oživil ffredyk v čtv 30. zář 2010 16:00:52


Offline
 Profil  
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 10 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


 Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na: