CSES - Komentorivi

Peruskomennot

Mm. seuraavista komennoista voi olla hyötyä kisatilanteessa:

  • g++
  • ls
  • mkdir
  • cd
  • rm
  • mv
  • cp
  • cat
  • tee
  • head
  • tail
  • less
  • grep

Muista myös komento, jolla poistetaan rekursiopinon muistirajoitus:

ulimit -s unlimited

Koodin ajaminen komentorivillä

Unix-komentorivillä ohjelmalle voi antaa syötteen kolmella tavalla: käsin, tiedostosta tai "putkittamalla" edellisen komennon tulosteen.

Syöte annetaan tiedostosta seuraavalla tavalla:

./koodi < syote

Ohjelman tuloste puolestaan ohjataan tiedostoon seuraavasti:

./koodi < syote > tulostetiedosto

Syötteen voi antaa myös edellisen komennon tulosteena:

./generoi | ./koodi

Tällöin koodi-ohjelma saa syötteeksi sen, minkä generoi tulostaa.

Komentoja ketjuttamalla voi rakentaa hyvinkin monimutkaisia ohjelmia:

./koodi < syote | grep "3$" | head -n 10

Edellinen komento etsii tulosteesta kaikki rivit, jotka loppuvat numeroon kolme ja tulostaa niistä 10 ensimmäistä.

Kääntäminen

C++:n kääntämiseen käytetään tyypillisesti g++-kääntäjää. Argumenteiksi riittää yksi kooditiedosto:

g++ koodi.cpp

Usein halutaan kuitenkin muutama muukin lippu:

g++ -std=c++17 -Wall -O2 koodi.cpp -o koodi

Nyt tiedosto koodi.cpp käännetään C++17-standardin mukaisesti, optimoituna, binääriin koodi. Lisäksi varoitukset on päällä.

Käännösliput

-O2/-O3

Määrittelee optimointitason. -O2 vastaa perusoptimointeja, ja se on usein oletus kisajärjestelmissä. -O3 on korkein optimointitaso, joka saattaa joissain tapauksissa nopeuttaa koodia merkittävästi. O3-optimoinnit saa käyttöön myös kisajärjestelmässä lisäämällä seuraavan rivin ratkaisun alkuun:

#pragma GCC optimize("O3")

-std=c++17

Määrittelee käytettäväksi C++-standardiksi C++ 17 -version, joka sisältää monia hyödyllisiä ominaisuuksia, kuten esimerkiksi std::gcd ja std::clamp.

-Wall

Asettaa monia hyödyllisiä varoituksia päälle. Bugi saattaa löytyä miettimällä tarkkaan, mitä varoitus tarkoittaa. Tätä kannattaa käyttää aina.

-fsanitize=address

Tarkistaa kaikki muistinkäytöt, ja lopettaa koodin suorituksen heti, kun muistia käytetään virheellisesti. Tämä on hyödyllinen, koska monet muistivirheet, kuten pienet taulukonylitykset, eivät aiheuta segfaultia suoraan, vaan virhe ilmenee usein vasta myöhemmin arvaamattomalla tavalla.

-g

Sisällyttää debug-tiedot binääriin. Hyödyllinen muun muassa gdb:tä käyttäessä.

-D_GLIBCXX_DEBUG

Standardikirjaston käsinkirjoitettu debug-toiminnallisuus. Kuten -fsanitize=address, havaitsee muistivirheitä ja iteraattorien väärinkäyttöä. Se voi myös huomata hienovaraisempia bugeja, kuin pelkkiä muistivirheitä, ja antaa hyödyllisemmän kuvauksen virheestä.