[INFO] les erreurs du compilateur

Répondre
Partager Rechercher
bon, alors il en a été question plusieurs fois, et j'ai même mis des exemples de coté, donc je le lance ^_^
Je propose donc de regrouper dans ce topic un maximum d'exemples d'erreurs différentes, à partir de ce que renvoi le compilateur. Afin que les scripteurs débutants ( ) et ceux qui adaptent les scriptent puissent avoir quelque éléments avant de se jeter à l'eau et d'ouvrir un fil
Le but n'est évidement pas de ne plus répondre aux questions hein ! Simplement de faciliter la vie à tous le monde

Bien sur il ne viendrait à personne de faire ces erreurs tout a fait stupides
mais dans l'euphorie, ba quand on a 6000 ligne à vérifier, c tjrs flippant lorsque ca marche pas et qu'on sait pas pourquoi
(on a svt la ligne de l'erreur, mais bon . . . )

D'une manière générale

*L'erreur qui empêche la compilation, si elle ne se trouve pas à la ligne indiquée (genre il n'y a qu'un bête } a cette ligne ) peut très bien se trouver à la ligne au dessus, c'est souvent le cas d'ailleurs
Quelqu'un à dis un jour :
Si on t'indique une erreur à la ligne X, pense, petit scarabé, à vérifier la ligne X-1

*Les majuscules sont très importantes, et très souvent source de pb de compilation

*En cas d'include, la ligne d'erreur prend en compte les lignes de l'include (euh, parfois, je suis pas tjrs sûre ) donc si aucune ligne n'est surlignez, et bien
-bien regarder le nom du script où l'erreur est détectée
- vérifier le script d'include
- sauter des lignes dans le script à compiler, à l'endroit ou le compilateur vous indique le soi-disant bug; si le bug vient effectivement de l'include, le compilateur vous indiquera alors qu'il y a une erreur ... dans une ligne vide
- regarder attentivement le nom du fichier .nss qui contient l'erreur, dans le rapport du compilateur; normalement vous devriez lire le nom du fichier d'include et non du script que vous essayez de compiler
-mettez un :
Code PHP:

void main() {} 

au début de votre include et éssayé de le compiler

*En cas de gros script ardu, mettez toutes vos déclarations de variables en début de script, du moins au début, l'optimisation ça seras pour après
Et n'hésitez pas à déclarer de nouvelles variables si vous avez un doute !! Si vous avez des problèmes, c'est pas à un ou deux tours d'horloge près . . .

*aerer correctement un script permet de débusquer les erreurs plus facilement, faites le tout de suite, ca éviteras de chercher à quel moment il manque des accolades

*dès que ca devient un peu gros, c'est idiot hein, mais il faut prendre l'habitude de fermer immediatement les parenthèses et les accolades, placer le nb de virgule pour les arguments des fonction etc. et rédiger entre, ainsi on évite bon nombre d'errur dans les
Code PHP:

if(GetLocalInt(GetLocalObject(OBJECT_SELFGetLocalString(oObj"ENFIN")), "MAUVAISE ID"))
{
   if()
   {
      while(
GetIsValidMachin(mMachin))
           {
                  for(
i;i<10 ;i++)
                  
ActionDoMachin();
             
//etc.
            
}
   }



*Il est parfois necessaire de détacher de l'écran pour voir où sont les bourdes
Allez donc prendre une douche, dormez un peu, rasez/épilez vous, mangez un vrai repas, et rééssayez, votre écran vous remercras (méthode éssayée, vérifiée, et approuvée )


Bon, alors quelques exemples

(peut être faudra t'il éditer ce post pour rassembler les messages au début, des fois qu'il y aurait des discutions pour certaines erreurs )

Alors, pour commencer, présentation sommaire du format d'une erreur du compilateur d'aurora

Code PHP:

07/05/2003 20:14:16 Erreur'subo_inc' n’est pas compilé.
subo_inc.nss(328): ERREUR VARIABLE DEFINED WITHOUT TYPE 
Citation :
date heure : Erreur. 'nom du script' n'est pas compilé.
nomdufchier.nss(ligne où se trouve l'erreur): ERREUR : TYPE D'ERREUR
Des exemple maintenant, avec des explications sommaires dans la mesure du possible


>>>===<<< >>>===<<<
une qui arrive au moyenne une dizaine de fois par (essai de) compilation (oui je parle pour moi )

Code PHP:

ERREUR VARIABLE DEFINED WITHOUT TYPE 

on ne peu plus parlant, vous avez oublié de définir une variable il faut quand on utilise une variable la déclarer, avec un object oTruc; int nMachin; etc.

Pour savoir ce qu'est une variable, ba allez voir les tutoriaux


>>>===<<< >>>===<<<

Une autre courante :
Code PHP:

ERREUR DECLARATION DOES NOT MATCH PARAMETERS 

Alors, la le problème c'est qu'on a pas rentré les bons paramètres dans la fonction, autrement dit :

Code PHP:

void SetLocalInt(object oObjectstring sVarNameint nValue
demande :
un objet
une string (des lettres quoi)
un entier

si a la place de l'entier par exemple on met

1.5

ca n'iras pas, parce que c'est une "float", un decimalien
rappel, une string se met entre guilement, sinon c'est une variable qu'il a fallu définir avant, genre
Code PHP:

string sMachin "blablabl balablab";
object oMachin GetTonObjectCommeTuVeu();
SetLocalString(oMachin "NOM_DE_TA_VARIABLE"sMachin ); 

>>>===<<< >>>===<<<

encore une :

Code PHP:

ERREUR UNDEFINED IDENTIFIER (oSpeak2
evidement, zaurez pas tjrs "oSpeak2"
voici le bout de code :
Code PHP:

if(GetLocalString(oSpeak2 "TEMP_SPAWN") == ""){//etc . . .} 

Alors ? Ba la virgule bien sur ! il manquait la virgule entre les deux paramètres, donc mieux vaut mettre
Code PHP:

if(GetLocalString(oSpeak2"TEMP_SPAWN") == ""){//etc . . .} 

>>>===<<< >>>===<<<

une autre rigolote :
Code PHP:

ERREUR MULTIPLE CASE CONSTANT STATEMENTS WITHIN SWITCH 

mm, en fait la le probleme se pose dans un switch, lorsque l'on donne plusieurs cas possible, si deux on le même numero, ba ca coince (et pour cause)

donc pas
Code PHP:

switch(nTruc)
{
case 
1:
 
//code
break;
case 
2:
 
//code
break;
case 
2:
 
//code
break;

mais
Code PHP:

switch(nTruc)
{
case 
1:
 
//code
break;
case 
2:
 
//code
break;
case 
3:
 
//code
break;

>>>===<<< >>>===<<<

tiens, une autre drole :

Code PHP:

ERREUR TOKEN TOO LONG 

c trop long
Une string est limité à 510 caractère je crois (c t RAT qu'avait compté nan ? )

>>>===<<< >>>===<<<

une qui énerve (constatée y a pas longtemps )

Code PHP:

ERREUR SKIPPING DECLARATION VIA "case" STATEMENT DISALLOWED
En gros, il ne faut pas faire de déclaration dans un endroit qui n'est pas forcement parcouru, bon, en gros hein, j'en sais pas plus que ca

Le truc, c'est de faire des blocs, car une varaible n'est déclarée que dans son bloc (me semble )
autrement dit pas
Code PHP:

switch(nTruc)
{
case 
1:
object oMachin;
break;

mais
Code PHP:

switch(nTruc)
{
case 
1:
   {
    
object oMachin;
   }
break;

>>>===<<< >>>===<<<

une autre fréquente et enervante (mais on a droit au nb de la ligne qui cloqche donc la pluspart du temps ca va )

Code PHP:

ERREUR UNKNOWN STATE IN COMPILER 

bon, alors c rarement la même chose, la dernière fois c t :
Code PHP:

if( ...)
{

...
... 
//c a la ligne suivante que ca cloche
if( ... )


il n'y avait rien derrière un if, donc ba g mis un truc



autre cas : l'oubli d'un ; à la fin d'une instruction
Le point virgule indique la fin de l'instruction au programme (c ca non ?) donc ba ca va lui faire tout drole si il peut pas prendre sa respiration entre deux phrases (qui n'a pas été interloqué par les erreurs de lectures de ces camarades de classes ^_^ )

>>>===<<< >>>===<<<

et maintenant, la pire rencontrée :

Code PHP:

Erreur interne_rapport du compilateur vide 

et c tout, pas de ligne, rien

là en l'occurence, j'avais déclaré une fonction une fois, mais codé deux :
Code PHP:

void FaisMachin();

void FaisMachin()
{
//code
return;
}

void FaisMachin()
{
//code
return;

>>>===<<< >>>===<<<

une nouvelle :
Code PHP:

ERREUR DUPLICATE FUNCTION IMPLEMENTATION 

vous avez laissé le void main() de debugage dans l'include ^_^
d'un facon plus generale, il a trouvé deux foix une même fonction dans un script+divers includes, faites attention, il n'est pas la peine de redéclarer vos fonctions, mettre un include équivaut à copier tout cet include à cet endroit ^_^
rien n'est moins sure mais il semble que la ligne donnée soit celle de la fonction rencontrée deux fois, la deuxieme occurence, en l'occurence ( ^_~ ), l'accolade qui suit le nom de la fonction pour être précis, mais bon, pas de nombreux test, juste une remarque comme ca en passant . . .


plus au prochaine épisode ^_^
et participez, ca iras d'autant plus vite

EDIT : essai de rendre la chose lisible, et rajout de qq truc, dt les remarques de Jedai
arg, trop de smilyes MDR
EDIT2:idem, et merci à Taern ^_^ (ca va vite faire bcp d'edit ca . . .)
Thumbs up
Bon boulot Reyan !

ERREUR : UNKNOWN STATE IN COMPILER peut aussi correspondre à un oubli de ';' à la fin d'une instruction.
De façon générale, je conseille de vérifier non seulement la ligne indiquée, mais aussi les 2-3 lignes qui précèdent, souvent c'est là qu'on trouve la faute.


A propos de compilateur, j'ai une nouvelle qui devrait faire plaisir à pas mal de gens ici :
Torlack vient d'être engagé par Bioware, ce qui nous permet d'espérer une intégration prochaine de son compilateur pour l'instant externe (rappelons que ce compilateur à la fois est plus rapide à la compilation et produit du code de meilleure qualité, plus optimisé).
Reste à voir si les options avancées qu'il nous autorisait vont persister (const , court-circuit du "||"), et surtout attendre une confirmation (pour l'instant, aucune déclaration n'a été faite dans ce sens)
J'en profite pour rajouter une erreur qui m'a beaucoup gêné à mes débuts.

Parfois, il peut arriver que l'on obtienne une erreur, une de celles que Reyan a listé par exemple, mais qu'après la 100ème vérification de la ligne indiquée et de ses environs, ben toujours rien.

Là, 2 cas possibles :

1/ Si vous n'avez pas inclus d'autre script au début de celui qui bug, alors vous êtes bon pour une 101ème vérification

2/ Si jamais vous avez inclus un fichier, alors il est possible que l'erreur ne vienne pas du script que vous avez sous les yeux, mais du fichier inclus, justement. (même si le compilateur vous surligne ce qu'il croit être la ligne défectueuse du script, alors que celle-ci ne contient probablement aucune erreur)
Il y plusieurs moyens d'être sûr que vous avez bel et bien une erreur dans votre include :
- vérifier le script d'include
- sauter des lignes dans le script à compiler, à l'endroit ou le compilateur vous indique le soi-disant bug; si le bug vient effectivement de l'include, le compilateur vous indiquera alors qu'il y a une erreur ... dans une ligne vide
- regarder attentivement le nom du fichier .nss qui contient l'erreur, dans le rapport du compilateur; normalement vous devriez lire le nom du fichier d'include et non du script que vous essayez de compiler

Voilà A savoir qu'un fichier d'include (ou tout autre fichier ne comportant pas de programme void main(), compilera peut-être, mais surtout compilera indifféremment des erreurs qu'il pourrait contenir. Pour vérifier s'il contient effectivement des erreurs, il faut rajouter un petit void main() temporaire à la fin, ou l'inclure dans un autre script et se référer à ce que j'ai dit plus haut

Je sais c'est pas clair Allez z'êtes bon pour une 2e lecture de ce post pour piger de quoi je parle
Arf, communion des esprits là Taern
je viens de le rajouter
bon, ba je rajoute ce que tu a précisé
euh, je sais pas si je vais pouvoir le faire longtemps, il me dit que je met trop d'image (oui j'aime bien les smilies ) et comme les balise compte comme des images si g bien compris ^_^. . .
Y a aussi toute la liste des NO RIGHT BRACKET AFTER EXPRESSION, NO SEMICOLUMN AFTER EXPRESSION, etc... mais clles la sont suffisament explicites

Y a aussi
Code PHP:

PARSING VARIABLE LIST 

La vous avez oublié le point virgule après avoir déclaré votre variable si je me souviens bien

PS : roh Taern un inculde qui se compile, t'as pas honte ?
Citation :
Provient du message de Zunder
Code PHP:

PARSING VARIABLE LIST 

Peut également indiquer que l'on a oublié de mettre #include "nom_inc" en début de script alors qu'on utilise une fonction perso

Jaha Effect
Taern voulait dire un include qui ne provoque pas d'erreur avant de vous annoncer qu'il lui manque un main(), parce que le compilateur fait tout de même quelques vérifications avant cela....
Sinon, la technique que je recommande à tous ceux qui font une bibliothèque (et qu'a évoqué trop brièvement Taern), c'est de mettre un main() à la fin de sa bibliothèque durant la phase de test (et l'enlever après, bien sûr ), ainsi le compilateur détectera dix fois plus de fautes.
Pendant la phase de test, on met ceci tout à la fin de la bibliothèque :
Code PHP:

void main(){} 

Et quand on a fini les vérifications, on commente cette ligne ainsi :
Code PHP:

//void main(){} 

C'est exactement ce que je voulais dire

A noter qu'après que l'include se soit compilé sans erreur et tout (avec un void main() temporaire), il faut encore recompiler tous les programmes utilisant cet include Sinon, ça ne changera rien du tout.

Ah oui et puis :

Bracket : parenthèse
Semicolon : point-virgule

Je pense que ça pourra servir aux anglophobes
aller, une autre :

Code PHP:

RETURN TYPE AND FUNCTION TYPE MISMATCHED 

le type de retour de la fonction attendu et le type du retour retourné ( )sont différent

autrement dit :

Code PHP:

object GetPlayerNb(int nNb)
{

string sMachin

//code

//code etc.

return sMachin;

vous annoncez un objet et vous retournez une string !! pas bien

vas rencontré dans la vrai vie :
dans ce fil
Code PHP:

void SetGuilde(object oObjectstring sTable="guilde")
{
    
int iNum;
    
string sMaitre;
    
iNum Random(999999999);
    
IntToString(iNum);
//etc.

    
if (SQLFirstRow() == SQL_SUCCESS)
    {
        
// Si elle existe déja
        
iNum Random(999999999);
        
IntToString(iNum);
//etc.
        
return iNum;
    }
    else
    {
        
// Si elle n'existe pas
//etc.
        
return iNum;
    }

dans ce cas, p-e que les IntToString était sensé transformer le Int en String, mais c'est une erreur, cette fonction renvoi une chaine de caractère correspondant au nombe rentré, elle ne transforme pas une variable défini comme int en une variable string
ici ils ne servent à rien, il faut faire :
Code PHP:

void SetGuilde(object oObjectstring sTable="guilde")
{
    
int iNum;
string sNum//definition d'une variable string
    
string sMaitre;
    
iNum Random(999999999);
    
sNum IntToString(iNum);//sNum prend la valeur que renvoi IntToSTring
//etc.

    
if (SQLFirstRow() == SQL_SUCCESS)
    {
        
// Si elle existe déja
        
iNum Random(999999999);
    
sNum IntToString(iNum);
//etc.
        
return sNum;
    }
    else
    {
        
// Si elle n'existe pas
//etc.
       
sNum IntToString(iNum
        
return sNum ;
    }

si tant est que ca corresponde au but de la fonction, en tous les cas ca n'est pas faux peut être que ca n'est pas ce qu'il faut, mais ca n'est pas faux


pour memo, les "types" de fonction sont

void => pas de renvoi
object => renvoi un object
string => renvoi une chaine de caractère
int => renvoi un entier
float => renvoi un decimal
location => renvoi une location
vector => renvoi un vecteur

et il ne faut pas non plus oublier le
return;
même si c'est une simple
void
Autre erreur dans ce script (Tu en parle juste au dessus en plus ) :
Code PHP:

void Setguild(){
     ....
     return 
sNum
     
....
     } 
Ben cette fonction en void peut pas renvoyer quoi que ce soit, et elle essayes de renvoyer un string...

autre chose, a propos de l'erreur :
Code PHP:

ERREUR SKIPPING DECLARATION VIA "case" STATEMENT DISALLOWED
Elle signifie que tu ne peux pas déclarer une variable dans un case (cela est vrai également dans un if ou n'importe quel bloc conditionnel) si tu n'utilises pas un bloc (autrement dit en le mettant entre { et }.)
Pourquoi ?
Parce que si tu ne met pas de bloc, il ne peut y avoir qu'une seule instruction effectué par ta condition. Donc si tu déclares une variable de cette manière, cela signifie que ta variable est utilisée en dehors de ce bloc conditionnel. Il pourrait donc se produire un cas de figure ou, la condition n'étant pas remplie, la variable n'est pas déclarée, et donc n'est pas valide lorsqu'on tente de l'utiliser un peu plus loin.
Pour couper court a ce genre de bug, le compilateur interdit donc ce genre de syntaxe.

Tiens, au passage :
Code PHP:

ERRORINCORRECT VARIABLE STATE LEFT ON STACK 

Ca c'est ce que vous obtenez si vous essayez de déclarer une variable après un if sans le mettre dans un bloc, comme dans cet exemple :
Code PHP:

void main()
{

if (
TRUEint test 1;

MDR
je crois que là va falloir un sacré trou pour me cacher
Bon, ba je vais pas éditer hein, ca aurait plus aucun sens

pis au passage, je n'y connais strictement rien en compilateur, mais il me semble avoir remarquer que dans les cas des includes, il n'indique le bon nom de fichiers que pour certaine erreurs . . . et pour d'autre ca ne donne que le nom du fichiers en cours de compilation, avec la ligne de l'erreur dans l'include

notamment les :
Code PHP:

ERREUR VARIABLE DEFINED WITHOUT TYPE 

donc gaffe, pa la peine de défoncer la clavier le "truc" du
void main() {}
marche très bien


cas paranormal de :
Code PHP:

ERRORINCORRECT VARIABLE STATE LEFT ON STACK 

Code:
int nMin = . . . 
if(bBool)
{
     nMin = . . .
}
else
{
    nMin = . . . 
}
la variable n'etait pas déclarée dans le bloc mais au dessus.
J'avais un bloc du même genre et il a compilé.
J'ai déclaré mes machin plus haut, ca a compilé . . .

Cas aussi lors d'un commentage malheureux après debug :

Code:
if(test) //SendMessageToPC(oPC, "un message)); <== commenté après debug
int nMin = . . . 
if(bBool)
{
     nMin = . . .
}
else
{
    nMin = . . . 
}
ici avant commentaire le if portait sur le SendMessage
après debug, une fois le SendMessage commenté, le if porte sur la declaration, ce qui ne va plus du tout !
on pourrait se retrouver à utiliser une variable non déclaré pour un peu que test vale faux (donc ca compile pas)

c'est idiot comme erreur, mais g galéré
donc je met ca là, pour m'en souvenir ^_^
Notez qu'une fonction peut également renvoyer une structure préalablement définie, ce qui peut-être vachement utile depuis que Bioware a supprimé le bug qui empêchait de mettre deux string dans une structure.
et un up parce qu il le mérite si il n est pas déjà mis dans les persistants quelqu un pourrait le faire histoire que d autre se casse pas les dents sur leurs script
il y est, il suffit de le chercher ^_^
ba oui, ils sont pas trié donc bon

page 2 du topics sur les "sujets de références"
soit dit en passant, dans le topics qui organise tout ca, et qui donne le lien vers le topic sus dits,
Citation :
SUJET DE REFERENCES / TUTORIAUX
- Apprendre à Scripter.
- Les erreurs classiques.
genre au bout de 5 lignes ^_^

Soit dit en passant, je suis d'accord sur le fait que bon nombre de demandes de debugs trouvent leurs solution ici , et sur le fait qu'il gagne sans doute à être connu

edit : mm, peut être que ces messages meriteraient d'être supprimés histoire de garder un topic clair . . . ba, une fois qu'il sera redescendu une page plus bas ^_^

||
||
V
__________________
scripteur à mi-temps amateur brouillon flemmard
et pas si compétent, encore un scienteux
qui ne sait aligner deux mots correctement

quelques messages d'erreurs classiques
Moi un truc qui me pause toujours problème parfois ... et que je n'ai pas vu dans la liste c'est les :

Code:
ERREUR : "else" WITHOUT "if" STATEMENT.
que l'on rencontre parfois dans les fonctions "else if", alors qu'après vérif tout est ok.
Une de plus?
Code:
  ERREUR : LA CONDITION "else" NE PEUT PAS ETRE SUIVIE PAR UNE SPECIFICATION NULLE.
tout en francait et tout ^^ avec le numéro de ligne

Je débuggais le prog d'un pote qui avait mis ca....
Code PHP:

    void test()
    {
     if( .... )
     { 
      
//..... 
     
}
     else;
    } 
Il aurait bien évidemment fallu enlever le else tout simplement
Ce n'est pas tout à fait ça.

Pour être plus précise, cela signifie qu'il faut ôter le point-virgule après le "else".

le même type de message apparaîtra d'ailleurs s'il s'agit d'un "if".

Le code :
Code PHP:

{
    if(
GetMachinTruc(oBidule)==Chose);
    {
        
// Tout plein de code correct ici
        
...
    }

    
// Le else ne provoque pas d'erreur ici.
    // Il n'a juste aucune valeur, vu qu'il ne
    // propose aucune alternative précise.
    
else

Te rendra l'erreur :
Code:
ERREUR : LA CONDITION "if" NE PEUT PAS ETRE SUIVIE PAR UNE SPECIFICATION NULLE.
Il faudra juste ôter le point-virgule situé à la fin de la condition posée par le "if".
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés