Messages d'erreur
Lorsque vous testez ou soumettez une solution pour un problème, celle-ci peut facilement être jugée incorrecte par notre serveur. Voici une liste des erreurs que vous pouvez rencontrer.
- Erreur de compilation
- Erreur dans le résultat
- Erreur d'exécution
- Erreur de segmentation
- Dépassement de la limite de temps
Si vous ne comprenez pas du tout d'où peut venir l'erreur après avoir lu cette page et appliqué les éventuels conseils, posez une question sur le forum afin que l'on vous aide à la comprendre et à la dépasser.
Erreur de compilation
...
Ce message indique que le serveur n'a pas réussi à compiler votre programme et à générer un exécutable. Aucun point ne vous est retiré dans ce cas. Si le programme compilait chez vous, vérifiez que vous avez sélectionné le bon langage, et que vous n'utilisez pas de bibliothèques de fonctions non standard.
Erreur dans le résultat
Il a affiché :
Le nombre est : 50au lieu de :
50
Pour vous aider, voici le premier caractère différent :
<span class="badChar">L</span>e nombre est : 50
Cette erreur est la plus classique : votre programme s'est exécuté jusqu'au bout, mais le résultat fourni n'est pas le bon : il ne correspond pas à ce qui est demandé dans le sujet. Souvent, l'évaluateur affiche le résultat retourné par vorte programme, et la solution attendue.
Attention : l'évaluateur compare précisément votre solution à la solution attendue. Si vous avez ajouté du texte par rapport à ce qui est demandé, votre solution sera considérée comme fausse, même si le calcul est correct. Respectez scrupuleusement le format de sortie indiqué dans le sujet.
Si votre solution est effectivement différente de celle attendue, il s'agit d'une erreur dans votre algorithme, qui ne répond pas correctement à la question posée. Relisez bien le sujet, et vérifiez votre algorithme sur d'autres exemples, pour essayer de trouver ce qui ne fonctionne pas.
Notez les choses suivantes :
-
Les espaces (et tabulations) à la fin des lignes et les retours à la ligne à la fin de la sortie sont ignorés. Vous pouvez sans inquiétude les laisser dans la sortie de votre programme.
-
Considérez le programme Python suivant :
for iCar in range(34): print(chr(iCar), end = "")
qui affiche les 33 premiers caractères de la table ASCII (depuis le caractère de code nul jusqu'au point d'exclamation). Voici le début du message d'erreur qu'il produit :
La réponse donnée par votre programme est incorrecte.
Il a affiché :!
Seuls sont affichés : la tabulation (de code 9), le retour à la ligne (de code 10), le retour chariot (13), l'espace (32) et le point d'exclamation (33) ! Pourtant, si vous glissez un des autres caractères affichés dans votre sortie, même si celle-ci pourra paraître correcte, elle sera fausse (en pratique, on ne vous demande jamais que des caractères imprimables). Si vous ne voyez pas votre erreur dans le message, songez à un de ces caractères.
-
Considérez le programme OCaml suivant :
print_string "\200\210\220";
qui affiche les caracères de codes 128, 136 et 144 sur la sortie standard. Voici le début du message d'erreur qu'il permet d'obtenir :
La réponse donnée par votre programme est incorrecte.
Il a affiché :Your program output contains an invalid UTF8 character. / La sortie du programme contient un caractère UTF8 invalide.
Si votre sortie contient des octets invalides pour l'encodage de caractères UTF-8 que nous utilisons, vous obtiendrez ce message d'erreur. Cela ne peut concerner que des octets supérieurs ou égaux à 128. Si vous obtenez ce message, cela signifie certainement que vous avez effectué une erreur de calcul sur un caractère que vous affichez.
-
Si votre programme a affiché beaucoup de données, pour des questions de lisibilité et de charge du serveur, celles-ci ne seront pas affichées en entier, et un message « Résultat trop gros pour être affiché complètement » sera fourni. L'erreur n'est alors parfois pas visible, mais il y en a pourtant une erreur dans votre programme ; à vous de trouver laquelle.
Erreur d'exécution
Votre programme s'est terminé en indiquant qu'une erreur s'est produite. Dans les langages C++, OCaml, Java/JavaScool et Python, il peut s'agir d'une exception émise par votre programme, et non interceptée.
Par exemple en OCaml :
-
Fatal error: exception End_of_file
Votre programme a voulu lire des données sur l'entrée standard alors qu'il n'y avait plus rien à lire.
-
Fatal error: exception Failure("int_of_string")
Votre programme a essayé de lire un entier et n'a pas réussi, probablement parce qu'il a lu un espace à la place de l'entier. Pour corriger ce problème, ajoutez tout en haut de votre source la ligne suivante :
let read_int() = Scanf.scanf " %d" (fun x -> x);;
sans oublier l'espace avant le symbole%
.
L'erreur peut aussi correspondre à un code de sortie différent de zéro.
Par exemple, si vous avez écrit un programme C qui se termine par return 42
, le message suivant s'affichera :
Exited with error status 42
Votre programme doit en effet toujours retourner 0 (ce qui correspond au cas par défaut avec tous les langages).
Vous pouvez également obtenir l'erreur suivante :
Forbidden syscall clone
qui indique que votre programme a appelé une fonction que nous n'autorisons pas sur notre serveur pour des raisons de sécurité.
Par exemple, il peut s'agir d'une instruction system("pause");
(en C), ou d'un appel à une fonction de manipulation de fichiers.
Erreur de segmentation
Comme l'indique le message, l'erreur peut être de deux types :
-
Dépassement de la limite de mémoire.
Cette erreur indique que votre programme utilise plus de mémoire que la limite indiquée dans le sujet. Vous avez peut-être créé des tableaux trop gros, alloué trop d'objets en mémoire, ou même fait trop d'appels récursifs imbriqués (dépassement de pile). Calculez la mémoire maximale utilisée par votre programme, et vérifiez si ce total dépasse la limite autorisée.
-
Accès mémoire en dehors des zones réservées.
Cette erreur se produit par exemple si vous accédez en dehors des limites d'un tableau, comme l'indice -1, ou 10, d'un tableau de 10 cases. Elle se produit également si vous utilisez un pointeur et essayez de lire ou écrire à cette adresse avant de l'avoir initialisé, ou que ce pointeur correspond à une zone de mémoire non réservée.
Dépassement de la limite de temps
Votre programme ne s'est pas terminé dans la limite de temps indiquée dans le sujet. Il peut s'agir d'un bogue dans votre programme qui entraîne une boucle infinie, ou tout simplement d'un algorithme qui n'est pas suffisamment efficace. Essayez d'estimer le temps que prend votre programme dans le pire cas, et comparez à la limite de temps du sujet. Si vous dépassez largement cette limite, c'est qu'il faut trouver un meilleur algorithme.
Lorsque la limite de temps est dépassée, votre programme est interrompu avant de fournir un résultat. On ne vous indique donc pas si ce résultat aurait été correct ou non.