Salta al contingut
Llegat fiber

Consolidació

Tota la introducció en una pàgina per tenir a mà: l'esquelet d'un programa, les comandes per compilar, executar i provar, i un Makefile d'exemple.

Conceptes clau

  • Esquelet d'un programa
  • Comandes: compilar, enllaçar, executar, redirigir, comparar i empaquetar
  • Opcions del Jutge
  • Un Makefile complet i les comandes de make
  • Errors habituals

El resum d’una pàgina

la feina de cada diaeditarels .cc i .hhmakecompila el que cal./main.exe< entrada > sortidadiffsortida i esperadasi no surt igual, torna a editar
El cicle de cada exercici: edites, compiles amb make, executes amb les dades de prova i compares amb diff.
Capítol La idea clau
Estructura d’un programa Includes, funcions i main. El main llegeix les dades, crida les funcions i escriu el resultat. Els paràmetres van per valor (còpia), per & (l’original) o per const& (l’original, sense poder-lo canviar).
Compilar i executar Cada .cc es compila a un .o i el linker els ajunta en l’executable. Les dades entren amb < i surten amb >, i diff et diu si la sortida és la bona.
Makefile Cada regla diu què es fa, a partir de què i amb quina comanda. make només refà el que ha quedat més antic que les seves dependències.

L’esquelet

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// Funcions: abans del main
<tipus> <nom>(<paràmetres>) {
    <instruccions>
}

int main() {
    // Llegir dades
    // Crides a funcions
    // Imprimir dades
}

Comandes

Compilar

Què vols Comanda
Compilar un fitxer font g++ [opcions] -c <fitxer.cc>
Enllaçar g++ [opcions] -o <executable> <fitxers.o>
Compilar i enllaçar de cop g++ [opcions] -o <executable> <fitxers.cc>

Les opcions del Jutge:

-g3 -D_GLIBCXX_DEBUG -Wall -Wextra -Werror -Wno-sign-compare -std=c++17 -fno-extended-identifiers

Executar i provar

Què vols Comanda
Executar ./<executable>
Llegir les dades d’un fitxer ./<executable> < <entrada>
Escriure la sortida a un fitxer ./<executable> > <sortida>
Afegir la sortida al final d’un fitxer ./<executable> >> <sortida>
Les dues coses alhora ./<executable> < <entrada> > <sortida>
Els errors (cerr) a un fitxer ./<executable> 2> <fitxer>
Passar la sortida d’un programa a un altre <programa> | <programa>
Comparar dues sortides diff <sortida> <esperada> (si no escriu res, són iguals)
La segona comanda només si la primera va bé <comanda> && <comanda>

Empaquetar

Què vols Comanda
Fer un .tar amb uns fitxers tar cf <paquet.tar> <fitxers>
Fer un .tar amb tota la carpeta tar cf <paquet.tar> *
Extreure un .tar tar xf <paquet.tar>

Makefile

Per a un programa amb main.cc i una classe (classe.hh i classe.cc), on tots dos .cc inclouen classe.hh:

# Variables
CXX = g++
OPCIONS = -g3 -D_GLIBCXX_DEBUG -Wall -Wextra -Werror -Wno-sign-compare -std=c++17 -fno-extended-identifiers

# Primera regla: el que fa «make» sol
all: main.exe

# L'executable: enllaça tots els .o
main.exe: main.o classe.o
	$(CXX) $(OPCIONS) -o main.exe main.o classe.o

# Un .o per a cada .cc, que depèn del .cc i dels .hh que inclou
main.o: main.cc classe.hh
	$(CXX) $(OPCIONS) -c main.cc

classe.o: classe.cc classe.hh
	$(CXX) $(OPCIONS) -c classe.cc

# Esborra el que s'ha generat
clean:
	rm -f *.o *.exe

.PHONY: all clean

Alerta: les comandes de cada regla comencen amb un tabulador, no amb espais.

Comanda Què fa
make Fa el primer objectiu (all).
make <objectiu> Fa només aquest objectiu (i el que en depèn).
make clean Esborra el que s’ha generat.
make -n Escriu les comandes que faria, sense executar-les.

Errors habituals

  • Provar un executable vell. Has canviat el .cc i no has recompilat: estàs provant el programa d’abans. Compila i prova amb &&, o fes servir make.
  • > cap al fitxer d’entrada. ./prog.exe > prog.in buida les dades abans de llegir-les.
  • Falta l’#include. 'cout' was not declared in this scope: posa l’#include i el using namespace std;.
  • Vector per valor. Si la funció l’havia de modificar, passa’l per &. Per valor, canvies una còpia.
  • getline just després de cin >>. Hi queda el salt de línia: llença’l amb cin.ignore(1000, '\n');.
  • Espais en lloc del tabulador al Makefile. missing separator.
  • Un .hh que falta a les dependències. make no refà el .o quan canvies la classe, i el programa fa coses estranyes.