quarta-feira, 28 de novembro de 2012

Spoj e seus sinais


Umas das dificuldades dos iniciantes na plataforma SPOJ é entender os resultados
de erros mostrados pelo SPOJ.


Por exemplo, o que significa um erro em tempo de execução (NZEC). NZEC significa Non Zero Exit Code. Na linguagem C, esse erro será gerado se sua função main não tem o return 0. Em outras linguagens, este erro pode ser gerado se uma exceção é gerada.

Listas dos sinais emitidos pelo Spoj:
http://en.wikipedia.org/wiki/Unix_signal#POSIX_signals 

Os erros mais comuns encontrados nas submissões do spoj (pelo menos em C):
SIGSEGV (signal 11)
Esse sinal é emitido quando um programa faz uma referência à memória inválida ou quando ocorre uma falha de segmentação.

A falha de segmentação pode ocorrer quando fazemos:
-Um desreferenciamento de um ponteiro NULL.
-Um acesso de memória não existente ou sem permissão.
-Uso de ponteiro não inicializado.

int main(){
 int * p = NULL;
 int a = *p; //desreferenciamento de ponteiro NULO
}

Nos problemas do SPOJ, geralmente, esse problema ocorre quando acessamos uma posição do vetor fora do intervalo definido.

SIGFPE (signal 8)
Esse sinal é emitido quando o programa executa uma operação aritmética errônea, como por exemplo, divisão por zero.

SIGXFSZ (signal 25)
Esse sinal é emitido quando o programa imprime o arquivo de saída maior do que tamanho maxímo permitido.

Geralmente, esse sinal é emitido quando o programador esquece de retirar os "printfs".

SIGABRT (signal 6)
Esse sinal é lançado quando seu programa faz uma chamada de sistema abort(). Por exemplo, memória alocada insuficiente.

Tutorial para usuários do SPOJ
http://www.spoj.pl/tutorials/USERS/


2 comentários:

Fabio Dias disse...

Por isso que parei de tentar o spoj pois não sabia desse sinais. Valeu Wladimir.

@ygorreis disse...

E quando na questão, na entrada de dados, diz EOF, o que significa isso?