strcmp selgitus
#1
Tere!
Käes laupäev ja mõtlesin teha veel ühe õpetuse. Seekord selgitan, kuidas töötab strcmp.
1) Mis asi on üleüldse strcmp ?
strcmp tähendab string compare ehk siis ta võrdleb antud tekste/numbreid üksteisega.
2) Kuidas kasutada strcmp'd?
See ei ole üldsegi keeruline. Kasutad sellist koodirida näiteks sisse logimisel:
PHP Code:
if(strcmp("Parool""Parool") == 0)
{
    
// Siia kood, kui nad ühtivad
   
SendClientMessage(playerid,0xFFC800FF,"Õige parool! Kohe laetakse teie andmed...");
}
else
{
    
// Siia siis kood, kui nad on üksteisest erinevad
   
SendClientMessage(playerid,0xFFC800FF,"Parooli ei kattu!");

Seletan siiski kõik lahti:
PHP Code:
if(strcmp("Parool""Parool") == 0
See on meie tähtsaim rida, ehk siis strcmp. Praegusel juhul kontrollitakse, kas esimene teksti(Hetkel "Parool") ja teine tekst(ka hetkel "Parool") kattuvad(Samhästi võivad olla need variabled/numbrid/laused näiteks), ning õnnestumise korral VÄLJASTATAKSE 0. Kui aga need kaks teksti/numbrit ei kattu, väljastatakse 1 või -1(Loe all sellest rohkem).
PHP Code:

Avame loogelised sulud.
PHP Code:
SendClientMessage(playerid,0xFFC800FF,"Õige parool! Kohe laetakse teie andmed..."); 
Siin me saadame mängijale oranži sõnumi, et tema paroolid kattuvad.
PHP Code:

Sulgeme loogelised sulud.
PHP Code:
else 
See ei vaja väga selgitust, aga igatahes tähendab see seda, et kui eelpool asuv if ei ole tõene, siis täidetakse else taga antud käsud.
PHP Code:

Avame jällegi loogelised sulud.
PHP Code:
SendClientMessage(playerid,0xFFC800FF,"Parooli ei kattu!"); 
Saadame seekord mängijale oranži) teate, et tema parool ei kattu soovitud parooliga.
PHP Code:

Sulgeme loogelised sulud.
3) Ennem ütlesid, et ta return'ib 0'i, kui tekstid kattuvad. Kas see oli kirjaviga?
Ei olnud. Selle vea teevad paljud algajad skripterid, et panevad sinna 1'he ja ei saa kudagi enam aru, miks asi ei tööta. Selgitan väheke, kuidas asi töötab, kuid ma ei hakka väga sügavale laskuma. PAWN võtab mõlemast tekstist 1 tähe ja võrdleb neid omavahel, kui kattuvad, väljastab 0'i ja kui ei kattu, väljastab 1'he. Siis võtab ta 2 tähe ja võrdleb neid omavahel, kui kattuvad, väljastab 0'i ja kui ei kattu, väljastab 1'he. Siis kolmanda, neljanda, viienda,jne samamoodi. Lõpuks kui kõik on null´id, väljastab ta ümardatult 0 nulli, kui aga ei ole kattunud, return'ib ta 1 või -1. Loodan, et saite siit natukene abi Smile .
Idee sain ametlikust SA-MP foorumist.

Palun mitte väljastada seda ilma minu loata!
Oliver
Reply
#2
See jäi vähe segaseks, et mis need "Parool" ja "Parool" endast kujutavad. Ma saan aru küll, et üks on see mis sa sisestad ja teine see mis olema peaks, aga võiks vähe rohkem seletada seda. Ja võiksid ka näiteid tuua mõnest GMist või ise teha.
PHP Code:
if(strcmp("Parool""Parool") == 0
Siin jäi see "-1" arusaamatuks, et mis see olema peaks?
PHP Code:
SendClientMessage(playerid,-1,"Õige parool! Kohe laetakse teie andmed..."); 

Ma ise sain muidu kõigest aru, aga lihtsalt panin ennast algaja olukorda ja küsisin Wink
Ja õpetus on väga hea! Võiks rohkemgi selliseid olla Smile
Reply
#3
Jap, praegu on seal võibolla kõike muud õpetatud peale strcmp'i.
Reply
#4
Seletan kohe seda osa natuke lahti Smile . Tänan vastuste eest. Aga see -1 tähendas muidu seda, et jääb valgeks(default).
/EDIT: Kas nüüd on natukene selgem või peaks veelgi rohkem seletama?
Reply
#5
Ma leian, et kui on strcmp selgitus, siis ongi strcmp selgitus, mitte SendClientMessage värvi õpetus. Muidugi võib selle sinna ka lisada, aga see pole asi, mis peaks küsimusi tekitama. Lisaks - SA-MP Wiki väidab sellist asja:
Quote:Returns
  • -1 if string1 comes before string2
  • 1 if string1 comes after string2
  • 0 if the strings are the same (for the matched length).
Ma küll pole kontrollinud, aga kui ta returnib sellises vormis, nagu sa nimetasid, mis saab siis pikematest võrdlustest (100-200+ tähte)? Nii suuri numbreid ei ole kuidagi võimalik väljastada (bittidena on võimalik max 31 täheline võrdlus, numbreid väljastades 10-täheline). Kas on viga minus või see ei sobi väga.
Ja üks asi veel - strcmp("Parool", "Parool") asemel võiks panna strcmp(string1, string2) - sedasi on minuarust lihtsam aru saada.
Sex, Drums and Rock'n'Roll
Reply
#6
Ajah, ajasin ühe asjaga segi Smile . Parandan ära.
Reply
#7
PHP Code:
// Miks kirjutada selline asi pikalt välja?
if(strcmp("Parool""Parool") == 0)
// Selleasemel saab ka teha nii, mis on vähe lihtsam ja hoiab sinu enda vaeva kokku
if(!strcmp("Parool""Parool")) 

Samuti kasutada värvina -1 on lollus.
Reply
#8
Miks teha asi rohkem keerulisemaks?
PHP Code:
// Väga loogiline ja arusaadav
if(strcmp("Parool""Parool") == 0)
//See aga võib algajale segaseks jääda, kui targemaks saab, küll jõuab koodi lühendada ka.
if(!strcmp("Parool""Parool")) 
See õpetus on mõldud ka algajatele. Aga värvi muutsin ära, kuna jah, siin õpetuses ei ole sellel mingit mõtet(KUID värvikirevatel teadetel on üldvärvina -1 hea kasutada).
Reply
#9
vot see on väga hea seletus ja näide, varem ei saanud ültse aru nendest aga nüüd sain täpselt aru mida see teeb. Siukesi õpetusi võiks rohkem panna, kuna neid include ja asju on suht palju. Koju jõuan siis proovin ja katsetan ka seda kohe. Rep +
Reply
#10
Võiks õelda, et seletus on rohkem nagu kogenumatele scripteritele, algaja sellest ikkagit midagi aru ei saaks.
Aga samas, kes ei proovi ei saa ka hakkama.
[GM] Urban RolePlay BaseScript MySQL, UCP - In-Progress
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)