Console Mode Pascal/fi: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Console Mode Pascal/fi
| Old | New | Line | |
|---|---|---|---|
| 1 | + | ## Komentoriviohjelmointi Pascal ohjelmoinnilla | |
| 2 | + | ||
| 3 | + | Jotkut meistä kirjoittivat [[Pascal/fi|Pascal]]-[[Program/fi|ohjelmia]] kauan ennen [[Graphical User Interface/fi|graafisten käyttöliittymien]] ja [[IDE/fi|integroitujen kehitysympäristöjen (IDE)]] muodin tulemista. Jotkut toiset ovat aloittelijoita Pascal-ohjelmoinnissa ja niiden on kyettävä kokeilemaan kielen työkaluja. Joidenkin täytyy kuitenkin kirjoittaa [[Command-line interface/fi|komentorivi]]- tai [[Text User Interface|tekstimuotoisia]] sovelluksia monimutkaisten järjestelmäohjauksien suorittamiseksi. | |
| 4 | + | ||
| 5 | + | ### Komentoriviohjelmointi ilman Lazarusta | |
| 6 | + | ||
| 7 | + | Vaikka monet haluavat käyttää [[Lazarus IDE/fi|Lazarus ohjelmointikehitysympäristöä]] komentoriviohjelmien kirjoittamiseen, ne voidaan myös kirjoittaa melkein millä tahansa tekstieditorilla ja kääntää ne itse kutsumalla [[FPC/fi|FPC]]-[[Compiler/fi|kääntäjää]], esim. example.pas-ohjelmalle: | |
| 8 | + | ||
| 9 | + | ``` bash | |
| 10 | + | fpc example.pas | |
| 11 | + | ``` | |
| 12 | + | ||
| 13 | + | Myös tekstipohjaiseen käyttöliittymään pohjautuva *fp* IDE (se näyttää hieman vanhalta [[Turbo Pascal/fi|Turbo Pascalilta]]) on käytettävissä. Seuraavissa osissa keskitymme ohjelmointiin [[Lazarus/fi|Lazaruksen]] kanssa. | |
| 14 | + | ||
| 15 | + | ### Komentoriviohjelmointi Lazaruksella | |
| 16 | + | ||
| 17 | + | Lazarus tarjoaa ihanteellisen ympäristön Pascal-oppimiselle ja tekstipohjaisiin käyttöliittymiin pohjautuvien ohjelmien kehittämiseen. Kaikkia integroidun kehittämisympäristön toimintoja voidaan käyttää, mukaan lukien [[Editor/fi|lähdekoodieditori]], jossa on [[Syntax highlighting/fi|syntaksin korostus]], pääsy kirjastoihin, monimutkaiset haku- ja koodinvalmistustyökalut sekä syntaksin tarkistaminen. Jos ei haluta [[TForm/fi|lomaketta]], jossa on visuaalisia komponentteja, eikä niitä tarvita, niin Lazarus Source Editor on edelleen hyvä ympäristö ohjelmien kehittämiselle. Sillä voidaan koota ja ajaa ohjelmaa kehityksen aikana poistumatta editorista. | |
| 18 | + | ||
| 19 | + | Jos halutaan aloittaa komentoriviohjelmointi ohjelmointi niin siirrytään päävalikkoon ja valitaan Projekti -\> Uusi Projekti ja sen jälkeen Yksinkertainen ohjelma, Ohjelma tai Komentorivisovellus. Tällöin IDE ei luo kaikkia täydellisiin graafisiin sovelluksiin liittyviä ylimääräisiä tiedostoja eikä avaa Object Inspector -ruutua, mutta avaa lähdekoodieditorin *luuranko*-ohjelman rakenteella ja odottaa ohjelmointia. | |
| 20 | + | ||
| 21 | + | > **Note:** Windows-käyttöjärjestelmän GUI-sovelluksessa ei ole konsolia, joten sitä ei voi kirjoittaa tai lukea. Saat *File not open* virheitä. Poista konsolisovellus käytöstä valitsemalla *Project Options / Compiler Options / Linking / Target specific options / Win32 GUI application* käytöstä. Lazarus IDE 1.4: ssä tämä on kohdassa *Project(menu) / Project Options / Compiler Options / Config and Target / Target specific options / Win32 GUI application*. | |
| 22 | + | ||
| 23 | + | > **Note:** Lazaruksella on joitakin komentoriviohjelmien, kuten [[CopyFile/fi|copyfile]], toimintoja. Jos näitä halutaan käyttää, niin lisätään LazUtils-projektien vaatimuksiin, silloin vaadita koko LCL:ää mukaan. Kun vielä lisätään sitten asiaankuuluva käännösyksikkö uses-lauseeseen. | |
| 24 | + | ||
| 25 | + | #### Projektin tyyppi: Console Application | |
| 26 | + | ||
| 27 | + | Tämän projektityypin valitseminen Lazaruksessa luo ohjelman, jonka uusi luokka on johdettu TCustomApplication-sovelluksesta. TCustomApplication tarjoaa paljon tavallisia asioita ja tekee ohjelmoinnista komentorivisovelluksissa helppoa. Esimerkiksi komentorivivalintojen tarkistaminen, ohjeen kirjoittaminen, [[Command line parameters and environment variables/fi|ympäristömuuttujien tarkistaminen]] ja [[Exceptions/fi|poikkeuksen käsittely]]. Kaikki LCL-ohjelmat käyttävät tätä automaattisesti. | |
| 28 | + | ||
| 29 | + | #### Projektin tyyppi: Program | |
| 30 | + | ||
| 31 | + | Osoituksena esittellään hyvin minimalistisen Pascal-ohjelman. Valitaan IDE: ssä projektin tyypiksi Program ja annetaan IDE auttaa hieman. Esimerkiksi kun lisätään toinen [[Unit/fi|käännösyksikkö]] niin IDE lisää automaattisesti käännösyksikön nimen [[Uses/fi|uses]]-osaan. Tämä käyttäytyminen on määritelty projektin vaihtoehdoissa. Voidaan siis siirtyä 'Program' ja 'Custom Program' välillä milloin tahansa. | |
| 32 | + | ||
| 33 | + | Täydellinen esimerkki aloittelijoille: | |
| 34 | + | ||
| 35 | + | ``` Pascal | |
| 36 | + | program Project1; | |
| 37 | + | {$mode objfpc}{$H+} | |
| 38 | + | uses | |
| 39 | + | {$IFDEF UNIX}{$IFDEF UseCThreads} | |
| 40 | + | cthreads, | |
| 41 | + | {$ENDIF}{$ENDIF} | |
| 42 | + | Classes; | |
| 43 | + | begin | |
| 44 | + | WriteLn('Hello World!'); | |
| 45 | + | ReadLn; | |
| 46 | + | end. | |
| 47 | + | ``` | |
| 48 | + | ||
| 49 | + | ### Pascal scripts | |
| 50 | + | ||
| 51 | + | Lisäksi on mahdollista kirjoittaa [[InstantFPC]]:llä dynaamisesti käännettävät skriptit, tämä cross-platform-ratkaisu, joka suorittaa (pieniä) Pascal-ohjelmia skripteinä. Shebang | |
| 52 | + | ||
| 53 | + | #!/usr/bin/env instantfpc | |
| 54 | + | ||
| 55 | + | sallii käynnistää komentosarjan kuten itsenäisen ohjelman. | |
| 56 | + | ||
| 57 | + | > **Note:** Vaikka sitä käytetään Pascal-komentosarjojen suorittamiseen, InstantFPC käyttää tavallista Object Pascalia, ei PascalScript scriptkieltä. Joten **PascalScript** ja **Pascal-script** eivät ole samat. | |
| 58 | + | ||
| 59 | + | ## Ohjelman suorittaminen | |
| 60 | + | ||
| 61 | + | #### Kääntäminen | |
| 62 | + | ||
| 63 | + | Kun ollaan viimeistelty ohjelma (tai ohjelman osa), niin se voidaan kääntää ja suorittaa valitsemalla Suorita -\> Rakenna (tai Pika-kääntäminen) päävalikosta tai klikkaamalla Vihreää (Suorita) kolmio -merkkiä  pikapainikerivissä. Kaikki kääntäjän viestit (varoitukset, edistymisraportit tai virheilmoitukset) näkyvät viestiruudussa ja toivottavasti lopulta tulee viesti sanomaan | |
| 64 | + | ||
| 65 | + | 'Projekti" Project1 "onnistuneesti rakennettu.'. Taikka 'Project "Project1" successfully built.':). | |
| 66 | + | ||
| 67 | + | Mutta missä on ohjelma??!! | |
| 68 | + | ||
| 69 | + | Jos ei vielä ole tallennettu ohjelmaa, IDE laittaa sen väliaikaiseen hakemistoon (esim. /tmp linuxissa, C:\temp windowsissa, katso Environment Options / Files / Directory testiprojektien rakentaminen). | |
| 70 | + | ||
| 71 | + | Jos ollaan jo talletettu projekti niin ohjelma luotiin samaan hakemistoon, johon oltiin talletettu project1.lpi-tiedosto. | |
| 72 | + | ||
| 73 | + | #### Suorita konsolissa | |
| 74 | + | ||
| 75 | + | Ohjelma voidaan suorittaa siirtymällä konsolin (päätelaitteen, terminaalin) ikkunaan ja vaihtamalla sitten hakemistoon ja kirjoittamalla ohjelman nimen **cd**:llä. Unix / Linuxissa, jos se on nykyisessä hakemistossa, niin on aloitettava ./: lla, koska ohjelmaa ei todennäköisesti löydy PATH: sta. | |
| 76 | + | ||
| 77 | + | Esimerkki Linuxista / Unixista, jossa ohjelma on tallennettu /tmp hakemistoon: | |
| 78 | + | ||
| 79 | + | ``` bash | |
| 80 | + | cd /tmp | |
| 81 | + | ./Project1 | |
| 82 | + | ``` | |
| 83 | + | ||
| 84 | + | Se voi kuitenkin olla erittäin hankalaa vaihtaa Lazarus Editorista ja pääteikkunaan ja takaisin. Onneksi on olemassa mekanismi, jonka avulla pääteikkuna voidaan avata Lazarus-ympäristössä. | |
| 85 | + | ||
| 86 | + | #### Suorita IDE:ssä | |
| 87 | + | ||
| 88 | + | Sisäisessä konsolissa: näytä ulostulo pääteikkunassa. | |
| 89 | + | ||
| 90 | + | Uudelleen ohjaa lähtö. | |
| 91 | + | ||
| 92 | + | Valitse päävalikosta Suorita -\> Suorita parametrit ja valitse "Käytä käynnistyssovellusta". Kun tämä tehdään ensimmäisen kertaa ja kokeillaan Compile / Run -sekvenssiä, saadaan todennäköisesti epäkohteliasta viestistä: | |
| 93 | + | ||
| 94 | + | `"xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied". ` | |
| 95 | + | ||
| 96 | + | Jos näin tapahtuu niin on muutettava kyseisen tiedoston käyttöoikeuksia (esimerkiksi käyttämällä chmod + x tiedostonimeä tai käyttämällä Windows-apuohjelmaa käyttöoikeuksien vaihtamiseen); tämän voi joutua tekemään pääkäyttäjänä (roottina) . Tämän jälkeen joka kerta, kun käynnistää ohjelman, näyttöön tulee konsoli-ruutu ja kaikki tekstit I/O (readln, writeln jne.) Ilmestyvät siihen. | |
| 97 | + | ||
| 98 | + | Kun ohjelma on suoritettu loppuun, näyttöön tulee viesti "Paina Enter". Näin ollen mikä tahansa tuotos, jonka ohjelmassa on, pysyy näytöllä, kunnes on saanut mahdollisuuden lukea sen; Kun ollaan painettu "Enter", konsoli-ikkuna sulkeutuu. | |
| 99 | + | ||
| 100 | + | Valitettavasti tämä menetelmä ei salli integroidun debuggerin käyttöä. | |
| 101 | + | ||
| 102 | + | #### Suorita IDE: ssä uudelleenohjattu lähtö | |
| 103 | + | ||
| 104 | + | Jos halutaan nähdä, mitä kirjoitetaan stdout:iin ja halutaan käyttää myös integroitua debuggeriä, stdout voidaan ohjata tiedostoon, seuraavalla koodilla: | |
| 105 | + | ||
| 106 | + | ``` Pascal | |
| 107 | + | uses | |
| 108 | + | baseunix; | |
| 109 | + | ||
| 110 | + | var | |
| 111 | + | OutputFile: text; | |
| 112 | + | ||
| 113 | + | begin | |
| 114 | + | Assign(OutputFile, 'Output.txt'); | |
| 115 | + | if FileExists(Filename) then begin | |
| 116 | + | Append(OutputFile); | |
| 117 | + | end | |
| 118 | + | else begin | |
| 119 | + | Rewrite(OutputFile); { open file for writing, destroying contents, if any } | |
| 120 | + | end; | |
| 121 | + | ||
| 122 | + | ResultCode := fpdup(OutputFile, output); | |
| 123 | + | ||
| 124 | + | if ResultCode < 0 then begin | |
| 125 | + | raise Exception.CreateFmt('dup failed: %s', [ResultCode]); | |
| 126 | + | end; | |
| 127 | + | Close(OutputFile); | |
| 128 | + | end. | |
| 129 | + | ``` | |
| 130 | + | ||
| 131 | + | Tiedosto output.txt voidaan sitten katsella 'tail -f output.txt'-toiminnolla tai katsella editorilla, jos 'tail' ei ole käytettävissä [[Operating System/fi|käyttöjärjestelmässäsi]]. | |
| 132 | + | ||
| 133 | + | Vaihtoehtoisesti voit käyttää Lazarus 0.9.31: ää tai uudempaa (vain Linuxissa): "Näytä" -valikossa "Windows-virheenkorjaus" -kohdassa on merkintä "konsolilähtö", joka näyttää stdoutin | |
| 134 | + | ||
| 135 | + | ## Unicode (UTF8) -lähtö | |
| 136 | + | ||
| 137 | + | Jos halutaan, että konsolitilaohjelma näyttää Unicode ([[UTF-8/fi|UTF8]]) -ulostulon Windows Vistassa ja uudemmissa versioissa (ja ehkä myös aiemmissa versioissa), **SetConsoleOutputCP**-komennolla voit asettaa konsolin UTF8-merkistöön | |
| 138 | + | ||
| 139 | + | > **Note:** täytyy varmistaa, että konsolin fontti voi näyttää haluamat kirjaimet (esim. Greek, Cyrillic, Korean). | |
| 140 | + | ||
| 141 | + | > **Note:** on sisällytettävä Windows unit. | |
| 142 | + | ||
| 143 | + | Katsomalla [[LCL Unicode Support|LCL Unicode -tukea]] saadaan lisätietoja Unicode-tuesta Lazaruksessa ja FPC: ssä.. | |
| 144 | + | ||
| 145 | + | Esimerkkiohjelma: | |
| 146 | + | ||
| 147 | + | ``` Pascal | |
| 148 | + | program uniconsole; | |
| 149 | + | ||
| 150 | + | {$mode objfpc}{$H+} | |
| 151 | + | {$APPTYPE CONSOLE} | |
| 152 | + | ||
| 153 | + | uses | |
| 154 | + | {$IFDEF UNIX} | |
| 155 | + | {$IFDEF UseCThreads} | |
| 156 | + | cthreads, | |
| 157 | + | {$ENDIF} | |
| 158 | + | {Widestring manager needed for widestring support} | |
| 159 | + | cwstring, | |
| 160 | + | {$ENDIF} | |
| 161 | + | {$IFDEF WINDOWS} | |
| 162 | + | Windows, {for setconsoleoutputcp} | |
| 163 | + | {$ENDIF} | |
| 164 | + | Classes | |
| 165 | + | ; | |
| 166 | + | ||
| 167 | + | var | |
| 168 | + | UTF8TestString: string; | |
| 169 | + | ||
| 170 | + | begin | |
| 171 | + | {$IFDEF WINDOWS} | |
| 172 | + | SetConsoleOutputCP(CP_UTF8); | |
| 173 | + | {$ENDIF} | |
| 174 | + | UTF8TestString:= 'rosé, водка and ούζο'; | |
| 175 | + | writeln ('plain: ' + UTF8TestString); | |
| 176 | + | {Apparently we do not need UTF8ToConsole for this | |
| 177 | + | UTF8ToConsole did not do anything for me in fact.} | |
| 178 | + | end. | |
| 179 | + | ``` | |
| 180 | + | ||
| 181 | + | ## Esimerkit | |
| 182 | + | ||
| 183 | + | Lazarus-editorilla on mahdollista kokeilla kaikkia esimerkkejä standard Pascal-oppikirjoista tai voidaan kirjoittaa omia. Jotkin kaikkein käyttökelpoisimmista aliohjelmista ovat järjestelmäkomentojen suorittamista tai muiden ohjelmien suorittamista (olipa ne kirjoitettu Pascal-, C- tai Perl-, tai shell- tai batch-skripteissä). | |
| 184 | + | ||
| 185 | + | #### Suorita shell-komento | |
| 186 | + | ||
| 187 | + | Tässä on esimerkki *Custom Program* tai *Program*... joka on Linux / Unix / macOS -spesifinen: | |
| 188 | + | ||
| 189 | + | ``` Pascal | |
| 190 | + | program TryShell; | |
| 191 | + | uses | |
| 192 | + | Classes, Unix; | |
| 193 | + | var | |
| 194 | + | S: LongInt; | |
| 195 | + | begin | |
| 196 | + | S := fpsystem('/bin/ls -la *.p*'); //lists .pp, .pas, .php, .png etc in current directory | |
| 197 | + | WriteLn('Program exited with status : ', S) | |
| 198 | + | end. | |
| 199 | + | ``` | |
| 200 | + | ||
| 201 | + | #### Esimerkki: päivitä FPC ja Lazarus | |
| 202 | + | ||
| 203 | + | Monimutkaisempia komentoja voidaan suorittaa. Jos esimerkiksi ollaan jo tarkistettu FPC: n ja Lazaruksen SVN-tietovarastot (katso buildfaq), voidaan pitää FPC- ja Lazarus-lähdetiedostost ajan tasalla hakemalla ne SVN-tietovarastosta seuraavan kutsujen sarjalla: | |
| 204 | + | ||
| 205 | + | ``` Pascal | |
| 206 | + | program LazUpdate; | |
| 207 | + | uses | |
| 208 | + | Classes, Unix; | |
| 209 | + | var | |
| 210 | + | S: LongInt; | |
| 211 | + | begin | |
| 212 | + | S := fpsystem('cd /usr/local/src/fpc/devel/fpc ; make clean'); | |
| 213 | + | S := fpsystem('cd /usr/local/src/fpc/devel/lazarus ; make clean'); | |
| 214 | + | S := fpsystem('cd /usr/local/src/fpc/devel ; svn update fpc >& ~/cvscheckout.log'); | |
| 215 | + | S := fpsystem('cd /usr/local/src/fpc/devel ; svn update lazarus >& ~/cvslaz.log' ); | |
| 216 | + | end. | |
| 217 | + | ``` | |
| 218 | + | ||
| 219 | + | Huomaa, että komennon antamisen | |
| 220 | + | ||
| 221 | + | ``` Pascal | |
| 222 | + | fpsystem('cd /somedirectory'); | |
| 223 | + | ``` | |
| 224 | + | ||
| 225 | + | jälkeen | |
| 226 | + | ||
| 227 | + | ``` Pascal | |
| 228 | + | fpsystem ('do something in that subdirectory'); | |
| 229 | + | ``` | |
| 230 | + | ||
| 231 | + | ei toimi, koska jokaisen **fpsystem ()** -[[Function/fi|funktio]] kutsun jälkeen ohjelman suorittaminen palaa hakemistoonmissä se aloitti. joten on sisällytettävä shell kutsuihin useita lausekkeita riviä kohti kun käytetään **fpsystem()**. \[Pikemminkin: se alkaa aina. \] | |
| 232 | + | ||
| 233 | + | `[Rather: it always starts in . ]` | |
| 234 | + | ||
| 235 | + | Jokaista komentoa ei tarvitse syöttää Pascaliin erillisenä rivinä; on mahdollista luoda tällainen **bash**-skriptitiedoston (osoitteesta buildfaq): | |
| 236 | + | ||
| 237 | + | ``` bash | |
| 238 | + | #!/bin/sh | |
| 239 | + | cd /usr/local/src/fpc/devel | |
| 240 | + | cd fpc | |
| 241 | + | make clean | |
| 242 | + | cd .. | |
| 243 | + | cd lazarus | |
| 244 | + | make clean | |
| 245 | + | cd .. | |
| 246 | + | svn up fpc >& ~/cvscheckout.log | |
| 247 | + | svn up lazarus >& ~/cvslaz.log | |
| 248 | + | ``` | |
| 249 | + | ||
| 250 | + | Nimetään se **updatelaz.sh**ja sen sijaan käytetään **bash** suoraan, kutsutaan sitä Pascal ohjelmasta näin: | |
| 251 | + | ||
| 252 | + | ``` Pascal | |
| 253 | + | (* Tämä voidaan koota tai käyttää Pascal-skriptinä *) | |
| 254 | + | program LazUpdate1; | |
| 255 | + | uses | |
| 256 | + | Classes, Unix; | |
| 257 | + | var | |
| 258 | + | S: LongInt; | |
| 259 | + | begin | |
| 260 | + | S := fpsystem('updatelaz.sh') | |
| 261 | + | end. | |
| 262 | + | ``` | |
| 263 | + | ||
| 264 | + | ## Katso myös | |
| 265 | + | ||
| 266 | + | - [[Command line parameters and environment variables/fi|Komentoriviparametrit ja ympäristömuuttujat]] | |
| 267 | + | - [[Executing External Programs/fi|Ulkoisten ohjelmien suorittaminen]] | |
| 268 | + | - [[Debugger Console App/fi|Virheenjäljitys konsolisovellukset]] | |
| 269 | + | - [[InstantFPC]] | |
| 270 | + | ||
| 271 | + | --- | |
| 272 | + | *From the Free Pascal wiki, page "Console Mode Pascal/fi", as it stood on 2020-06-18 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
