Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  funktsioon märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 22.05.2014 10:33:18 funktsioon vasta tsitaadiga

Miks see kood annab tulemuseks:
5, 4, 3, 2, 1,
T:

Aga mitte:
T: 6

php:
  1. <?
  2.         function test($count){
  3.                 $count=$count+1;
  4.                 if($count>5){
  5.                         return $count;
  6.                 }
  7.                 else{
  8.                         test($count);
  9.                 }
  10.                 echo $count.", ";
  11.         }
  12.         echo "<br />T: ".test(0);
  13. ?>


Miks see kood üldse passib rida echo $count.", ";?
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 22.05.2014 11:14:38 vasta tsitaadiga

Sest see on kirjutatud täpselt nii, et tulemus oleks:
5, 4, 3, 2, 1,
T:

Miks?
Lahkame veits koodi.

Iteratsioonil 1, ehk siis kui funktsioon välja kutsutakse:
$count = 1;

Järelikult läheb käiku else blockis olev test($count); Pane tähele. Siin ei ole returni, mis tähendab et see funktsioon ei tagasta midagi.

Iteratsioonil 2, ehk siis kui funktsioon kutsutakse välja juba rekursiivselt:
$count = 2;

Jälle läheb käiku else block. Sama teema, returni pole niiet midagi ei tagastata eelmisele funktsioonile.

JNE kuniks $count > 5;

Siis returnitakse 1 korra, ehk eelmisele funktsioonile ning siis kõik eelenvad funktsioonid prindivad tagurpiri $counti välja.

Ehk siis:

reaalne $count on siis igas funktsioonis +1.
test(0) -> test(1) -> test(2) -> test(3) -> test(4) -> test(5) (returnib, niiet echo ei jookse) -> test(4) lõpetab if blocki ning echob -> test(3) -> lõpetab if blocki ning echob -> test(2) -> lõpetab if blocki ning echob -> test(1) -> lõpetab if blocki ning echob -> jookseb lõpuks echo T:, test(0) ei tagasta midagi.


Kui sa tahad, et see teeks seda mida sa kirjeldad, siis:


<?
        function test($count){
                $count=$count+1;
                if($count>5){
                        return $count;
                }
                else{
                        return test($count);
                }
        }
        echo "<br />T: ".test(0);
?>

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 22.05.2014 11:25:34 vasta tsitaadiga

Redikate, aah, niimoodi. icon_biggrin.gif Pole varem kordagi kasutanud PHP funktsioonis sellesama funktsiooni kutset ning ei mõistnud täpselt returni toimimist.

Tänan põhjaliku ja arusaadava vastuse eest! icon_smile.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 22.05.2014 11:35:45 vasta tsitaadiga

Antud juhul on muidugi rekursiivse funktsiooni kasutamine liiast ning võiks lahendada itereerimisega.
_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 22.05.2014 11:36:09 vasta tsitaadiga

Selle asja nimi on rekursioon ehk inglise keeles recursion. Kui seda õigesti ja õiges kohas kasutada, siis on ta hea, aga kui hooletult kasutada, siis ei pea probleeme kaua ootama icon_wink.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 22.05.2014 16:08:45 vasta tsitaadiga

Redikate kirjutas:
Antud juhul on muidugi rekursiivse funktsiooni kasutamine liiast ning võiks lahendada itereerimisega.

Jah, see oli vaid lihtsustatud funktsioon. Tegelik funktsioon, mis vajab veel testimist, on see:

php:
  1.  
  2. <?
  3.         function preparefile($file4prep,$filedir,$xcount,$imagesize){
  4.                 $xcount=$xcount+1;
  5.                 if(!file_exists("../images/".$filedir."/".$file4prep)){
  6.                         if(preg_match("/_ver(\d+)\./", $file4prep, $matches)){
  7.                                 $explode=explode("_ver".$matches[1].".", $file4prep);
  8.                                 $implode=implode("_ver".$matches[1].$imagesize.".",$explode);
  9.                         }
  10.                         else{
  11.                                 $explode=explode(".", $file4prep);
  12.                                 $implode=implode("_ver".$xcount.$imagesize.".",$explode);
  13.                         }
  14.                 }
  15.                 else{
  16.                         if(preg_match("/_ver(\d+)\./", $file4prep, $matches)){
  17.                                 $explode=explode("_ver".$matches[1].".", $file4prep);
  18.                                 $matches[1]=$matches[1]+$xcount;
  19.                                 $implode=implode("_ver".$matches[1].$imagesize.".",$explode);
  20.                         }
  21.                         else{
  22.                                 $explode=explode(".", $file4prep);
  23.                                 $implode=implode("_ver".$xcount.$imagesize.".",$explode);
  24.                         }
  25.                 }
  26.                 if(file_exists("../images/".$filedir."/".$implode)){
  27.                         return preparefile($file4prep,$filedir,$xcount,$imagesize);
  28.                 }
  29.                 else{
  30.                         return "../images/".$filedir."/".$implode;
  31.                 }
  32.         }
  33.  
  34.         $source_t=$_FILES['fupload'.$x.'_thumb']['tmp_name'];
  35.         $target_t=preparefile($_FILES['fupload'.$x]['name'],$userdir,0,"_thumb");
  36.         $move_t=move_uploaded_file($source_t, $target_t);
  37.         $source=$_FILES['fupload'.$x]['tmp_name'];
  38.         $target=preparefile($_FILES['fupload'.$x]['name'],$userdir,0,"");
  39.         $move=move_uploaded_file($source, $target);
  40.  
  41. ?>


See on osa koodist, mis sisaldab veel mitmeid veatuvastusi failide sisestamisel ja salvestamisel. Kui see funktsioon veel läbib katsetena meelevaldsed sisendid, siis peaks sellega saama üle laadida vaid pilte ning selliselt, et iga isiku kohta on kataloogis eraldi kaust, mis sisaldab kõiki temaga seotud faile. Piltide juurkataloogis on veel tekstifail, mis loob seose kaustade ja kasutajate nimede vahel, kuna kasutaja nimed võivad sisaldada URL-i jaoks sobimatuid märke. Kasutaja nimest ja sisendfailidest trimmitakse ära URL-i jaoks sobimatud sümbolid.

Kuna kausta nimi on võimalikult sarnane kasutaja nimega, millest on välja trimmitud sobimatud märgid, võib juhtuda harukordne juhus, kus pärast trimmimist saavad kahe erineva inimese kausta nimeks URL-ina ühine kaust. Sellele pean lahenduse leidma.

Ja et pildid oleksid korrektselt vormindatud, laetakse pisipilt arvutist, kuid nimeks saab sellele suure pildi nimi + lõpus "_thumb", et failid asuksid koos. Samanimelised failid saavad eristamiseks juurde sõned "_ver[number]".

Selliselt saab brutaalselt pilte lisada, muuta ja kustutada ka otse veebikataloogist. Vahepeal oli mõte andmebaasi kasutada, et seal seosed luua, aga kui miski läheb kausta ja andmebaasi struktuuri vahel nihu, siis võib tulemuseks olla pehmelt öeldes puder ja kapsad.

PS! Mu loogika on vist vilets, sest vahepeal jookseb juhe kokku ja ei saa essugi aru, mis seni tehtud on. icon_eek.gif Peaks õppima kuidagi lihtsamaid funktsioone tegema või kuidagi mitme funktsiooni vahel asjad ära jaotama. Samas vihkan seda. icon_eek.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 22.05.2014 17:35:37 vasta tsitaadiga

Ma pakuks, et need kaustanimed võiks olla lihtsalt numbrid, igal kasutajal oma, milleks mingeid veidraid kasutajanimelisi kaustu ilma täppideta? Sa hakkad ju kasutaja andmeid kusagil hoidma arvatavasti andmebaasis, siis pole ju mingit mõtet, et on kasutajanimeline, kasuta kasutaja ID näiteks. Ära lase kunagi kasutajal salvestada oma nimega faile ta võib sulle sinn tahta panna faili Minu metsikud rannapildid Muhumaal. Mina Malle Jüri ja koer 2000.jpg või veel sootuks midagi hullemat. Genereeri üleslaetavale failile unikaalne nimi, salvestad selle kasutaja piltide andmebaasi ja pildi originaal nimi läheb andmebaasi eraldi väljale. Võid anda kasutajale veel võimaluse pildinime muutmiseks siis läheks uus nimi sinna nime väljale.
Tutvu ka sellega, mis annab php abil failist kätte saada, et ei peaks failinime järgi laiendeid otsima vms. http://www.php.net/manual/en/function.filetype.php

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 22.05.2014 18:39:22 vasta tsitaadiga

andrusny, puhtalt lihtsuse ja mugavuse mõttes. Kaustanimedest trimmitakse ebasobivad sümbolid välja, s.h kõik punktid, failinimedes punktid jäävad. Faili nimeks võibki olla kasutaja poolt täiesti suvalt valitud, peaasi, et neid olemasolevatega üle ei kirjutata. Muid andmeid failidega ei kaasnegi, vaid kasutaja-kaust-pildid kaustas.

Sinu lahendus oleks muidugi korrektsem. icon_wink.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 23.05.2014 15:28:13 vasta tsitaadiga

See ei ole tegelikult lihtsus ja mugavus. Andmebaas ja juhuslikud failinimed teeks selle märksa mugavamaks. Kood oleks lihtsam, tõenäosus, et kunagi miskit pekki läheb, on väiksem jne. Baasi ja failide sünkist välja minemine - kuidas see juhtuma peaks? Kui sa just kedagi otse failikataloogi lammutama ei lase ja kogu ligipääs toimub vaid sinu rakenduse kaudu, siis ei saa seda olukorda tekkida. (Eeldusel, et sa korralikku koodi oled suutnud kirjutada)
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 23.05.2014 16:03:04 vasta tsitaadiga

Noh väike mõte sellel ju on, ka ajalehed koostavad viimasel ajal urle kujut ajaleht.xx/artikkel/pets-käis-koplis-tüli-norimas ehk kui anda kellelegi link minudoomen.ee/kasutaja/püüdsin-kolme-kilose-haugi.jpg siis erinevalt kujust minudoomen.ee/pilt.php?user=t5346456&content=5645765756 saab juba lingist aimu, millega tegemist võib olla. Iseasi muidugi kas see tekst peaks just primaarvõti olema.

viimati muutis napoleon 23.05.2014 22:26:46, muudetud 1 kord
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 23.05.2014 16:46:06 vasta tsitaadiga

Seda nimetatakse ka slug, ingl keeles. Kujul www.minu.aa/dress/midagi-juhtus-siin
Vahest v6ib ka discriminator kusagil olla, nt www.minu.aa/dress/123214-midagi-juhtus-siin - antud juhul on 123214 discriminator. Friendly URLides on p2ris populaarsed.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 23.05.2014 17:47:58 vasta tsitaadiga

Asja mõte ongi selles, et faili nime või kausta kaudu saaks inimmõistuse abil aimu, millise pildi või millise kasutajaga on tegu. Kui see vabas vormis kausta või faili nimi peaks URL-is niikuinii olema, võib see samahästi olla seesamune nn primaarvõti.

Näiteks seesama phpBB foorumid - https://foorum.hinnavaatlus.ee/viewtopic.php?t=610971&start=0&postdays=0&postorder=asc&highlight=

Saa sa nüüd aru, kuhu see link viib. Peab enne avama. Inimmõistuse jaoks sõbralikud URL-id on paremad. icon_smile.gif

Oma kodukal olengi kasutanud primaarvõtmena ID numbrit ehk kuni ID-d ei muuda, võib URL-i lisada või eemaldada ükskõik mida, link avaneb -> http://liivanelord.planet.ee/?id=375&Windows_7 Kui seda "kommentaari" URL-is ei oleks, oleks märkimisväärselt ebamugavam neist linkidest ülevaade saada.
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
sigakoer
Kreisi kasutaja

liitunud: 23.01.2004




sõnum 28.05.2014 10:41:41 vasta tsitaadiga

LiivaneLord kirjutas:

PS! Mu loogika on vist vilets, sest vahepeal jookseb juhe kokku ja ei saa essugi aru, mis seni tehtud on. icon_eek.gif Peaks õppima kuidagi lihtsamaid funktsioone tegema või kuidagi mitme funktsiooni vahel asjad ära jaotama. Samas vihkan seda. icon_eek.gif

Asi on selles et sa ise kirjutad oma koodi keeruliseks. Paar väga olulist nõuannet sulle:

- Elimineeri korduv kood!!! Sul ei tohiks olla põhjust kirjutada samu ridu rohkem kui üks kord (või äärmisel juhul kaks). See on üks fundamentaalsemaid reegleid hea koodi juures. Korduv kood on maru suur vigade allikas ning teeb koodi pikemaks ja keerulisemaks kui see tegelikult on. Näiteks 11-12 ja 22-23 on täpselt ühesugused; kui rida 18 ühe rea võrra nihutada on 7-8 ja 17-19 ka täpselt samad; 34-36 ja 37-39 erinevad ka ainult "" ja "_thumb" osas. Tee need eraldi funktsioonideks ning see viimane string nagu "_thumb" anna funktsiooni parameetriks ning $move/$move_t võta väljundist. Kogu su keeruline if() lause kuivaks täitsa kokku.

- Kasuta arusaadavaid nimesid funktsioonide ja muutujate juures. Ära karda kasutada pikemaid ent arusaadavaid nimesid. Normaalsetel tööriistadel on autocomplete. Ära karda defineerida lühikesi ent arusaadava nimega funktsioone näiteks
"../images/".$filedir."/".$implode
tarbeks.

- Tõenäoliselt on sul seal turvaauke, aga ei viitsi praegu täpselt süveneda. icon_razz1.gif
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 28.05.2014 18:59:07 vasta tsitaadiga

sigakoer kirjutas:
- Tõenäoliselt on sul seal turvaauke, aga ei viitsi praegu täpselt süveneda. icon_razz1.gif

Kardan ka seda. icon_redface.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  funktsioon
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.