CoolBasic Classic: Kehitysuutisten kommentit
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
CoolBasic Classic: Kehitysuutisten kommentit
Voitte täällä vapaasti kommentoida CoolBasic Classic:n kehitysuutisia. Perustellut kommentit saattavat jopa vaikuttaa siihen miten CoolBasic Classic:n ominaisuudet rakennetaan
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic Classic: Kehitysuutisten kommentit
kappas, tuo omien komentojen luonti Sub-aliohjelmalla kuulostaa hyvältä, pääsee käyttäjät luomaan omia komentojaan, vaikka onnistuuhan se funktioillakin, mutta varmasti hyvä uudistus Wanhan cb:n tyyliin verrattuna
ja se omien funktioiden/komentojen värjäys ominaisuus olisi kyllä omasta mielestäni erittäin tervetullut, ja saattaisi helpottaa koodin lukemistakin kun kaikki ei ole pelkkää mustaa..
ja jos oikein vääntäisi hienon tekstinvärjäys-systeemin, niin voisi omille että valmiille funk/kom, valita omat värinsä, kuten varmasti myös muunlainen mahdollisuus "tuunata" editorin ulkoasua piristäisi koodailua..
mutta tietysti kannattaa miettiä mikä on oleellista ja vaikka julkaisun jälkeen kehittää niitä pikkujuttuja enemmän..
ja se omien funktioiden/komentojen värjäys ominaisuus olisi kyllä omasta mielestäni erittäin tervetullut, ja saattaisi helpottaa koodin lukemistakin kun kaikki ei ole pelkkää mustaa..
ja jos oikein vääntäisi hienon tekstinvärjäys-systeemin, niin voisi omille että valmiille funk/kom, valita omat värinsä, kuten varmasti myös muunlainen mahdollisuus "tuunata" editorin ulkoasua piristäisi koodailua..
mutta tietysti kannattaa miettiä mikä on oleellista ja vaikka julkaisun jälkeen kehittää niitä pikkujuttuja enemmän..
Re: CoolBasic Classic: Kehitysuutisten kommentit
Tässä muutama ehdotus:
- Kattava tutoriaali, kuten tähänkin mennessä on ollut. Mielestäni tämä on ollut tähän mennessä CB:n suurin vahvuus.
- Automaattinen sisennys: Melko helppo toteuttaa, mutta helpottaa huomattavasti koodarinelämää ( esim. code::blocksissa on tämä ominaisuus )
- Qbasicistä tyyppien käyttäminen taulukoissa (ellei ole jo tulossa jotain uudenlaista tyyppi- / oliojärjestelmää)
esim.
- Kattava tutoriaali, kuten tähänkin mennessä on ollut. Mielestäni tämä on ollut tähän mennessä CB:n suurin vahvuus.
- Automaattinen sisennys: Melko helppo toteuttaa, mutta helpottaa huomattavasti koodarinelämää ( esim. code::blocksissa on tämä ominaisuus )
- Qbasicistä tyyppien käyttäminen taulukoissa (ellei ole jo tulossa jotain uudenlaista tyyppi- / oliojärjestelmää)
esim.
Code: Select all
Type piste
Field x As int
Field y As int
EndType
Dim taulu[10] As piste
- Sami The Great
- Advanced Member
- Posts: 485
- Joined: Tue Aug 28, 2007 4:15 pm
- Contact:
Re: CoolBasic Classic: Kehitysuutisten kommentit
Itse toivoisin, että syntaksi olisi suurinpiirtein samanlaista kuin nyt, että vanhat projektit olisi sitten helppo kääntää uudelle syntaksille.
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
CoolBasickin käyttäjä vuodesta 2004.
Re: CoolBasic Classic: Kehitysuutisten kommentit
Kenties jopa niin helppo, että käännös voitaisiin tehdä täysin konevoimin.. ? (jos näin nyt haluaa tehdä..)Sami The Great wrote:Itse toivoisin, että syntaksi olisi suurinpiirtein samanlaista kuin nyt, että vanhat projektit olisi sitten helppo kääntää uudelle syntaksille.
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: CoolBasic Classic: Kehitysuutisten kommentit
Nykyisessä CoolBasicissa on suunnitteluvirhe, joka olisi hyvä olla korjattuna uudessa versiossa.
Kyseinen koodi kaataa ohjelman, vaikka näin ei kuuluisi olla. Ensimmäisen rivin suorituksen pitäisi päättyä heti and-sanaan tultaessa, koska tämän jälkeen rivin loppukoodilla ei ole enää väliä. Homman voi kiertää kahdella if-lauseella, mutta miksi laittaa käyttäjä kirjoittamaan purkkaa kun sama toimii esim. C++:ssa?
Ominaisuus on kätevä, jos halutaan tarkistaa if-lauseessa esim. dynaamisen muistin sisältöä tarkistaen ensin ettemme kuitenkaan lukisi sitä yli.
Code: Select all
If 0 And ObjectX(0) Then
// ...
EndIf
Ominaisuus on kätevä, jos halutaan tarkistaa if-lauseessa esim. dynaamisen muistin sisältöä tarkistaen ensin ettemme kuitenkaan lukisi sitä yli.
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic Classic: Kehitysuutisten kommentit
Joissakin ohjelmointikielissä "and"- ja "or"-operaattorit ovat "oikosuljettuja", eli jos ensimmäisen operandin perusteella voidaan jo päätellä koko logiikkaoperaation lopputulos, jätetään jälkimmäinen operandi laskematta.
Tällaisessa toteutuksessa on hyvät ja huonot puolensa. Hyvät liittyvät mm. suorituskyvyn parantamiseen, kun taas huonot päätyvät väärään lopputulokseen seuraavassa tapauksessa:
Tällaisessa toteutuksessa on hyvät ja huonot puolensa. Hyvät liittyvät mm. suorituskyvyn parantamiseen, kun taas huonot päätyvät väärään lopputulokseen seuraavassa tapauksessa:
Code: Select all
// Jos a=1, tämä lauseke on TOSI vaikka oikeasti se on EPÄTOSI
If a=1 And a=2 Then
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic Classic: Kehitysuutisten kommentit
Hmm, en ymmärrä miksi tuossa esimerkkitapauksessa ohjelma päättelisi tuon olevan tosi, vain koska ensimmäinen osa pitää paikkansa(AND antaa varman tuloksen ensimmäisestä ehtolauseesta vain, jos se on FALSE). Mielestäni tällaiset "oikosuljetut" operaattorit olisi hyvä olla erillisenä operaattorina, niin että voi itse päättää, tutkitaanko kummatkin ehtolauseet, vai katsotaanko jos ensimmäinen ratkaisee kokonaistuloksen.Zero wrote:Joissakin ohjelmointikielissä "and"- ja "or"-operaattorit ovat "oikosuljettuja", eli jos ensimmäisen operandin perusteella voidaan jo päätellä koko logiikkaoperaation lopputulos, jätetään jälkimmäinen operandi laskematta.
Tällaisessa toteutuksessa on hyvät ja huonot puolensa. Hyvät liittyvät mm. suorituskyvyn parantamiseen, kun taas huonot päätyvät väärään lopputulokseen seuraavassa tapauksessa:Code: Select all
// Jos a=1, tämä lauseke on TOSI vaikka oikeasti se on EPÄTOSI If a=1 And a=2 Then
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: CoolBasic Classic: Kehitysuutisten kommentit
Vaikuttaa siltä, ettet ymmärtänyt mitä hain takaa.Zero wrote:Tällaisessa toteutuksessa on hyvät ja huonot puolensa. Hyvät liittyvät mm. suorituskyvyn parantamiseen, kun taas huonot päätyvät väärään lopputulokseen seuraavassa tapauksessa:Code: Select all
// Jos a=1, tämä lauseke on TOSI vaikka oikeasti se on EPÄTOSI If a=1 And a=2 Then
Code: Select all
#include <iostream>
int main()
{
int a = 1;
std::cout << (a == 1 && a == 2) << std::endl;
}
Re: CoolBasic Classic: Kehitysuutisten kommentit
Oikosulkevat operaattorit saavat tehdä sen vain kun lauseen arvo on aivan varma. And-operaattori siis lopettaa tarkistuksen vain jos ensimmäinen osa ei ole tosi, or taas lopettaa sen jo kun ensimmäinen osa on tosi. XOR ei koskaan ole täten oikosulkeva, sillä sen tulee tarkistaa molemmat operaattorit aina.Zero wrote:Joissakin ohjelmointikielissä "and"- ja "or"-operaattorit ovat "oikosuljettuja", eli jos ensimmäisen operandin perusteella voidaan jo päätellä koko logiikkaoperaation lopputulos, jätetään jälkimmäinen operandi laskematta.
Tällaisessa toteutuksessa on hyvät ja huonot puolensa. Hyvät liittyvät mm. suorituskyvyn parantamiseen, kun taas huonot päätyvät väärään lopputulokseen seuraavassa tapauksessa:Code: Select all
// Jos a=1, tämä lauseke on TOSI vaikka oikeasti se on EPÄTOSI If a=1 And a=2 Then
Taisit tosiaan ymmärtää Grandin hiukan väärin.
Re: CoolBasic Classic: Kehitysuutisten kommentit
Ehdottomasti != -vertailu mukaan. En ymmärrä miksei sitä ole nykyisessä versiossa. :/ Tai sitten on, mutten vain ole löytänyt sen vastinetta.
-
- Tech Developer
- Posts: 545
- Joined: Sun Aug 26, 2007 2:43 pm
- Location: Liminka
Re: CoolBasic Classic: Kehitysuutisten kommentit
Nykyisessä versiossa vastineena toimii <> -vertailu.Bambi wrote:Ehdottomasti != -vertailu mukaan. En ymmärrä miksei sitä ole nykyisessä versiossa. :/ Tai sitten on, mutten vain ole löytänyt sen vastinetta.
CoolBasic henkilökuntaa
Kehittäjä
cbFUN Kello
cbSDL
Whale.dy.fi
<@cce> miltäs tuntuu olla suomen paras
Kehittäjä
cbFUN Kello
cbSDL
Whale.dy.fi
<@cce> miltäs tuntuu olla suomen paras
- Zero
- Lead Developer
- Posts: 727
- Joined: Sun Aug 26, 2007 2:30 pm
- Location: Helsinki, Finland
- Contact:
Re: CoolBasic Classic: Kehitysuutisten kommentit
Nyt menee omaan piikkiin. Aivan näinhän se on. Taisin olla vähän liian väsynyt kun tuon kirjoitinesa94 wrote:Oikosulkevat operaattorit saavat tehdä sen vain kun lauseen arvo on aivan varma. And-operaattori siis lopettaa tarkistuksen vain jos ensimmäinen osa ei ole tosi, or taas lopettaa sen jo kun ensimmäinen osa on tosi. XOR ei koskaan ole täten oikosulkeva, sillä sen tulee tarkistaa molemmat operaattorit aina.Zero wrote:Joissakin ohjelmointikielissä "and"- ja "or"-operaattorit ovat "oikosuljettuja", eli jos ensimmäisen operandin perusteella voidaan jo päätellä koko logiikkaoperaation lopputulos, jätetään jälkimmäinen operandi laskematta.
Tällaisessa toteutuksessa on hyvät ja huonot puolensa. Hyvät liittyvät mm. suorituskyvyn parantamiseen, kun taas huonot päätyvät väärään lopputulokseen seuraavassa tapauksessa:Code: Select all
// Jos a=1, tämä lauseke on TOSI vaikka oikeasti se on EPÄTOSI If a=1 And a=2 Then
Taisit tosiaan ymmärtää Grandin hiukan väärin.
Oikosulkeva käytös operaattorien kanssa voi joka tapauksessa helposti johtaa vaikeasti paikannettaviin bugeihin, jos ei muista että And:n ensimmäisen ehdon ollessa False jätetään oikean puolimmaisen operandin (joka voi olla esimerkiksi tärkeä funktiokutsu) suorittamatta. ja vastaavasti Or:n ensimmäisen ehdon ollessa True jätetään samalla tavalla oikea puoli suorittamatta.
Oikosulkevat operaattorit ovat kuitenkin erityisen käyttökelpoisia juuri silloin kun niiden kanssa käytetään funktiokutsuja: näin voidaan estää raskaamman oikean puolen suorittaminen tai varmistaa vasemman puolen avulla että oikea puoli voidaan suorittaa (tarkastetaan esimerkiki onko osoitin jotain muuta kuin null, ja samaa osoitinta hyödynnetään sitten oikean puolen laskussa).
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic
http://www.coolbasic.com/blog
Re: CoolBasic Classic: Kehitysuutisten kommentit
-Kaipaisin uutta tiedosto tyyppiä: totuusarvoja(boolean/bool).
Tuntuu niin tuhlaukselta tallentaa tieto, onko joku asia totta, tavuun. Yli 99%(!) menee hukkaan.
-Taulukot eivät saisi olla globaaleja ja niitä pitäisi pystyä välittämään funktioiden parametreinä.
-Kuvasarjan lataus( + tallennus?) gif-tiedostosta.
-Äänten muokkaus ja tallennus funktiot.
-Kuvien tallennus muihinkin tiedostomuotoihin kuin bittikartoiksi.
Toiveta tuli loppujen lopuksi aika runsaasti.
Toivottavasti jotkin niistä toteutuvat.
Tuntuu niin tuhlaukselta tallentaa tieto, onko joku asia totta, tavuun. Yli 99%(!) menee hukkaan.
-Taulukot eivät saisi olla globaaleja ja niitä pitäisi pystyä välittämään funktioiden parametreinä.
-Kuvasarjan lataus( + tallennus?) gif-tiedostosta.
-Äänten muokkaus ja tallennus funktiot.
-Kuvien tallennus muihinkin tiedostomuotoihin kuin bittikartoiksi.
Toiveta tuli loppujen lopuksi aika runsaasti.
Toivottavasti jotkin niistä toteutuvat.
Re: CoolBasic Classic: Kehitysuutisten kommentit
Öö, en ehkä tiedä kyllä parhaiten, mutta yksi tavu = 8 bittiä ja totuusarvoon tarvitaan periaatteessa vain yksi bitti jolloin se on 7/8 joka menee hukkaan. Se taas on prosenteissa ~87% joka ei ole lähellekään 99%+ :PLatexi95 wrote:Yli 99%(!) menee hukkaan.
Ja teoriassahan voit itse käsitellä bittejäkin, opettelet vain miten binäärijärjestelmä toimii niin voit tallentaa yhteen tavuun 8 eri totuusarvoa :P
Re: CoolBasic Classic: Kehitysuutisten kommentit
Juuri näitä Boolean/Totuusarvoja, mitä latexi sanoi olen itsekkin meinannut huomauttaa. (C++:han varaa kans 1tavun totuusarvolle tilaa) Sitten toinen olisi hyvä semmonen et funktio parametri voisi toimia virtana 'streamina' eli näin:
Tämähän auttaisi palauttamaan funktiostakin isomman kasan parametreja. Kun vain funktiosta saatu stream muuttuja syötetään toiselle funktiolle. Käytännössä stream muuttuja sisältää parametri rakenteen.
Code: Select all
Function munfunkkari(virta1,virta2)
ikä As Integer = ReadStream virta1, 1
nopeus As Float = ReadStream virta1, 2
nimi As String = ReadStream virta1, 3
tyyli As Integer = ReadStream virta2, 1
reaktiokyky As Float = ReadStream virta2, 2
komento As String = ReadStream virta2, 3
Print ikä
Print nopeus
Print nimi
Print "********************'"
Print tyyli
Print reaktiokyky
Print komento
End Function
Solar Eclipse
We're in a simulation, and God is trying to debug us.
Re: CoolBasic Classic: Kehitysuutisten kommentit
Hyvä minä... Postasin taas ennen kuin ajattelin.temu92 wrote: Öö, en ehkä tiedä kyllä parhaiten, mutta yksi tavu = 8 bittiä ja totuusarvoon tarvitaan periaatteessa vain yksi bitti jolloin se on 7/8 joka menee hukkaan. Se taas on prosenteissa ~87% joka ei ole lähellekään 99%+
Ja teoriassahan voit itse käsitellä bittejäkin, opettelet vain miten binäärijärjestelmä toimii niin voit tallentaa yhteen tavuun 8 eri totuusarvoa
Ajattelin, että tavuun mahtuu 256 arvoa ja bittiin 2, mutta unohdin että tavu ei silti vie niin paljon tilaa.
Re: CoolBasic Classic: Kehitysuutisten kommentit
Muistinosoitus toimii näissä vehkeissä niin, ettei tavua tarkemmin voida muistia osoittaa (eli suoraa osoitusta esimerkiksi tietylle bitille ei saada). Binäärioperaattoreilla on mahdollista "pakata" 8 totuusarvoa tavuun, mutta tämä vaatii jonkin verran ylimääräisiä operaatioita, joten se vaikuttaa suorituskykyyn (ts. se on hitaampaa kuin "uhrata" kokonainen tavu yhdelle totuusarvolle). Lisäksi, kun nykyvehkeissä alkaa olla gigatolkulla muistia (1 gigatavu = 1024 megatavua = 1 048 576 kilotavua = 1 073 741 824 tavua tjsp), ei se yhden tavun käyttö yhtä totuusarvoa kohden hirveästi tunnu.Latexi95 wrote:-Kaipaisin uutta tiedosto tyyppiä: totuusarvoja(boolean/bool).
Tuntuu niin tuhlaukselta tallentaa tieto, onko joku asia totta, tavuun.
Tuo onnistuu jo nykyisessä CB:ssä muistipalojen avulla. Samoihin paloihin voi myös kirjoittaa takaisin tietoa, jolloin niitä voi käyttää suurempien kokonaisuuksien välittämiseen "edestakaisin" funktiosta sisään ja ulos. Totta kyllä, ettei muistipalojen käyttö ole erityisen helppoa, varsinkaan aloittelijoille. Se mitä en tuosta stream-systeemistä nyt heti hoksaa on, että miten olet ajatellut noiden jälkimmäisten parametrien toimivan:MaGetzUb wrote: Sitten toinen olisi hyvä semmonen et funktio parametri voisi toimia virtana 'streamina' eli näin:Tämähän auttaisi palauttamaan funktiostakin isomman kasan parametreja. Kun vain funktiosta saatu stream muuttuja syötetään toiselle funktiolle. Käytännössä stream muuttuja sisältää parametri rakenteen.Code: Select all
Function munfunkkari(virta1,virta2) ikä As Integer = ReadStream virta1, 1 nopeus As Float = ReadStream virta1, 2 nimi As String = ReadStream virta1, 3 tyyli As Integer = ReadStream virta2, 1 reaktiokyky As Float = ReadStream virta2, 2 komento As String = ReadStream virta2, 3 Print ikä Print nopeus Print nimi Print "********************'" Print tyyli Print reaktiokyky Print komento End Function
Code: Select all
ikä As Integer = ReadStream virta1, 1
nopeus As Float = ReadStream virta1, 2
nimi As String = ReadStream virta1, 3
C++:ssa on kyllä käytössä operaattorit << ja >>, joilla voidaan ohjata tietoa virrasta sisään ja ulos, mutta käytännössä ne ovat yleensä ylikuormitettuina luokissa (vrt. esim. Qt:n erittäin näppärät stream-operaattorit), ja logiikka luettavan/kirjoitettavan tiedon tavumäärästä on yleensä ohjelmoitu ylikuormitetun operaattorin logiikkaan kirjaston/ohjelman tekijän itsensä toimesta. Niiden kohdalla ei tarvitse kertoa "monesko" tavu tms. virrasta luetaan, koska tieto "virtaa", eli jos luet 8 tavua virrasta, niitä kahdeksaa tavua ei voi virrasta enää uudelleen lukea (ne siis poistuvat sitä mukaa kun niitä luetaan, "kulkevat putkesta toiseen" tai miten sen kuvaisi =P). Hyvänä esimerkkinä toimivat Qt:n verkkosocketit, eli kun socketin streamista luetaan sinne tullut data ulos, ei se enää sijaitse socketissa (tämä on suoraan jostain Qt:n esimerkistä, lisäsin vain kommentit):
Code: Select all
QDataStream in(tcpSocket); //Sisääntuleva data-virta socketista
in.setVersion(QDataStream::Qt_4_0); //Varmistetaan versioyhteensopivuus (stream-operaattoreiden logiikka voi vaihdella Qt:n versiosta toiseen)
if (blockSize == 0) { //Ensin virrasta oletetaan tulevan 2-tavuinen "header", joka kertoo montako tavua dataa sen jälkeen voidaan odottaa
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16)) //Tarkistetaan että 2 tavua on luettavissa
return;
in >> blockSize; //Luetaan datan koko, tässä siis "virtaa" 2 tavua tietoa verkosta saapuneesta datasta quint16-tietotyypin muuttujaan, joita ei voida enää uudelleen in-streamista lukea
}
if (tcpSocket->bytesAvailable() < blockSize) //Tarkistetaan että koko datamäärä on saapunut
return;
QString nextFortune; //QStringissä on ylikuormitettu >> -operaattori, joka automaattisesti lukee virrasta, kunnes merkkijonon loppu löydetään
in >> nextFortune; //Luetaan tieto sockettiin sidotusta datavirrasta QStringiin (tämän jälkeen sitä ei voida enää lukea virrasta, vaan tieto on tallennettu ("virrannut") socketista stringiin
Re: CoolBasic Classic: Kehitysuutisten kommentit
Ajattelin sitä vain, että voisihan heti CoolBasic tarkistaa minkälaista tietoa työnnetään ja sen mukaan säilyttää se sinne stream muuttujaan...ezbe wrote:Tuo onnistuu jo nykyisessä CB:ssä muistipalojen avulla. Samoihin paloihin voi myös kirjoittaa takaisin tietoa, jolloin niitä voi käyttää suurempien kokonaisuuksien välittämiseen "edestakaisin" funktiosta sisään ja ulos. Totta kyllä, ettei muistipalojen käyttö ole erityisen helppoa, varsinkaan aloittelijoille. Se mitä en tuosta stream-systeemistä nyt heti hoksaa on, että miten olet ajatellut noiden jälkimmäisten parametrien toimivan:Latexi95 wrote:-Kaipaisin uutta tiedosto tyyppiä: totuusarvoja(boolean/bool).
Tämähän auttaisi palauttamaan funktiostakin isomman kasan parametreja. Kun vain funktiosta saatu stream muuttuja syötetään toiselle funktiolle. Käytännössä stream muuttuja sisältää parametri rakenteen.
Tuossa siis luetaan kolmea erilaista tietotyyppiä samasta virrasta (4-tavuinen kokonaisluku, 4-tavuinen liukuluku, muuttuvan kokoinen merkkijono). ReadStreamille on annettu toisena parametrina arvot 1, 2 ja 3. Ymmärrän tämän niin, että haet takaa sitä, että Readstream <virta, n> palauttaisi n:n parametrin virrasta, mutta jos samaan virtaan kirjoitetaan eri tietotyyppejä, täytyisi ReadStreamille kertoa jotenkin virran rakenne (ns. offsetit arvoille), jotta tiedettäisiin esimerkiksi merkkijonon alkavan 8. tavun jälkeen.Code: Select all
ikä As Integer = ReadStream virta1, 1 nopeus As Float = ReadStream virta1, 2 nimi As String = ReadStream virta1, 3
C++:ssa on kyllä käytössä operaattorit << ja >>, joilla voidaan ohjata tietoa virrasta sisään ja ulos, mutta käytännössä ne ovat yleensä ylikuormitettuina luokissa (vrt. esim. Qt:n erittäin näppärät stream-operaattorit), ja logiikka luettavan/kirjoitettavan tiedon tavumäärästä on yleensä ohjelmoitu ylikuormitetun operaattorin logiikkaan kirjaston/ohjelman tekijän itsensä toimesta. Niiden kohdalla ei tarvitse kertoa "monesko" tavu tms. virrasta luetaan, koska tieto "virtaa", eli jos luet 8 tavua virrasta, niitä kahdeksaa tavua ei voi virrasta enää uudelleen lukea (ne siis poistuvat sitä mukaa kun niitä luetaan, "kulkevat putkesta toiseen" tai miten sen kuvaisi =P). Hyvänä esimerkkinä toimivat Qt:n verkkosocketit, eli kun socketin streamista luetaan sinne tullut data ulos, ei se enää sijaitse socketissa (tämä on suoraan jostain Qt:n esimerkistä, lisäsin vain kommentit):
Code: Select all
QDataStream in(tcpSocket); //Sisääntuleva data-virta socketista in.setVersion(QDataStream::Qt_4_0); //Varmistetaan versioyhteensopivuus (stream-operaattoreiden logiikka voi vaihdella Qt:n versiosta toiseen) if (blockSize == 0) { //Ensin virrasta oletetaan tulevan 2-tavuinen "header", joka kertoo montako tavua dataa sen jälkeen voidaan odottaa if (tcpSocket->bytesAvailable() < (int)sizeof(quint16)) //Tarkistetaan että 2 tavua on luettavissa return; in >> blockSize; //Luetaan datan koko, tässä siis "virtaa" 2 tavua tietoa verkosta saapuneesta datasta quint16-tietotyypin muuttujaan, joita ei voida enää uudelleen in-streamista lukea } if (tcpSocket->bytesAvailable() < blockSize) //Tarkistetaan että koko datamäärä on saapunut return; QString nextFortune; //QStringissä on ylikuormitettu >> -operaattori, joka automaattisesti lukee virrasta, kunnes merkkijonon loppu löydetään in >> nextFortune; //Luetaan tieto sockettiin sidotusta datavirrasta QStringiin (tämän jälkeen sitä ei voida enää lukea virrasta, vaan tieto on tallennettu ("virrannut") socketista stringiin
Solar Eclipse
We're in a simulation, and God is trying to debug us.
Re: CoolBasic Classic: Kehitysuutisten kommentit
Ehdotuksia:
Voisi laittaa vakioon monia muuttujia, Esim. Const Pinkki = 255, 0, 255
--------------------------------------------------------------------------------------------------
Voisi tehdä vakiofunktion, eli siis voisi tehdä funktion joka korvattaisiin niihin kohtiin missä se esitettiin...
Esimerkki selventää asiaa.
ConstFunction Joku(Num1, Num2, Num3, Num4) = (Num1 ^ Num3) / (Num2 ^ Num4 ) + (Num1 + Num2) * (Num3 + Num4)
Luku1 = 5
Luku2 = 10
Luku3 = 50
Luku4 = 5
Print Joku (Luku1,Luku2,Luku3,Luku4)
'Kääntäjä kääntäisi sen näin:
Print (5 ^ 50) / (10 ^ 5 ) + (5 + 10) * (50 + 5)
Voisi laittaa vakioon monia muuttujia, Esim. Const Pinkki = 255, 0, 255
--------------------------------------------------------------------------------------------------
Voisi tehdä vakiofunktion, eli siis voisi tehdä funktion joka korvattaisiin niihin kohtiin missä se esitettiin...
Esimerkki selventää asiaa.
ConstFunction Joku(Num1, Num2, Num3, Num4) = (Num1 ^ Num3) / (Num2 ^ Num4 ) + (Num1 + Num2) * (Num3 + Num4)
Luku1 = 5
Luku2 = 10
Luku3 = 50
Luku4 = 5
Print Joku (Luku1,Luku2,Luku3,Luku4)
'Kääntäjä kääntäisi sen näin:
Print (5 ^ 50) / (10 ^ 5 ) + (5 + 10) * (50 + 5)