# Funzionamento grader

**URL:** <https://forum.olinfo.it/t/funzionamento-grader/3838>\
**Category:** Olimpiadi\
**Created:** [20 Agosto 2014, 10:19am UTC](https://forum.olinfo.it/t/funzionamento-grader/3838 "2014-08-20T10:19:34Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![mark03](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/439d5e/32.png) [@mark03](https://forum.olinfo.it/u/mark03)\
**Post date:** [20 Agosto 2014, 2:55pm UTC](https://forum.olinfo.it/t/funzionamento-grader/3838/6 "2014-08-20T14:55:16Z")

</div>

> > chi mi spiega bene come si eseguono in locale grader e funzione creata per fare i test? come si richiama quest'ultima?
> > 
> > gianpiero96
> 
> Supponendo che tu utilizzi C o C++, l'idea è che devi lavorare con due file anziché uno, e uno di questo due (il grader) non lo devi (o meglio "non lo dovresti") modificare.
>   
> 
> Per esempio, se un problema ti chiede di implementare una funzione "somma", avrai una situazione di questo tipo:  
> 
>   
> 
> **grader.c** &nbsp;(ha la funzione main e dichiara un _[prototipo](https://en.wikipedia.org/wiki/Function_prototype)_ della funzione che devi implementare)
> 
> ```
> int somma(int, int);
> 
> int main() {
>     // lettura da file di a, b
>     // chiamata di somma(a, b) e scrittura del risultato su file
>     return 0;
> }
> ```
> 
>   
> 
> **tuasoluzione.c** (contiene un'implementazione compatibile col prototipo dichiarato nel grader)
> 
> ```
> int somma(int x, int y) {
>     return x + y;
> }
> ```
>   
> 
> Per capire come si fa a compilare "insieme" due file che si riferiscono a vicenda (come in questo caso) devi sapere che il processo che spesso viene semplicemente chiamato "compilazione" in realtà è suddiviso in due fasi distinte che avvengono una dopo l'altra: [(1) compilazione, (2) linking](http://stackoverflow.com/questions/3831312/compiler-and-linker-difference).
> 
> Assumiamo che per compilare un file utilizziamo questo comando (che produce di default, se tutto va a buon fine, un eseguibile _a.out_)
> 
> ```
> gcc nome_file.c
> ```
> 
> Questo comando in realtà prima&nbsp;_compila_ nome\_file.c in un file oggetto con estensione .o, e infine _linka_&nbsp;questo file oggetto creando un eseguibile.
> 
> Chiaramente, se provi a compilare con quel comando&nbsp;_uno solo_ dei due file di cui abbiamo parlato prima, riceverai un errore _nella fase di linking_:
> 
> - linkando il file oggetto ottenuto dalla compilazione di&nbsp; **grader.c** , ci sarà un errore che dice che il riferimento a "somma" non è definito.
> - linkando il file oggetto ottenuto dalla compilazione di&nbsp; **tuasoluzione.c** , ci sarà un errore che dice che manca il riferimento alla main().
> 
> Un modo per "risolvere" il problema è quello di compilare entrambi i file, per poi eseguire la fase di linking su entrambi i file oggetto (con estensione .o) che sono stati creati. Ovvero:
> 
> ```
> gcc nome_file1.c nome_file2.c
> ```
> 
> In questo modo la fase di linking andrà a buon fine (dato che tutti i riferimenti ci sono) e verrà prodotto l'eseguibile **a.out** (per specificargli un altro nome, si può usare come sempre il flag **-o** di gcc).
> 
> ### tl;dr
> 
> Un modo è questo:
> 
> 1) Crea per ogni problema una cartella apposita, in ogni cartella crea uno script bash chiamato "compila.sh" con dentro:
> 
> ```
> #!/bin/bash
> gcc -o tuoeseguibile grader.c tuasoluzione.c
> ```
> 
> 2) Fai tasto destro sul file, vai sulle proprietà e impostalo come eseguibile (assumo che si stia usando Ubuntu).
> 
> 3) Configura il tuo IDE in modo da mappare una combinazione di tasti a "esegui compila.sh".
> 
> 4)&nbsp;Configura il tuo IDE in modo da mappare un'altra combinazione di tasti a "esegui tuoeseguibile".
> 
> wil93

C'è un modo di "automatizzare" tutto questo in codeblocks, magari usando i progetti?

---

_[View the full topic](https://forum.olinfo.it/t/funzionamento-grader/3838)._
