Forum Casio - Autres questions


Index du Forum » Autres questions » [Aide SDK] Les erreurs de compilation
PierrotllHors ligneAncien administrateurPoints: 5488 Défis: 41 Message

[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


Pages : Précédente1, 2, 3, 4, 5, 6, 7, 8, 9, ... 26Suivante
PierrotllHors ligneAncien administrateurPoints: 5488 Défis: 41 Message

Citer : Posté le 16/08/2012 08:01 | #


Je vois qu'il y a des interrogations quant aux valeurs affichées dans les fenêtres "Local variables" et "Global variables". Il faut savoir qu'une variable C va souvent être stockée dans un simple registre dans le code compilé, et que ce registre peut être utilisé pour différentes choses, même au sein d'une même fonction. Donc les valeurs affichées dans ces fenêtres sont fiables surtout pour les données stockées en RAM (tableaux, structures ...) et pour les simple variables il ne faut pas les prendre au pied de la lettre, ce n'est valable que dans le bout de code qui utilise la variable.

Dans ton cas précis Limachi, tu initialises une variable à 0 au début de la fonction, puis l'initialise à 1 au début de la boucle. Tu crois que le compilateur va stocker 0 dans un registre et s'interdire de l'utiliser jusqu'au début de la boucle juste pour te faire plaisir ? Non, il optimise. Si la variable ne sert que dans la boucle, alors le registre qu'il va utiliser comme compteur peut être utilisé pour autre chose avant et après. Quand t'as que 16 registres dispo, tu ne les gaspilles pas.
LoulouxHors ligneAncien administrateurPoints: 7035 Défis: 61 Message

Citer : Posté le 16/08/2012 09:24 | #


J'ai souvent remarqué des bizarreries effectivement, la technique consiste à mettre un gros Sleep() dans le bloc, stopper le prog à ce moment-là et regarder.
LimachiHors ligneYoutuberPoints: 2798 Défis: 67 Message

Citer : Posté le 17/08/2012 00:15 | #


Ok, c'est bon, j'ai trouvé mon erreur. (Grave et conne en plus!): je me suis tout simplement gouré entre la récupération d'une liste dans une fonction, et la récupération d'une structure! (j'ai donc mis un * au mauvais endroit), et au lieu de travailler la valeur, je travaillais sur un pointeur, et tout les bugs viennent de la.
Mes Programmes
Cliquer pour enrouler
-en basic: un programme nommé PICFMLIM convertissant une picture en code basic.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed


-mon tuto sur les Str


Mes calto: G25+, G75
Mon minecraft en dévelopement


Projets et Programmes que je soutiens (sur une idée de Marmotti)
Cliquer pour enrouler
-Pokemon Jade de Dodormeur
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

Citer : Posté le 17/08/2012 00:46 | #


Louloux a écrit :

J'ai souvent remarqué des bizarreries effectivement, la technique consiste à mettre un gros Sleep() dans le bloc, stopper le prog à ce moment-là et regarder.

Il va falloir que j'explique comment marche un debugger...
LimachiHors ligneYoutuberPoints: 2798 Défis: 67 Message

Citer : Posté le 17/08/2012 01:02 | #


euh, je sais que ces derniers temps, je vous ai demandé pas mal de code, mais je dois dire que plus j'avance, plus on a des problèmes durs a résoudre:
quelqu'un aurait une fonction qui calcule le point d'intersection de deux segments, j'ai fait la mienne mais elle ne fonctionne pas.
Mes Programmes
Cliquer pour enrouler
-en basic: un programme nommé PICFMLIM convertissant une picture en code basic.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed


-mon tuto sur les Str


Mes calto: G25+, G75
Mon minecraft en dévelopement


Projets et Programmes que je soutiens (sur une idée de Marmotti)
Cliquer pour enrouler
-Pokemon Jade de Dodormeur
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
LoulouxHors ligneAncien administrateurPoints: 7035 Défis: 61 Message

Citer : Posté le 17/08/2012 10:37 | #


Eiyeron a écrit :

Louloux a écrit :

J'ai souvent remarqué des bizarreries effectivement, la technique consiste à mettre un gros Sleep() dans le bloc, stopper le prog à ce moment-là et regarder.

Il va falloir que j'explique comment marche un debugger...


Dans une boucle si tu utilises les pauses tu dois sans arrêt cliquer sur continuer, alors que si tu mets un Sleep() tu arrêtes seulement au tour qui t'intéresse.

Ajouté le 17/08/2012 à 10:38 :
Exemple : la boucle de tir de mon oiseau dans angry birds, je voulais l\'arrêter lorsque l\'oiseau arrivait au bout de l\'écran pour tester les variables.
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

Citer : Posté le 17/08/2012 11:58 | #


Ben non, a encore mieux, les breakpoints. Si tu mets un breakpoint (point rouge à coté du code), le debugger va automatiquement s'arrêter à cet endroit-là et vous pourrez observer tout ce que vous voulez, comme les variables, etc etc...
LoulouxHors ligneAncien administrateurPoints: 7035 Défis: 61 Message

Citer : Posté le 17/08/2012 15:43 | #


Je parlais du breakpoint justement. Dans une boucle c'est relou.
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

Citer : Posté le 17/08/2012 16:11 | #


Et avec une condition...
LoulouxHors ligneAncien administrateurPoints: 7035 Défis: 61 Message

Citer : Posté le 17/08/2012 16:22 | #


Pas con
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 08/09/2012 00:14 | #


J'ai un illegal array reference dans ces deux lignes:

for( y = 0; y <= 7; y++ )
{

for( x = 0; x<= 15; x++ )
{

if( mat_niveau [y] [x] == 1 ) ML_bmp_8_xor( sol, 8 * x, 8 * y ); //ici

if( mat_niveau [y] [x] == -1 ) ML_bmp_8_xor( sortie, 8 * x, 8 * y ); //et ici

}

}


Peut être je me trompe, mais la norme C89 permet de faire ça, non?
Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
P.oHors ligneMembrePoints: 336 Défis: 2 Message

Citer : Posté le 08/09/2012 08:29 | #


Montre la déclaration des trois tableaux stp

PierrotllHors ligneAncien administrateurPoints: 5488 Défis: 41 Message

Citer : Posté le 08/09/2012 11:09 | #


mat_niveau est bien un tableau 2D ? Le problème doit venir de sa déclaration.
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 08/09/2012 13:58 | #


Voici le code qui utilise la matrice:
int AddIn_main(int isAppli, unsigned short OptionNum)
{
    int niveauchoisi = 1;
    int mat_niveau [8] [16] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,
                     1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

    Bdisp_AllClr_DDVRAM();
    menu();
    Bdisp_AllClr_DDVRAM();
    gen_niveau( mat_niveau );



    

    return 1;
}

void gen_niveau( int* mat_niveau )
{
    int x, y;
/*déclaration des bmp représentant les tiles qui
apparaissent dans les niveaux*/
    unsigned char sol[] = {0xFF, 0x99, 0xDB, 0xA5, 0xA5, 0xDB, 0x99, 0xFF};
    unsigned char sortie[] = {0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C};

    for( y = 0; y <= 7; y++ )
    {

        for( x = 0; x<= 15; x++ )
        {

            if( mat_niveau [y] [x] == 1 ) ML_bmp_8_xor( sol, 8 * x, 8 * y );

            if( mat_niveau [y] [x] == -1 ) ML_bmp_8_xor( sortie, 8 * x, 8 * y );

        }

    }

    ML_display_vram(); //affichage des tiles générés dans la boucle précédente


Ajouté le 08/09/2012 à 16:31 :
Oubliez, je l\'ai résolu. Mais maintenant j\'ai un autre problème. J\'ai été en train de regarder l\'exécution du programme avec les breakpoint et tout ça, et je me suis rendu compte qu\'un appel à une fonction est totalement ignoré :
int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;
    int niveauchoisi = 1;
    int **mat_niveau = 0;

    Bdisp_AllClr_DDVRAM();
    menu();
    Bdisp_AllClr_DDVRAM();

    gen_niveau( mat_niveau, niveauchoisi ); //cette ligne est ignorée lors de la exécution


    while( 1) GetKey( &key );
    

    return 1;

Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
Dark stormHors ligneMembre d'honneurPoints: 10765 Défis: 174 Message

Citer : Posté le 08/09/2012 17:02 | #


il y a quoi dans la fonction appelée ?
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 08/09/2012 17:16 | #


void gen_niveau( int **mat_niveau, int niveauchoisi )
{
    unsigned int key;
    int x, y;
/*déclaration des bmp représentant les tiles qui
apparaissent dans les niveaux*/
    unsigned char sol[] = {0xFF, 0x99, 0xDB, 0xA5, 0xA5, 0xDB, 0x99, 0xFF};
    unsigned char sortie[] = {0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C};

    if( niveauchoisi == 1 )
    {
        mat_niveau = malloc( 8 * sizeof( int ) );

        for( y = 0; y<=7; y++ )
        {
            mat_niveau[y] = malloc( 16 * sizeof( int ) );
        }

    }

    for( y = 0; y <= 7; y++ )
    {

        for( x = 0; x<= 15; x++ )
        {

            if( mat_niveau [y] [x] == 1 ) ML_bmp_8_xor( sol, 8 * x, 8 * y );

            if( mat_niveau [y] [x] == -1 ) ML_bmp_8_xor( sortie, 8 * x, 8 * y );

        }

    }

    ML_display_vram(); //affichage des tiles générés dans la boucle précédente
    while( 1) GetKey( &key );
}

Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
Dark stormHors ligneMembre d'honneurPoints: 10765 Défis: 174 Message

Citer : Posté le 08/09/2012 17:23 | #


c'est bizarre
attend Pierrot, t'aura la réponse à ta question
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 08/09/2012 22:16 | #


Ah, non, le problème était que pendant que je testait le prog ligne par ligne j'utilisais step over, qui ne montre pas les fonctions lorsque elles sont appelées. .
Au moins l'allocation dynamique de la matrice je l'ai bien faite, non?
Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
PierrotllHors ligneAncien administrateurPoints: 5488 Défis: 41 Message

Citer : Posté le 09/09/2012 01:26 | #


Ouais, si on oublie le fait que tu n'as pas sécurisé l'allocation (si malloc te retourne NULL ton programme plante).
Il serait beaucoup plus simple et optimisé d'utiliser un tableau 1D pour ta map.
JavierxdHors ligneMembrePoints: 1899 Défis: 13 Message

Citer : Posté le 09/09/2012 03:03 | #


Je tiendrai compte pour la sécurisation de l'allocation.
Pierrotll a écrit :
Il serait beaucoup plus simple et optimisé d'utiliser un tableau 1D pour ta map.

Comment ça?
Calculatrices: g35+usb modifiée, PRIZM

My program is not working, I have no idea why.
My program is working, I have no idea why.

Programmes
Cliquer pour enrouler
PierrotllHors ligneAncien administrateurPoints: 5488 Défis: 41 Message

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].
Pages : Précédente1, 2, 3, 4, 5, 6, 7, 8, 9, ... 26Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 42 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd