CoolBasic Classic: Kehitysuutisten kommentit

CoolBasiciin yleisesti liittyvä keskustelu.
Post Reply
User avatar
Zero
Lead Developer
Lead Developer
Posts: 727
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

CoolBasic Classic: Kehitysuutisten kommentit

Post by Zero »

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
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by MrMonday »

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..
Jonhu
Active Member
Posts: 186
Joined: Mon Aug 04, 2008 5:45 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Jonhu »

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ää :D ( 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
User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Sami The Great »

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.
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Ruuttu »

Sami The Great wrote:Itse toivoisin, että syntaksi olisi suurinpiirtein samanlaista kuin nyt, että vanhat projektit olisi sitten helppo kääntää uudelle syntaksille.
Kenties jopa niin helppo, että käännös voitaisiin tehdä täysin konevoimin.. ? (jos näin nyt haluaa tehdä..)
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Koodiapina »

Nykyisessä CoolBasicissa on suunnitteluvirhe, joka olisi hyvä olla korjattuna uudessa versiossa.

Code: Select all

If 0 And ObjectX(0) Then
	// ...
EndIf
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.
User avatar
Zero
Lead Developer
Lead Developer
Posts: 727
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Zero »

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
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by axu »

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
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.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Koodiapina »

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
Vaikuttaa siltä, ettet ymmärtänyt mitä hain takaa.

Code: Select all

#include <iostream>

int main()
{
    int a = 1;
    std::cout << (a == 1 && a == 2) << std::endl;
}
Tulostaa 0, eli lause on epätosi. Eli ihan oikein tuo toimii.
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by esa94 »

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
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.

Taisit tosiaan ymmärtää Grandin hiukan väärin.
User avatar
Bambi
Member
Posts: 87
Joined: Sat Nov 24, 2007 12:51 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Bambi »

Ehdottomasti != -vertailu mukaan. En ymmärrä miksei sitä ole nykyisessä versiossa. :/ Tai sitten on, mutten vain ole löytänyt sen vastinetta.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by KilledWhale »

Bambi wrote:Ehdottomasti != -vertailu mukaan. En ymmärrä miksei sitä ole nykyisessä versiossa. :/ Tai sitten on, mutten vain ole löytänyt sen vastinetta.
Nykyisessä versiossa vastineena toimii <> -vertailu.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
User avatar
Zero
Lead Developer
Lead Developer
Posts: 727
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Zero »

esa94 wrote:
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
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.

Taisit tosiaan ymmärtää Grandin hiukan väärin.
Nyt menee omaan piikkiin. Aivan näinhän se on. Taisin olla vähän liian väsynyt kun tuon kirjoitin :)

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
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Latexi95 »

-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. :roll:
Toivottavasti jotkin niistä toteutuvat.
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by temu92 »

Latexi95 wrote:Yli 99%(!) menee hukkaan.
Öö, 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%+ :P

Ja teoriassahan voit itse käsitellä bittejäkin, opettelet vain miten binäärijärjestelmä toimii niin voit tallentaa yhteen tavuun 8 eri totuusarvoa :P
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by MaGetzUb »

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:

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
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.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by Latexi95 »

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%+ :P

Ja teoriassahan voit itse käsitellä bittejäkin, opettelet vain miten binäärijärjestelmä toimii niin voit tallentaa yhteen tavuun 8 eri totuusarvoa :P
Hyvä minä... Postasin taas ennen kuin ajattelin. :oops:
Ajattelin, että tavuun mahtuu 256 arvoa ja bittiin 2, mutta unohdin että tavu ei silti vie niin paljon tilaa.
ezbe
Tech Developer
Tech Developer
Posts: 93
Joined: Fri May 08, 2009 6:53 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by ezbe »

Latexi95 wrote:-Kaipaisin uutta tiedosto tyyppiä: totuusarvoja(boolean/bool).
Tuntuu niin tuhlaukselta tallentaa tieto, onko joku asia totta, tavuun.
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.

MaGetzUb wrote: Sitten toinen olisi hyvä semmonen et funktio parametri voisi toimia virtana 'streamina' eli näin:

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
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.
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:

Code: Select all

    ikä As Integer = ReadStream virta1, 1
    nopeus As Float  = ReadStream virta1, 2
    nimi As String = ReadStream virta1, 3
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.

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
Se mitä haen tällä esimerkillä takaa on, että esittämäsi "ReadStream"-komento ei toimi samalla logiikalla kuin "oikea" streamaus, vaan muistuttaa enempi muistipaloja (jos ymmärsin esimerkkisi oikein).
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by MaGetzUb »

ezbe wrote:
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.
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:

Code: Select all

    ikä As Integer = ReadStream virta1, 1
    nopeus As Float  = ReadStream virta1, 2
    nimi As String = ReadStream virta1, 3
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.

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
Ajattelin sitä vain, että voisihan heti CoolBasic tarkistaa minkälaista tietoa työnnetään ja sen mukaan säilyttää se sinne stream muuttujaan...
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: CoolBasic Classic: Kehitysuutisten kommentit

Post by legend »

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)
Post Reply