Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++, QB: Alkeita

Sivun loppuun

juhaz [13.04.2004 08:20:09]

#

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.

hunajavohveli [13.04.2004 14:55:49]

#

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.

peki [13.04.2004 15:06:48]

#

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

acorn [13.04.2004 15:13:39]

#

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.

juhaz [13.04.2004 16:23:51]

#

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.

hunajavohveli [13.04.2004 16:29:16]

#

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.

sooda [14.04.2004 10:19:35]

#

elikkäs tossa kannattaa sitten käyttää tietenkin while(komento != "exit") :P

mamaze [14.04.2004 12:49:57]

#

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.

sooda [14.04.2004 13:27:33]

#

Miten viivoja? Mihin viivoja? Koko näytön johonki 320x200 tilaan(:D) vai wintoosaikkunaan?

hunajavohveli [14.04.2004 14:52:04]

#

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

mamaze [14.04.2004 14:57:12]

#

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?

peki [14.04.2004 15:03:37]

#

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.

hunajavohveli [14.04.2004 15:41:30]

#

Kuinka niin "DirectX" ja "OpenGl" aloittelijoille? Näitä kirjastojahan käyttävät miltei kaikki nykyajan suuret 3D-pelit.

Antti Laaksonen [14.04.2004 18:00:24]

#

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

peki [14.04.2004 18:10:28]

#

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)

hunajavohveli [14.04.2004 18:26:21]

#

lainaus:

...kaksi viimeistä ovat "aloittelijalle" aika hankalia käsittää ja käyttää

Joo, luin nuo kaksi jotenkin hämärästi eri lauseiksi.

peki [14.04.2004 18:58:46]

#

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

thefox [15.04.2004 09:44:24]

#

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ä?

juhaz [15.04.2004 16:15:25]

#

Dev-c++ ja joku muu, joka toimii komentokehoitteessa komennolla gcc jne... taisi olla djgpp

hunajavohveli [15.04.2004 16:40:21]

#

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.

Aruviel [17.04.2004 18:08:27]

#

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?

peki [18.04.2004 17:54:28]

#

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.

Aruviel [18.04.2004 20:39:45]

#

Ahh, loistavaa! Kiitoksia paljon selvennyksistä. Pitääkin sitten jossain vaiheessa alkaa tutustumaan näihin.

juhaz [20.04.2004 07:30:42]

#

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.

hunajavohveli [20.04.2004 14:30:27]

#

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
}

jcd3nton [20.04.2004 15:49:25]

#

Eihän voidilla voi olla palautusarvoa?

Heikki [20.04.2004 15:52:33]

#

Ei. Void ei palauta mitään, sen suhteen hunajavohvelin koodi ei toimi, vaan void-tyyppisistä on jätettävä return-lause pois.

hunajavohveli [20.04.2004 15:55:15]

#

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.

juhaz [20.04.2004 20:40:53]

#

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.

hunajavohveli [20.04.2004 22:06:41]

#

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");

juhaz [23.04.2004 17:14:31]

#

Onkos c++:lla jotain muitakin keinoja käynnistää ohjelmia kuin tuolla system komennolla? Lähinnä sillaisia, joita voisi dos ja linux puolella käyttää?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta