Console Mode Pascal/fi: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | ## Komentoriviohjelmointi Pascal ohjelmoinnilla | |
| 2 | 2 | ||
| 3 | 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 | 4 | ||
| 5 | 5 | ### Komentoriviohjelmointi ilman Lazarusta | |
| 6 | 6 | ||
| 7 | 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 | 8 | ||
| 9 | 9 | ``` bash | |
| 10 | 10 | fpc example.pas | |
| 11 | 11 | ``` | |
| 12 | 12 | ||
| 13 | 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 | 14 | ||
| 15 | 15 | ### Komentoriviohjelmointi Lazaruksella | |
| 16 | 16 | ||
| 17 | 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 | 18 | ||
| 19 | 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 | 20 | ||
| 21 | 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 | 22 | ||
| 23 | 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 | 24 | ||
| 25 | 25 | #### Projektin tyyppi: Console Application | |
| 26 | 26 | ||
| 27 | 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 | 28 | ||
| 29 | 29 | #### Projektin tyyppi: Program | |
| 30 | 30 | ||
| 31 | 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 | 32 | ||
| 33 | 33 | Täydellinen esimerkki aloittelijoille: | |
| 34 | 34 | ||
| 35 | 35 | ``` Pascal | |
| 36 | 36 | program Project1; | |
| 37 | 37 | {$mode objfpc}{$H+} | |
| 38 | 38 | uses | |
| 39 | 39 | {$IFDEF UNIX}{$IFDEF UseCThreads} | |
| 40 | 40 | cthreads, | |
| 41 | 41 | {$ENDIF}{$ENDIF} | |
| 42 | 42 | Classes; | |
| 43 | 43 | begin | |
| 44 | 44 | WriteLn('Hello World!'); | |
| 45 | 45 | ReadLn; | |
| 46 | 46 | end. | |
| 47 | 47 | ``` | |
| 48 | 48 | ||
| 49 | 49 | ### Pascal scripts | |
| 50 | 50 | ||
| 51 | 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 | 52 | ||
| 53 | 53 | #!/usr/bin/env instantfpc | |
| 54 | 54 | ||
| 55 | 55 | sallii käynnistää komentosarjan kuten itsenäisen ohjelman. | |
| 56 | 56 | ||
| 57 | 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 | 58 | ||
| 59 | 59 | ## Ohjelman suorittaminen | |
| 60 | 60 | ||
| 61 | 61 | #### Kääntäminen | |
| 62 | 62 | ||
| 63 | 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 | 64 | ||
| 65 | 65 | 'Projekti" Project1 "onnistuneesti rakennettu.'. Taikka 'Project "Project1" successfully built.':). | |
| 66 | 66 | ||
| 67 | 67 | Mutta missä on ohjelma??!! | |
| 68 | 68 | ||
| 69 | 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 | 70 | ||
| 71 | 71 | Jos ollaan jo talletettu projekti niin ohjelma luotiin samaan hakemistoon, johon oltiin talletettu project1.lpi-tiedosto. | |
| 72 | 72 | ||
| 73 | 73 | #### Suorita konsolissa | |
| 74 | 74 | ||
| 75 | 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 | 76 | ||
| 77 | 77 | Esimerkki Linuxista / Unixista, jossa ohjelma on tallennettu /tmp hakemistoon: | |
| 78 | 78 | ||
| 79 | 79 | ``` bash | |
| 80 | 80 | cd /tmp | |
| 81 | 81 | ./Project1 | |
| 82 | 82 | ``` | |
| 83 | 83 | ||
| 84 | 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 | 85 | ||
| 86 | 86 | #### Suorita IDE:ssä | |
| 87 | 87 | ||
| 88 | 88 | Sisäisessä konsolissa: näytä ulostulo pääteikkunassa. | |
| 89 | 89 | ||
| 90 | 90 | Uudelleen ohjaa lähtö. | |
| 91 | 91 | ||
| 92 | 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 | 93 | ||
| 94 | - | ||
| 94 | + | ```text | |
| 95 | + | "xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied". | |
| 96 | + | ``` | |
| 95 | 97 | ||
| 96 | 98 | 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 | 99 | ||
| 98 | 100 | 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 | 101 | ||
| 100 | 102 | Valitettavasti tämä menetelmä ei salli integroidun debuggerin käyttöä. | |
| 101 | 103 | ||
| 102 | 104 | #### Suorita IDE: ssä uudelleenohjattu lähtö | |
| 103 | 105 | ||
| 104 | 106 | Jos halutaan nähdä, mitä kirjoitetaan stdout:iin ja halutaan käyttää myös integroitua debuggeriä, stdout voidaan ohjata tiedostoon, seuraavalla koodilla: | |
| 105 | 107 | ||
| 106 | 108 | ``` Pascal | |
| 107 | 109 | uses | |
| 108 | 110 | baseunix; | |
| 109 | 111 | ||
| 110 | 112 | var | |
| 111 | 113 | OutputFile: text; | |
| 112 | 114 | ||
| 113 | 115 | begin | |
| 114 | 116 | Assign(OutputFile, 'Output.txt'); | |
| 115 | 117 | if FileExists(Filename) then begin | |
| 116 | 118 | Append(OutputFile); | |
| 117 | 119 | end | |
| 118 | 120 | else begin | |
| 119 | 121 | Rewrite(OutputFile); { open file for writing, destroying contents, if any } | |
| 120 | 122 | end; | |
| 121 | 123 | ||
| 122 | 124 | ResultCode := fpdup(OutputFile, output); | |
| 123 | 125 | ||
| 124 | 126 | if ResultCode < 0 then begin | |
| 125 | 127 | raise Exception.CreateFmt('dup failed: %s', [ResultCode]); | |
| 126 | 128 | end; | |
| 127 | 129 | Close(OutputFile); | |
| 128 | 130 | end. | |
| 129 | 131 | ``` | |
| 130 | 132 | ||
| 131 | 133 | 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 | 134 | ||
| 133 | 135 | 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 | 136 | ||
| 135 | 137 | ## Unicode (UTF8) -lähtö | |
| 136 | 138 | ||
| 137 | 139 | 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 | 140 | ||
| 139 | 141 | > **Note:** täytyy varmistaa, että konsolin fontti voi näyttää haluamat kirjaimet (esim. Greek, Cyrillic, Korean). | |
| 140 | 142 | ||
| 141 | 143 | > **Note:** on sisällytettävä Windows unit. | |
| 142 | 144 | ||
| 143 | 145 | Katsomalla [[LCL Unicode Support|LCL Unicode -tukea]] saadaan lisätietoja Unicode-tuesta Lazaruksessa ja FPC: ssä.. | |
| 144 | 146 | ||
| 145 | 147 | Esimerkkiohjelma: | |
| 146 | 148 | ||
| 147 | 149 | ``` Pascal | |
| 148 | 150 | program uniconsole; | |
| 149 | 151 | ||
| 150 | 152 | {$mode objfpc}{$H+} | |
| 151 | 153 | {$APPTYPE CONSOLE} | |
| 152 | 154 | ||
| 153 | 155 | uses | |
| 154 | 156 | {$IFDEF UNIX} | |
| 155 | 157 | {$IFDEF UseCThreads} | |
| 156 | 158 | cthreads, | |
| 157 | 159 | {$ENDIF} | |
| 158 | 160 | {Widestring manager needed for widestring support} | |
| 159 | 161 | cwstring, | |
| 160 | 162 | {$ENDIF} | |
| 161 | 163 | {$IFDEF WINDOWS} | |
| 162 | 164 | Windows, {for setconsoleoutputcp} | |
| 163 | 165 | {$ENDIF} | |
| 164 | 166 | Classes | |
| 165 | 167 | ; | |
| 166 | 168 | ||
| 167 | 169 | var | |
| 168 | 170 | UTF8TestString: string; | |
| 169 | 171 | ||
| 170 | 172 | begin | |
| 171 | 173 | {$IFDEF WINDOWS} | |
| 172 | 174 | SetConsoleOutputCP(CP_UTF8); | |
| 173 | 175 | {$ENDIF} | |
| 174 | 176 | UTF8TestString:= 'rosé, водка and ούζο'; | |
| 175 | 177 | writeln ('plain: ' + UTF8TestString); | |
| 176 | 178 | {Apparently we do not need UTF8ToConsole for this | |
| 177 | 179 | UTF8ToConsole did not do anything for me in fact.} | |
| 178 | 180 | end. | |
| 179 | 181 | ``` | |
| 180 | 182 | ||
| 181 | 183 | ## Esimerkit | |
| 182 | 184 | ||
| 183 | 185 | 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 | 186 | ||
| 185 | 187 | #### Suorita shell-komento | |
| 186 | 188 | ||
| 187 | 189 | Tässä on esimerkki *Custom Program* tai *Program*... joka on Linux / Unix / macOS -spesifinen: | |
| 188 | 190 | ||
| 189 | 191 | ``` Pascal | |
| 190 | 192 | program TryShell; | |
| 191 | 193 | uses | |
| 192 | 194 | Classes, Unix; | |
| 193 | 195 | var | |
| 194 | 196 | S: LongInt; | |
| 195 | 197 | begin | |
| 196 | 198 | S := fpsystem('/bin/ls -la *.p*'); //lists .pp, .pas, .php, .png etc in current directory | |
| 197 | 199 | WriteLn('Program exited with status : ', S) | |
| 198 | 200 | end. | |
| 199 | 201 | ``` | |
| 200 | 202 | ||
| 201 | 203 | #### Esimerkki: päivitä FPC ja Lazarus | |
| 202 | 204 | ||
| 203 | 205 | 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 | 206 | ||
| 205 | 207 | ``` Pascal | |
| 206 | 208 | program LazUpdate; | |
| 207 | 209 | uses | |
| 208 | 210 | Classes, Unix; | |
| 209 | 211 | var | |
| 210 | 212 | S: LongInt; | |
| 211 | 213 | begin | |
| 212 | 214 | S := fpsystem('cd /usr/local/src/fpc/devel/fpc ; make clean'); | |
| 213 | 215 | S := fpsystem('cd /usr/local/src/fpc/devel/lazarus ; make clean'); | |
| 214 | 216 | S := fpsystem('cd /usr/local/src/fpc/devel ; svn update fpc >& ~/cvscheckout.log'); | |
| 215 | 217 | S := fpsystem('cd /usr/local/src/fpc/devel ; svn update lazarus >& ~/cvslaz.log' ); | |
| 216 | 218 | end. | |
| 217 | 219 | ``` | |
| 218 | 220 | ||
| 219 | 221 | Huomaa, että komennon antamisen | |
| 220 | 222 | ||
| 221 | 223 | ``` Pascal | |
| 222 | 224 | fpsystem('cd /somedirectory'); | |
| 223 | 225 | ``` | |
| 224 | 226 | ||
| 225 | 227 | jälkeen | |
| 226 | 228 | ||
| 227 | 229 | ``` Pascal | |
| 228 | 230 | fpsystem ('do something in that subdirectory'); | |
| 229 | 231 | ``` | |
| 230 | 232 | ||
| 231 | 233 | 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 | 234 | ||
| 233 | - | ||
| 235 | + | ```text | |
| 236 | + | [Rather: it always starts in . ] | |
| 237 | + | ``` | |
| 234 | 238 | ||
| 235 | 239 | Jokaista komentoa ei tarvitse syöttää Pascaliin erillisenä rivinä; on mahdollista luoda tällainen **bash**-skriptitiedoston (osoitteesta buildfaq): | |
| 236 | 240 | ||
| 237 | 241 | ``` bash | |
| 238 | 242 | #!/bin/sh | |
| 239 | 243 | cd /usr/local/src/fpc/devel | |
| 240 | 244 | cd fpc | |
| 241 | 245 | make clean | |
| 242 | 246 | cd .. | |
| 243 | 247 | cd lazarus | |
| 244 | 248 | make clean | |
| 245 | 249 | cd .. | |
| 246 | 250 | svn up fpc >& ~/cvscheckout.log | |
| 247 | 251 | svn up lazarus >& ~/cvslaz.log | |
| 248 | 252 | ``` | |
| 249 | 253 | ||
| 250 | 254 | Nimetään se **updatelaz.sh**ja sen sijaan käytetään **bash** suoraan, kutsutaan sitä Pascal ohjelmasta näin: | |
| 251 | 255 | ||
| 252 | 256 | ``` Pascal | |
| 253 | 257 | (* Tämä voidaan koota tai käyttää Pascal-skriptinä *) | |
| 254 | 258 | program LazUpdate1; | |
| 255 | 259 | uses | |
| 256 | 260 | Classes, Unix; | |
| 257 | 261 | var | |
| 258 | 262 | S: LongInt; | |
| 259 | 263 | begin | |
| 260 | 264 | S := fpsystem('updatelaz.sh') | |
| 261 | 265 | end. | |
| 262 | 266 | ``` | |
| 263 | 267 | ||
| 264 | 268 | ## Katso myös | |
| 265 | 269 | ||
| 266 | 270 | - [[Command line parameters and environment variables/fi|Komentoriviparametrit ja ympäristömuuttujat]] | |
| 267 | 271 | - [[Executing External Programs/fi|Ulkoisten ohjelmien suorittaminen]] | |
| 268 | 272 | - [[Debugger Console App/fi|Virheenjäljitys konsolisovellukset]] | |
| 269 | 273 | - [[InstantFPC]] | |
| 270 | 274 | ||
| 271 | 275 | --- | |
| 272 | 276 | *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).* |
