Funzionamento grader

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 (ha la funzione main e dichiara un prototipo 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.

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 compila nome_file.c in un file oggetto con estensione .o, e infine linka questo file oggetto creando un eseguibile.

Chiaramente, se provi a compilare con quel comando 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 grader.c, ci sarà un errore che dice che il riferimento a "somma" non è definito.
  • linkando il file oggetto ottenuto dalla compilazione di 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) 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?