[Aide SDK] Les erreurs de compilation
Posté le 15/05/2011 00:10
Suite aux nombreuses demande d'aide que je reçois concernant des messages d'erreur lors de compilation avec le SDK, je décide de créer ce topic qui aura pour but de recenser tous les messages d'erreur, de les expliquer, et de donner leur solution.
Premièrement, qu'est ce qu'une erreur de compilation ?
Ici, ce sont les 4 lignes qui commencent par le chemin de mon fichier source contenant les erreurs (Z:\home\pierre\a\a.c) suivi du numéro de la ligne contenant l'erreur.
Liste des erreurs
Illegal token ''<mot>''
Description : Une erreur de syntaxe a été rencontrée
avant <mot> (un point virgule manquant, une parenthèse en trop ...)
Solution : Arrêter de coder avec les pieds.
Undeclared name ''<nom>''
Description : Une variable est utilisée sans avoir été déclarée au préalable.
Solution : Déclarer la variable au début de la fonction.
Cannot convert parameter ''X''
Description : Le paramètre n°X envoyé à la fonction n'est pas du bon type, et ne peut pas être converti.
Solution : Vérifier quel type de variable demande la fonction, et lui envoyer une variable du bon type.
Illegal initializer type
Description : Une variable est initialisée avec un type incorrecte (exemple, un entier initialisé avec une chaîne de caractère)
Solution : Initialiser la variable avec une valeur CONSTANTE correcte.
Le compilateur Renesas utilisé par le SDK respecte la norme C89, qui spécifie qu'une variable doit être initialisée avec une valeur constante, et non une valeur de retour de fonction, ou un paramètre de la fonction.
Multiple variable declarations
Description : Une variable a déjà le même nom et la même portée que celle déclarée à la ligne de l'erreur.
(Deux variables peuvent avoir le même nom si elles n'ont pas la même portée)
Solution : Nommer la variable différemment.
Type not compatible for ''=''
Description : L'affectation d'une valeur à une variable a échouée car la valeur n'est pas d'un type compatible avec celui de la variable.
Solution : Si la valeur affectée est un retour de fonction, vérifier quel type de variable retourne la fonction.
Modifiable lvalue required for ''=''
Description : Un élément non modifiable (comme une fonction où une constante) est suivi d'un signe égal.
Solution : Seule les variables peuvent se voir affecter une valeur avec ''=''.
Index not integer
Description : utilisation d'un float ou d'un double dans l'index d'une case de tableau.
Solution : Caster en int, tableau[double] devient tableau[(int)double]
Number of parameters mismatch
Description : Trop ou pas assez de paramètres sont envoyés à la fonction.
Solution : Regarder ce que demande la fonction, et le respecter.
Undefined external symbol ''_<nom de fonction>''
Description : Une fonction est appelée, mais son implémentation n'a pas été compilée.
Solution : Vérifier l'orthographe du nom, vérifier si le fichier contenant la fonction est bien dans la fenêtre ''Files in project''. Si tout ça est bon, essayez d'éditer le fichier contenant l'implémentation de la fonction (ajouter un espace, le supprimer, sauvegarder), ça permettra au compilateur de re-compiler le fichier.
couldn't open ''<nom de fichier>''
Description : Un fichier inclu avec #include n'existe pas.
Solution : Lors de l'inclusion d'un fichier, il faut donner son
chemin relatif depuis le fichier contenant la directive #include
Empty source program
Description : Le fichier source est vide, et aucun compilateur n'aime ça.
Cannot open source file ''<nom de fichier>''
Description : Le fichier source présent dans la fenêtre ''Files in project'' du SDK n'existe pas.
Unrecognized preprocessing directive
Description : Une directive de préprocesseur (lignes commençant pas #) n'est pas correctement orthographiée.
Illegal preprocessor syntax
Description : Erreur de syntaxe dans une directive de préprocesseur.
Expected a file name
Description : Un nom de fichier est attendu (généralement une erreur de syntaxe dans une directive include)
Expected an identifier
Description : Un identifiant est attendu (généralement une erreur de syntaxe dans une directive define ou ifdef)
Invalid parameter specified in option "input" : ""C:\Program Files (x86)\CASIO\fx-9860G SDK\OS\FX\lib\setup.obj""
Description : Ne jamais installer le SDK dans un dossier dont le chemin comporte des parenthèses ! Mettez-le dans C:\Programmes\CASIO par exemple.
Cette liste est incomplète, si vous rencontrez d'autres erreurs, vous pouvez les poster ici, elles seront ajoutées.
Voici une liste en anglais de toutes les erreurs possibles et imaginables. Cela ne vous donne pas forcément une bonne solution, mais ça peut vous aiguiller sur une piste
Dernière modification : 26/09/2013 (Dark Storm)
Fichier joint
Citer : Posté le 09/09/2012 08:30 | #
Ben, tu alloues un tableau simple de taille (largeur*hauteur), et pour accéder à une case tu fais tableau[y*largeur+x].
Citer : Posté le 09/09/2012 18:42 | #
Ok, c'est fait pour le tableau 1D et la sécurisation de l'allocation.
Une autre chose, j'ai un multiple variable declarations:
{
//déclaration des sprites du personnage et des portes
unsigned char perso_droite[] = {0x18, 0x18, 0x33, 0x3E, 0x30, 0x38, 0x68, 0x4C};
unsigned char perso_gauche[] = {0x18, 0x18, 0xCC, 0x7C, 0x0C, 0x1C, 0x16, 0x32};
unsigned char porte[] = {0x18, 0x2C, 0x76, 0x5A, 0x5A, 0x6E, 0x34, 0x18};
jinfo perso;
pinfo porte[2]; [b]//ici[/b]
int a, b, c, d;
initperso( &perso );
}
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 09/09/2012 20:59 | #
Il n'y a pourtant pas plus clair comme message d'erreur. "Multiple déclarations d'une variable"
Citer : Posté le 09/09/2012 21:07 | #
Alors je fais quoi?
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 09/09/2012 21:16 | #
Tu n'as pas le droit de donner le même nom à 2 variables qui ont la même portée (tu as 2 tableaux nommés "porte").
Citer : Posté le 09/09/2012 21:17 | #
Normal tu la déclares en unsigned char puis en pinfo...
Citer : Posté le 09/09/2012 21:32 | #
Ok, merci
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 09/09/2012 22:24 | #
Quelqu'un peut m'expliquer pourquoi quand je fait ça :
sprintf(tempchar, '%d',45);
locate(1,7);Print((unsigned char*)tempchar);
ca me donne " T".. a ce que je sache %d est traduire les caractères en nombre.. En plus sprintf ne renvoit pas d'erreur, il renvoit 2 ce qui veut dire qu'il a écrit 2 caractere(sans compter le /0 a la fin)
Ajouté le 09/09/2012 à 22:26 :
Et ce code marchait très bien avant..
Citer : Posté le 09/09/2012 23:09 | #
Une chaîne de caractère est délimité par des doubles quotes. Les simples désignent un caractère.
Citer : Posté le 09/09/2012 23:15 | #
C'est ce qui me semblais, mais je n'était pas sûr. De toute façon, je les avais mis pour tester pour voir si ça marchait avec des simple, mais au début c'était des double.
Donc j'ai remis les double mais j'ai toujours le même problème... Mais j'ai l'impression que le compilateur fait des erreur ou des truc totalement aléatoire et qui on parfois rien à voir avec mon code depuis hier..
Ajouté le 09/09/2012 à 23:22 :
Ouais bon en fait je viens de voir que quoi que je mette comme argument ca change rien j'ai un " T"(un espace et un T ce qui fait finalement deux caractères) et j'ai beau mettre des grands nombres ou un seul caractère ca me retourne toujours 2
Citer : Posté le 10/09/2012 11:48 | #
Essaye d'utiliser la fonction printVmini (de PierrotLL je crois ) pour afficher la valeur d'une variable.
Je crois qu'on peut la trouver dans les sources de Métro Siberia.
Citer : Posté le 10/09/2012 14:29 | #
Oui, déjà sprintf est à éviter car c'est une fonction très lourde (+7ko au g1a). Comment écrire un nombre dans une chaîne
Mais ça ne résout pas l'énigme, je ne comprends pas pourquoi tu obtiens ce résultat.
Citer : Posté le 10/09/2012 17:16 | #
Merci a vous deux.
Oui, déjà sprintf est à éviter car c'est une fonction très lourde (+7ko au g1a)
Ca c'est bon a savoir ! A vrai dire je l'utilisais surtout pour tester les variables si elles ont bien ce que je veut et j'avais pas envie de recoder tout une fonction juste pour ça Sinon je l'utilisais a un seul autre endroit (pour afficher l'heure rtc 00:00) mais bon je me débrouillerais pour recoder un truc alors
Ah et une derniere chose, le fait de reformater l'ordi n'a rien changer et le SDK fonctionne sous windows 8 :P
Citer : Posté le 11/09/2012 10:26 | #
Enigme résolue Ziqumu, t'as oublié d'inclure stdio.h
Je ne pensais pas que ce simple oublie donnerait un résultat si étrange (on a l'habitude des compilo intelligents qui savent au moins où se trouvent les fonctions standards) mais j'ai fait le test et c'est bien ça.
Citer : Posté le 11/09/2012 11:45 | #
(...dans le genre faute idiote je suis doué moi )
Enfin j'arrive plus a reproduire l'erreur, mais bon je te crois
Merci d'avoir rechercher (et d'avoir trouvé aussi )
Le bon coté de ce compilateur contrairement à tout les autres, c'est que je suis content quand j'ai une erreur dans les résultat de build, parce que ca veut dire qu'en général c'est pas compliqué à régler (alors que quand on à un error system ou un resultat comme celui la, on peut y passer quelques heures pour pas grand chose..)
Citer : Posté le 12/09/2012 23:34 | #
J'ai plusieurs Index not integer:
( ( mat_niveau[perso.y_mat * largeur + floor( ( perso.x_pointcontact[0] +1 ) / 8 )] <= 0 ) ) || //ici
( mat_niveau[perso.y_mat * largeur + floor( ( perso.x_pointcontact[1] +1 ) / 8 )] <= 0 ) ) - //ici
( IsKeyDown( KEY_CHAR_4 ) && ( ( mat_niveau[perso.y_mat * largeur + floor( ( perso.x_bmp -1 ) / 8 )] <= 0 ) ) || //ici
( mat_niveau[perso.y_mat * largeur + floor( ( perso.x_pointcontact[2] -1 ) / 8 )] <= 0 ) ) ) deplacement( &perso ); //ici
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 12/09/2012 23:41 | #
Tu dois avoir un float quelque part qui doit t'obliger à faire un cast : (int)(perso.y_mat * largeur + floor( ( perso.x_pointcontact[0] +1 ) / 8 ))
Citer : Posté le 13/09/2012 09:49 | #
Voilà ce qui n'est pas un entier. Donc comme l'a dit Eiyeron, il faut caster.
Citer : Posté le 13/09/2012 17:08 | #
Ok, c'est quoi caster? :boulet:
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 13/09/2012 17:47 | #
un caster ,c'est un mage qui canalise le mana comme source de degat
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 13/09/2012 18:20 | #
@Javierxd : exemple de cast
int * pvariable = [green](int*)[/green] malloc (sizeof(int));
a = [green](double)[/green] sqrt(20);
floor(...) ne retourne pas un int, mais un double ( réel), donc il faut rajouter "(int)" juste avant floor(...) pour que le résultat soit un entier de type int.
( ( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_pointcontact[0] +1 ) / 8 )] 0 ) ) || //ici
( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_pointcontact[1] +1 ) / 8 )] 0 ) ) - //ici
( IsKeyDown( KEY_CHAR_4 ) && ( ( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_bmp -1 ) / 8 )] 0 ) ) || //ici
( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_pointcontact[2] -1 ) / 8 )] 0 ) ) ) deplacement( &perso );