Problème de portée des fonctions. [C]

Fermé
lagarkane - 21 juil. 2010 à 23:37
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 juil. 2010 à 22:00
Bonjour,

J'ai créé un projet C avec la SDL dans lequel j'ai 5fichiers.c et autant de headers.

J'ai bien séparé mes différentes fonctions dans mes différents fichiers, par exemple les fonctions d'affichage à part, les threads à part, etc.
Le but étant naturellement de mieux m'y retrouver dans le code.

donc au final, je me retrouves avec:

un fichier main.c contenant:
-les différents includes des librairies standarts
-le #include main.h

un autre fichier.c qui contient l'include de son équivalent en .h
encore un autre fichier.c qui contient l'include de son équivalent en .h
etc...

je suis allé dans code::blocks, j'ai fait tous les Add files qu'il faut et j'ai compilé, et là:

'fonction_x' was not declared in this scope;
'fonction_y' was not declared in this scope;
...
'fonction_machin' was not declared in this scope;

bref, il me fait comme si aucune fonction n'avait été déclarée.

du coup, je tente le coup: je mets tout le contenu de mes fichiers.c et .h dans le main, et je recompile: Ca marche!

Donc la question est: qu'est-ce qui cloche avec la programmation modulaire, chez moi? ^^"

Je vous ai pas mis de code, pk je ne savais pas quoi mettre, et j'allais pas vous balancer tout mon projet, donc si vous avez besoin d'une partie, dites moi quoi, et je vous le mets.

Merci d'avance^^ le dernier projet que j'ai fait, j'ai eu le même problème, et au final j'ai tout fouttu dans un seul et même fichier.c, et franchement, c pas super pratique :p

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 juil. 2010 à 08:41
Les headers inclus dans les fichiers sources doivent contenir à minima l'ensemble des prototypes des fonctions utilisées dans le fichier source. Si tu ne respectes pas cette règle, ton compilateur ralera.
Si tu penses respecter cette règle, merci de poser le code source de :
du fichier contenant la fonction qui appelle fonction_x,
du header contenant le prototype de fonction_x,
et du fichier contenant la déclaration de fonction_x.

Et pour chacun de ces fichiers, n'oublie pas de donner le nom du fichier.

Cdlt,
1
Ok, effectivement, maintenant ca marche =)

En fait, sur le site du zero, Mateo explique qu'il faut un fichier.h pour chaque fichier.c..
J'en avais donc déduit qu'il fallait un .h spécifique à chaque fichier, mais en créant un .h et en y mettant toues les structures et tous les prototypes, ca marche très bien.

Par contre, tous les includes et les defines doivent aussi être dans le .h, sinon ca bug, je suppose que c'est normal.

J'aimerai quand même vous poser une dernière question, hors sujet, mais qui m'intrigue et me pose de gros problèmes :/ :
J'ai créé une fonction de découpe de mes sprites, que voici:

void decouperSpriteTexture(Textures *texture)
{
    int SPRITE_WIDTH, SPRITE_HEIGHT = 70;
    int i = 0;
    for(i = 0 ; i < 3 ;  i++)
    {
        texture->GiftWall[i].x = SPRITE_WIDTH*i;
        texture->GiftWall[i].y = SPRITE_HEIGHT*2;
        texture->GiftWall[i].w = SPRITE_WIDTH;
        texture->GiftWall[i].h = SPRITE_HEIGHT;

        texture->BreakingWall[i].x = SPRITE_WIDTH*i;
        texture->BreakingWall[i].y = SPRITE_HEIGHT*3;
        texture->BreakingWall[i].w = SPRITE_WIDTH;
        texture->BreakingWall[i].h = SPRITE_HEIGHT;
    }
    texture->BreakableWall.x = 0;
    texture->BreakableWall.y = 0;
    texture->BreakableWall.w = SPRITE_WIDTH;
    texture->BreakableWall.h = SPRITE_HEIGHT;;

    texture->NuclearWall.x = SPRITE_WIDTH*3;
    texture->NuclearWall.y = 0;
    texture->NuclearWall.w = SPRITE_WIDTH;
    texture->NuclearWall.h = SPRITE_HEIGHT;

    texture->SolidWall.x = 0;
    texture->SolidWall.y = SPRITE_HEIGHT;
    texture->SolidWall.w = SPRITE_WIDTH;
    texture->SolidWall.h =SPRITE_HEIGHT;

    texture->Ground.x = 0;
    texture->Ground.y = SPRITE_HEIGHT*2;
    texture->Ground.w = SPRITE_WIDTH;
    texture->Ground.h = SPRITE_HEIGHT;
}


J'ai tout controlé des dixaines de fois, ce code est sencé me créer des rectangles parfaitement ajustés pour l'affichage de mes sprites, et pourtant, quand je compile mon projet, il m'affiche aléatoirement un bout du sprite, et c'est jamais le bon!
Mon sprite est un .gif composé de textures de 70*70px, collées les unes aux autres sans espaces, pour faciliter la découpe.
Je sais pas ce qui plante, mais il y a vraiment un gros problème! ^^'
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 juil. 2010 à 22:00
En fait, ce n'est pas forcément un header par fichier source. La règle c'est plutôt un header par bloc fonctionnel à l'instar de stdio.h qui contient les prototypes des fonctions d'entrée/sortie. En pratique, comme on fait aussi un fichier source par bloc fonctionnel, on rejoint la remarque de mateo, bien qu'il s'agit d'un raccourci.

Concernant le code, je ne saurais t'aider, je ne connais pas la SDL.

Cdlt,
0