[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 28/08/2016 12:14 | #
Normalement quand on modifie un header, il faut tout recompiler. Le SDK ne l'a pas fait parce que le fichier d'en-tête n'a sans doute pas été ajouté dans "Files in project" dans ton projet, mais si tu l'ajoutes il renvoie des erreurs inutiles. D'où la remarque.
Citer : Posté le 28/08/2016 12:17 | #
D'accord merci!!! je ferai attention à ça la prochaine fois
Citer : Posté le 29/12/2016 18:42 | #
En tant qu'utilisateur fréquent du sdk je tiens à signaler 3 erreurs :
- L'erreur "illegal token" peut aussi se produire si on déclare une variable autre part qu'au début de sa scope (fonction, condition, boucle). Par exemple :
int test() {
int foo; //fonctionne, la variable est au début
locate(1,1); Print("test");
int bar = 2; //erreur, la variable n'est pas au début, elle est après un appel de fonction
for (int i = 0; i < 2; i++) { //erreur : il faut déclarer i avant
int foobar = 3; //fonctionne, la variable est au début de sa scope qui est le for
}
}
C'est que le sdk qui impose ça, compiler avec gcc ne pose pas ce problème.
- L'erreur (E) Illegal token "" se produit lorsque vous avez oublié une accolade fermante, inutile de chercher un problème d'encodage ou un caractère inexistant.
- L'erreur (E) Illegal character code "EF" se produit lorsque le fichier est enregistré en UTF-8 avec BOM (Byte Order Mark), si vous l'ouvrez à l'éditeur hexa vous devriez voir 3 caractères chelous avant le texte. Enregistrez le en UTF-8 sans BOM ou dans un autre encodage.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/12/2016 20:27 | #
Pour être plus précis, la fonctionnalité de déclaration au milieu du code date du standard C99. Le SDK est bloqué en C89, donc forcément il ne connaît pas. Alors oui, le « int » est un peu inattendu, d'où l'erreur (c'est logique au fond).
Citer : Posté le 29/12/2016 22:37 | #
Ceci dit, c'est tellement crade de déclarer ses variables en milieu de code que bon…
Citer : Posté le 29/12/2016 22:39 | #
It's a matter of opinion.
Non au bikeshed.
Mon blog ⋅ Mes autres projets
leo18 Invité
Citer : Posté le 28/05/2017 21:24 | #
Re-bonsoir tout le monde,
Voilà, avant même de pouvoir écrire ma première ligne de code, voici ce que j'ai en compilant (build) mon programme :
Re-bonsoir tout le monde,
Voilà, petit problème quand j'essaye de compiler (build) pour la première fois sans même inscrire la moindre ligne de code :
set SHC_INC=C:\Program Files\CASIO\OS\SH\include
set PATH=C:\Program Files\CASIO\OS\SH\bin
set SHC_LIB=C:\Program Files\CASIO\OS\SH\bin
set SHC_TMP=C:\Users\Leo\Documents\CASIO\C\test1\Debug
"C:\Program Files\CASIO\OS\SH\bin\shc.exe" -subcommand=C:\Users\Leo\AppData\Local\Temp\hmk18DB.tmp
C:\Users\Leo\Documents\CASIO\C\test1\MonochromeLib.c(1) : C5005 (F) Could not open source file "MonochromeLib.h"
HMAKE MAKE UTILITY Ver. 1.1
Copyright (C) Hitachi Micro Systems Europe Ltd. 1998
Copyright (C) Hitachi Ltd. 1998
ERROR: Process failed with return code: 1
Build was not successful.
Y aurait-il une âme charitable pour m'aider à trouver le problème ??
Citer : Posté le 28/05/2017 21:27 | #
Tu as inclus "MonochromeLib.h" dans ton code source et aussi dans le projet du SDK (à gauche, clic droit "ajouter un header")
leo18 Invité
Citer : Posté le 29/05/2017 20:30 | # | Fichier joint
Oui, j'ai fait ça (voir pièce jointe)
Citer : Posté le 29/05/2017 20:55 | #
A priori ça n'a pas fonctionné : le fichier MonochromeLib.h n'apparaît pas dans la fenêtre de gauche (dans la section «Header files». Essaie de bien faire la manip' que décrit Florian.
Citer : Posté le 24/07/2017 11:52 | #
Bonjour tout le monde !
J'ai une erreur de compilation dont je n'arrive pas à me débarasser et qui m'empêche de progresser dans le jeu que je réalise.
Voici ma bête noire :
** L2300 (E) Duplicate symbol "_barrels" in "C:\...\Debug\main.obj"
Quelqu'un aurait il déjà rencontré cette erreur ?
Merci d'avance !
Citer : Posté le 24/07/2017 12:02 | #
Pour faire court : jamais de définitions de variables et de fonctions dans les headers. Une définition, c'est quand tu crées des données. Par exemple, ça c'est des définitions :
const unsigned char image[] = { /* des choses */ };
void process(void)
{
do_something();
}
Dans les headers, tu n'as droit qu'à des déclarations. Contrairement aux définitions, les déclarations indiquent que la variable existe, mais ne la créent pas. Voici des déclarations associées aux définitions précédentes :
extern const unsigned char image[];
void process(void); /* Pour les fonctions, ça marche tout seul */
Tu dois donc placer les contenus de tes sprites dans un fichier source, que tu ajoutes au projet, et ensuite seulement placer dans un fichier d'en-tête la déclaration des variables utilisées, pour que les autres bouts du ton projet puissent les utiliser. Dans ton cas, ça donne ça :
#include <sprites.h>
const unsigned char barrels[] = { /* ... */ };
const unsigned char barrels_f[] = { /* ... */ };
/* sprites.h */
#ifndef SPRITES_H
#define SPRITES_H
/* Le compilateur saura que barrels et barrels_f existent (mais sont définies ailleurs) et ne se plaindra pas si tu les utilises */
extern const unsigned char barrels[];
extern const unsigned char barrels_f[];
#endif
Citer : Posté le 24/07/2017 12:03 | #
En effet, merci beaucoup pour ta réponse.
Cependant j'ai souhaité procéder autrement en incluant uniquement sprites.h dans le(s) .c que je souhaitais.
J'a simplement oublié de spécifier "static" avant la variable en question
Citer : Posté le 24/07/2017 12:04 | #
Nooon >_<
Bravo, tu viens de probablement consommer deux fois plus de mémoire pour tes sprites que tu n'aurais dû, car tu as créé deux copies de tes données !
Citer : Posté le 24/07/2017 12:08 | #
Oh, d'accord :$
Je pensais justement le contraire...
Citer : Posté le 16/10/2017 22:32 | #
Bonjour j'obtient cette erreur :
L2310 (E) Undefined external symbol "istream::operator >>(float &)" referenced in "C:\Users\shinigami\Documents\CASIO\fx-9860G SDK\Debug\main.obj"
pour ce code
extern "C" {
#include <math.h>
#include <float.h>
#include <stdio.h>
}
#include <iostream>
void main(){
float L[3];
for (int i = 0; i < 3; i++) {
cout<< "donner les coordonner du vecteur"<< endl;
cin>> L[i];
cout<< endl;
}
for (int i = 0; i < 3; i++) {
cout<<' ';
}
}
Merci de m'éclairer.
Citer : Posté le 16/10/2017 22:39 | #
Bonjour, bonsoir,
bien que les flux d'entrée/sortie soient standards, tant en C qu'en C++, CASIO a repris une version de la bibliothèque standard d'Hitachi/Renesas où ceux-ci ne sont pas implémentés. C'est pour cela que tout ce qui est FILE, fopen(), etc, n'existe pas en C, et que tout ce qui correspond aux flux en C++ n'existe pas non plus.
Il n'existe cependant pas de bibliothèque standard pour fx-9860G (de la Graph 85 SD aux Graph 35+E/75+E) offrant un support même minimal aux programmes C++ : c'est énormément de travail, et bien que certains efforts aient été entrepris en ce sens par la communauté, notamment pour le langage C, plus facile à couvrir, ceux-ci n'ont pour l'instant pas abouti.
Il vous faudra donc faire une console manuellement, en utilisant les fonctions spécifiques à la fx-9860G, tels que décrits dans le fichier Libraries.pdf de CASIO (également trouvable dans toute installation du fx-9860G SDK).
Encore désolé !
Mon blog ⋅ Mes autres projets
Citer : Posté le 16/10/2017 22:55 | #
Cakeisalie5 Merci pour ta réponse rapide bien que j'en ai compris que la moitié.
Donc si j'ai bien compris les flux d'entré et sortis en C++ ne fonctionnent pas ? est ce le cas aussi pour le C ?
Ensuite je n'ai pas compris pourquoi je devrais faire une console. Cela veut il dire qu'il y en a pas par défaut comme sur Visual Studio ? Y aurais t'il un exemple pour illustrer comment dois je procédé ?
Merci d'avance
Citer : Posté le 16/10/2017 23:42 | #
Non, pas de console comme tu pourrais en trouver en compilant pour un ordinateur avec la bibliothèque standard. Il va falloir gérer ça à la main comme le disait Cake. En effet, la bibliothèque disponible avec le SDK, à défaut d'implémenter un système d'entrée sortie semblable à ce qui est disponible sur ordinateur, permet tout de même de :
– Récupérer les touches qui ont été pressées par l'utilisateur.
– Afficher du texte (ou autre chose : images, etc) à des endroits précis de l'écran.
Soit finalement de quoi faire quelque chose qui ressemblera à l'interface d'une console sur ordinateur, mais ça reste un peu de travail de mettre ça en place, même en optant pour un fonctionnement simplifié par rapport à une console que tu trouverais sur un PC.
Suivant la teneur du programme que tu souhaites faire, peut-être qu'il n'y a pas besoin d'un système complet de console (avec historique de plusieurs lignes, etc), et peut être un système d'interaction plus rudimentaire fera-t-il l'affaire (par exemple à coup de popups qui s'ouvrent lorsque tu veux afficher un message, ou en réservant une zone de l'écran pour le dernier message, en ayant une fenêtre de saisie qui s'ouvre lorsque tu attends une entrée de l'utilisateur, etc).
Dans ce cas, on dispose de quelques bibliothèques ici qui te faciliteront le travail, je pense par exemple à la bibliothèque EasyInput de Dark Storm (en revanche je ne sais pas ce qu'il en est de son bon fonctionnement dans un projet C++, n'étant pas expérimenté en C++, je ne sais pas trop si il peut y avoir des causes de problème classiques que l'on peut rencontrer ).
Si ça ne te convient pas, je pense qu'il faudra un peu retrousser les manches, et une première étape c'est peut-être de voir à quoi ressemble effectivement la bibliothèque fournie par défaut avec le SDK ; tu pourras trouver un début de réponse sur cette page de notre Wiki.
Citer : Posté le 17/10/2017 06:36 | #
J'ajouterai à ceci que si tu retires nonchalamment les pragmas installées par le SDK et la fonction principale de l'add-in qui se trouve être AddIn_main(), tu ne devrais pas t'étonner que ça ne marche pas (bien que ce soit pour d'autres raisons). Et il faut laisser tout ça dans un bloc de déclarations C sinon le compilateur C++ va tout renommer et ça va être catastrophique (ça va plus compiler et tu sauras pas pourquoi).
Pour la petite histoire, les saletés qui sont derrière le « Please do not change the following source » sont chargées d'initialiser le programme, de vérifier que la RAM statique n'a pas été bourrée au-delà du raisonnable, et ultimement (de façon très probable), de lancer l'add-in.
(PS. Je réponds aux MP, mais pas toujours dans les 30 minutes. Inutile de spammer, le forum est un bien meilleur lieu pour obtenir des réponses rapides de toute façon.)
Citer : Posté le 17/10/2017 20:26 | #
D'accord merci à tout les 2. J'espérais avoir mal compris . En faite à la base c'est un programme qui me permettrais de faire des calcules qui résoudrais mes exercices d'eux même sur le modèle de l'illumination de phong et d'autre exercices similaire. C'est censé être simple à codé en c++ mais s'il faut faire la console et tt ça risque de devenir un peu plus compliqué.
Il va falloir que je me mette à lire la doc. Une dernière question, à part ça est ce que les tableaux sont gérer ?