Eli harjoittelen tässä samalla, kun teen näitä omia projektejani niin tätä C/C++ hommaa, joten yritän nyt omaan fake os projektiini joitakin asioita tehdä jopa jollain muulla kielellä kuin basicilla, joten tarvitsen pari komentoa...
kuinka tehdään c++:lla tälläiset asiat kuin:
ext$ = command$ print ext$
rootdir$ = "a:" address$ = rootdir$ + "\" print "Desktop OS Version 1.5 - Copyright (C)2004 Pleasantware. All rights reserved!" do print "["; address$; "]";: input "$", cline$ if mid$(cline$, 1,2) = "cd" then address$ = ltrim$(rtrim$(mid$(cline$, 4,300))) loop
itse sain tähän asti tuon vikan:
#include <iostream.h> #include <stdlib.h> #include <stdio.h> int main() { char komento[30]; printf("Desktop OS Version 1.5 - Copyright (C)2004 Pleasantware. All rights reserved!\n"); printf("A:"); gets(komento); system("pause"); return 0; }
onkos tuohon muuten mahdollista jollain tapaa (siis dos puolella) tehdä jotain vastaavaa kuin qb:n komento sleep? tai no enpä tiedä tarvitseeko sitä jos saisi noi loopit toimimaan :)
Mutta kuinkas sitten onnistuu esimerkiksi qb:n shell komentoa vastaava? Vai onko se vain sitten tuo system (komento); ?
pitäisi käynnistää ohjelma tyyliin
shell rootdir$ + "\bin\" + komento$ rootdir$ = "a:" ja komento$ vaikkapa "clear", jolloin se käynnistää a:\bin\clear.exe:n.
Luupit tehdään näin:
do { //tähän väliin koodia jota toistetaan } while (ehto);
Ja tuo "while" tarkoittaa siis että toistetaan niin kauan, kuin ()-sulkujen sisässä oleva ehto on tosi.
Jos sinulla on aikaa, käyt täällä etsimässä shelliä.
Täällä on kaikki c++:n standardi funktiot.
http://www.cppreference.com/
Mutta, epäilen, että sitä ei täältä löydy.
Suosittelisin kokeilemaan microsoftin MSDN:ää
Ymmärtääkseni shell-komento kutsuu järjestelmän komentoja elikkä tällöin vastaava funktio on tuo system().
System löytyy stdlib.h:sta.
joo no nyt olen käyttänyt
system(komento);
mutta mitenkä se ohjataan niin, että se käynnistäisi sieltä a:\bin\ hakemistosta ohjelmia? Niinkuin jotenkin näin
system("A:\bin\" + komento);
tuo tosin ei toiminut, kun testasin :)
Mitenkäs tuota
do { //tähän väliin koodia jota toistetaan } while (ehto);
käytetään? Yritin tuota whilen ehtoa muuttaa niin, että
while (komento=="exit");
se olisi lopettanut loopin, kun käyttäjä antaisi komennon exit, mutta se ei toiminut ainakaan... tai toimihan se, mutta sitten se teki sen kaikilla komennoilla mitä käyttäjä antoi.
Ei, ei... "until" lopettaa sitten kun ehto on tosi. "while" toistaa niin kauan kuin ehto on tosi (eli lopettaa kun se ei enää ole tosi) Mutta tuota "until":a ei taida C:ssä olla.
Esimerkki havainnollistanee parhaiten:
#include <iostream.h> main() { int a; do { a++; cout << a << "\n"; } while (a < 10000); }
Eli luupin sisällä kasvatetaan koko ajan a-muuttujaa ja tulostetaan koko ajan sen sen hetkistä arvoa. Ja toistetaan niin kauan kuin a on pienempi kuin 10000 eli lopetetaan heti kun a ylittää 10000.
elikkäs tossa kannattaa sitten käyttää tietenkin while(komento != "exit") :P
onko C++:ssa mitään millä saisi viivoja?
tarkoittaako se taas jotain grafiikkakirjastoa ja silläkin 100 riviä koodia sen takia?!
no, jos näin on niin onko jollain mitään hyvää Grafiikkakirjastoa jolla saa viivoja kätevästi.
Miten viivoja? Mihin viivoja? Koko näytön johonki 320x200 tilaan(:D) vai wintoosaikkunaan?
sooda kirjoitti:
elikkäs tossa kannattaa sitten käyttää tietenkin while(komento != "exit") :P
Jeps, huutomerkki on kuin QB:n NOT-operaattori, eli se kääntää kaiken vastakkaiseksi.
If (komento != "exit")
suorittaa lausekkeen, jos komento ei ole "exit".
sooda kirjoitti:
Miten viivoja? Mihin viivoja? Koko näytön johonki 320x200 tilaan(:D) vai wintoosaikkunaan?
no kun nyt vaikka siihen windowsin lykkäämään 320x200 - ikkunaan. vai pitääskö muka tehdä Win32-sovellus?
Dos -ikkunaan ei tietääkseni helposti voi viivoja vetää, muuten kun ascii merkeillä. Suosittelisin kokeilemaan SDL -grafiikka kirjastoa. http://www.libsdl.org/index.php Tämäkään ei sisällä viiva funktiota, joten joudut lataamaan siihen lisäpalikan.
Katso lisätietoa SDL:n sivuilta. SDL siis tekee sinulle valmiin ikkunan ja piirtopinnan, johon voit nopeasti piirtää. Se on monien ohjelmoijien suosima(Minä mukaan lukien).
Muita kirjastoja ovat Allegro, Directx ja OpenGL. Ensimmäisestä en ainakaan itse pitänyt, ja kaksi viimeistä ovat "aloittelijalle" aika hankalia käsittää ja käyttää, sillä perustuvat 3D -grafiikkaan.
Edit: SDL:n ottaminen käyttöön ei todellakaan vaadi 100 riviä koodia. Pelkkä alustaminen ja piirto silmukan teko muine pikku funktioineen eivät vie kuuin 35-50 riviä!
Sen jälkeen piirtäminen onnistuukin yhdellä tai kahdella rivillä, eli alkeellinen ohjelma vie keskimäärin 45-70 riviä koodia piirtoineen päivineen.
Kuinka niin "DirectX" ja "OpenGl" aloittelijoille? Näitä kirjastojahan käyttävät miltei kaikki nykyajan suuret 3D-pelit.
Merkkijonoja ei voi vertailla suoraan, koska ne ovat taulukoita. Lue C-oppaan uusin osa, siinä on selitettynä merkkijonojen käsittely. Tässä tapauksessa vertailu menisi jotenkin näin (strcmp-funktio on string.h:ssa):
if (strcmp(komento, "exit") == 0) { /* pois! */ }
hunajavohveli kirjoitti:
Kuinka niin "DirectX" ja "OpenGl" aloittelijoille?
Lue lause loppuun:
peki kirjoitti:
...kaksi viimeistä ovat "aloittelijalle" aika hankalia käsittää ja käyttää
Merkkijonoja varten joillain kääntäjillä on myös merkkijonomuuttuja "string". Suosittelen sen käyttöä, jos teet jotain hieman isompaa.
String muuttujia taasen voi vertailla == operaattorilla.(muistaakseni)
lainaus:
...kaksi viimeistä ovat "aloittelijalle" aika hankalia käsittää ja käyttää
Joo, luin nuo kaksi jotenkin hämärästi eri lauseiksi.
http://www.libsdl.org/libraries.php
Tuolta saa niitä SDL kirjastoja.
Mutta grafiikan piirtoon suosittelen tätä:
http://sdl-draw.sourceforge.net/
(Käytän sitä itse) ;)
SDL muuten tulee sanoista Simple DirectMedia Layer
peki kirjoitti:
Merkkijonoja varten joillain kääntäjillä on myös merkkijonomuuttuja "string". Suosittelen sen käyttöä, jos teet jotain hieman isompaa.
String muuttujia taasen voi vertailla == operaattorilla.(muistaakseni)
string ei ole vain joillakin kääntäjillä, vaan kaikilla kääntäjillä jotka väittävät tukevansa C++-standardia. Ja se on muuten merkkijonoluokka, ja == operaattorilla vertaillaan string-olioita eli string-luokan ilmentymiä :-)
Luulisin että juhaz:lle helpointa olisi helpointa käyttää C++:n standardikirjaston keinoja, C voi olla QB:stä siirtyvälle hieman vaikeaselkoinen. Mikähän kääntäjä oli kyseessä?
Dev-c++ ja joku muu, joka toimii komentokehoitteessa komennolla gcc jne... taisi olla djgpp
Tuohon aiheen ihan ensimmäiseen viestiin liittyen:
Nyt on minulla kehitteillä ohjelma, joka muuntaa QB-koodin C++-koodiksi niin, että se toimii suurinpiirtein samalla tavalla molemmilla kielillä. En tiedä tuleeko siitä pidemmän päälle mitään, mutta jos tulee, ja saan siitä tarpeeksi laajan, niin saatan pistää tännekin.
En nyt pistä omaa threadi tälle, pahoittelen.
Elikäs: Onkos SDL:lle olemassa sellaista "Joka paikan höylä" -libraryä? Lähinnä hakusessa olisi juuri tuo piirtäminen ja kuvan käsittely. Vai olisiko suositeltavaa käyttää esim. tuon sdl_drawin lisäksi vain jotain image -librarya? Vai kenties sitten orjallisesti vain itse tutustua näihin sdl:n ominaisuuksin ja sitten tehdä itse?
http://www.libsdl.org/projects/SDL_image/
Pikaisesti katsomalla löytyi tuollainen.
SDL:ssä pitäisi kyllä muistaakseni olla myös sisäänrakennettu kuvan lataus funktio.
Se lataa kuvan SDL pintaan.
Katsopa täältä:
http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/tut2
Täältä löydät myös muita tutoriaaleja:
http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/index
Edit: Jos kuvan käsittelyyn filttereillä lähdet, niin ne sinun on todennäköisesti koodattava itse. Se ei ole kovin vaikeata. Tarvitset vain kaksi puskuria. Lataat kuvan filtterin läpi puskuri1:stä puskuri2:seen. Sitten näytät puskuri2:sen.
Ahh, loistavaa! Kiitoksia paljon selvennyksistä. Pitääkin sitten jossain vaiheessa alkaa tutustumaan näihin.
Kuinkas mä teen tälläisen c++:lla? IF -lauseet mä osaankin, mutta tarvitsen apua tämän tekoon.
declare sub echo (text$) input "", cline$ if mid$(cline$, 1,4) = "echo" then echo mid$(cline$, 6,300) sub echo (text$) print text$ end sub
Onkos muuten mitään hyvää keinoa tyhjentää näyttö ylinmääräisestä moskasta paitsi system("cls"); ? Entä pystyykö tuota system komentoa ohjaamaan niin, että se esimerkiksi, kun siinä on system(komento); niin se suorittaa sen mitä komento sisältää (esim cls) niin, että se suorittaisikin sen jossain tietyssä hakemistossa? Esimerkiksi, kun olen tehnyt A:\bin -hakemiston, jossa on ohjelmia vaikkapa cls niin jos käyttäjä antaa komennon cls niin se suorittaisi a:\bin\cls.
clrscr();
Tuo tyhjää näytön samoin kuin CLS. Ja noita merkkijonoja voit käsitellä niinkuin ne olisivat taulukoita. Jos haluat käsitellä merkkijonon viidettä merkkiä pistät: merkkijono[5]
Aliohjelman teet näin:
void echo(void) { return 0; //palautusarvo }
Eihän voidilla voi olla palautusarvoa?
Ei. Void ei palauta mitään, sen suhteen hunajavohvelin koodi ei toimi, vaan void-tyyppisistä on jätettävä return-lause pois.
Heikki kirjoitti:
Ei. Void ei palauta mitään, sen suhteen hunajavohvelin koodi ei toimi, vaan void-tyyppisistä on jätettävä return-lause pois.
Juu, mietinkin, että on vähän tyhmää pistää return, koska palautusarvoa ei ole, mutta voihan mainin pistää myös voidiksi, ja silti return toimii. Toisaalta pistin tuon vain esimerkiksi, mutta subbihan tuo QB-versiokin tosiaan on, eikä funktio, jotain returnin voi tosiaan jättää pois.
Tein tälläisen
void echo(char *message) { printf("%s\n", message); }
ja toimii, mutta en vieläkään ole tajunnut kuinka saan sitten tehtyä sen, että jos käyttäjä antaa komennon echo niin se näyttäisi tekstin mikä lukee echon perässä, mutta jos mä laitan esimerkiksi näin
echo("MOI");
niin se näyttää tekstin moi...
Tämänkin tajusin oikeastaan vasta luettuani pikkuisen erään oikean käyttöjärjestelmän sourcia vaikka suurinosa koodista on vielä hepreaa minulle, mutta kyllä sitä pikkuhiljaa kehittyy.
Niin tuo void echo(char *message) on tosiaan vain subin määrittely. Mutta sitä kutsutaan ihan samalla tapaa kuin QB:ssäkin, eli ihan miten hokasit: echo("MOI");
Onkos c++:lla jotain muitakin keinoja käynnistää ohjelmia kuin tuolla system komennolla? Lähinnä sillaisia, joita voisi dos ja linux puolella käyttää?
Aihe on jo aika vanha, joten et voi enää vastata siihen.