1

Bonjour,

Je débute en programmation C avec Tigcc, mais j'ai déjà quelques connaissances en programmation.

J'aimerais utiliser une variable dans l'ensemble de mon programme, quel que soit le fichier, la fonction... Il faut bien utiliser un pointeur pour cela non?
C'est en tout cas ce que j'ai compris. Et voici comment je procède:

- Fichier "main.c":
#include "includes.h"
void _main(void) {
initialisation();
}

- Fichier "includes.h":
#include "variables.h"
#include "fonctions_programme.h"

- Fichier "variables.h":
float *camera_x,*camera_y,*camera_z,camerax,cameray,cameraz; // Coordonnées
camera_x=&camerax;
camera_y=&cameray;
camera_z=&cameraz;

- Fichier "fonctions_programme.h":
void initialisation() {
// Camera
*camera_x=0;
*camera_y=0;
*camera_z=180; }

Le problème, c'est que quand je veux tester le programme sur Virtual Ti, Tigcc me sort de nombreuses erreurs:
"Type defaults to int in declaration of camera_x"
"Conficting types for 'camera_x'"
"Previous declaration of 'camera_x'"
"Initialization makes integer from pointer without a cast"
"Initialiser is not computabnle at load time" "Data definition has no type or storage class"

Et cela pour chacune de mes variables.

Bien entendu, je ne vois pas où est mon erreur...

Merci d'avance pour m'aider à résoudre ce problème, et de m'indiquer si l'utilisation des pointeurs est effectivement adaptée à ce que je souhaite faire!
Romain [RVweb.fr]

2

Utiliser les pointeurs ne sert à rien dans ton cas.
Tu peux utiliser les variables camerax/y/z directement puisqu'elles sont globales.
En dehors de toute fonction, tu ne peux que faire des déclarations de variables globales (comme ce que tu fais avec la première ligne de variables.h), donc les lignes 2,3,4 de variables.h ne sont pas correctes puisqu'il s'agit d'une opération d'affectation.

Par ailleurs, je te déconseille de mettre du code dans des fichiers .h (comme fonctions_programme.h par exemple). Un header est fait seulement pour faire des déclarations. Il sert à interfacer des fichier .c entre eux.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

Donc pour définir mes fonctions, j'utilise plutôt un fichier .c?
Et sinon les variables globales seront accessibles même dans les fonctions d'autres fichiers que main.c?
Romain [RVweb.fr]

4

Oui.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

J'ai essayé de faire comme vous me l'avez suggéré: avec des variables globales. Donc je déclare mes variables et mes fonctions dans un fichier declarations.h, et je les définit dans de fichiers.c séparés.
Le problème, c'est que si j'inclue declarations.h dans ces fichiers, il me dit qu'il y a des déclarations multiples, et sinon que les déclarations sont implicites.
Comment faire alors pour déclarer toutes mes fonctions et variables dans un fichier .h et les définir dans des fichiers .c séparés?
Romain [RVweb.fr]

6

trifus ...
NTW !!!!!

7

si tu declare dans un fichier .h un truc comme ca :
int a;

ds un fichier .c tu fais
#include declaration.h
a=3;


NTW !!!!!

8

./Post de départ >> essai de mettre dans fonctions__programme.h #include variables.h
euh...

9

>> fichier.h
extern int variable;

>> fichier_avec_la_variable.c
#include "fichier.h"
int variable;

... /* utilisation de variable */
>> autres_fichiers.c
#include "fichier.h"

... /* utilisation de variable */
Enfin, sauf si y'a des particularités de tigccdont je n'ai pas connaissance.

Explication: la déclaration du fichier.h est inclue dans tous les autres fichiers. Si on met juste "int variable", il va donc y avoir autant de fois "variable" que tu as de fichiers sources. Le mot clef extern précise qu'il ne faut pas créer la variable, parce qu'elle existe déjà ailleurs, ce qui est bien ce qu'on cherche à faire. Encore faut-il que cette variable existe bien ailleurs, c'est pour ça qu'on rajoute "int variable" dans l'un des fichiers C.

10

Si je met '#include "includes.h"' dans plusieurs fichiers .c, il me les déclare plusieurs fois.
Donc en fait dans dans mon fichier includes.h je dois déclarer toutes les variables avec 'extern', et dans main.c je dois à nouveau les déclarer mais sans 'extern'? Cela ne me paraît pas très pratique...
Ce que j'ai fait, c'est déclarer mes fonctions et variables dans includes.h sans 'extern', puis je les ai définies dans d'autres fichiers .h que j'inclue également dans main.c (il n'acceptait pas de m'inclure des fichiers .c donc je les ai mis dans des fichiers .h). Je crois que ça marche.

Et sinon j'ai utilisé les variables globales, comme me l'avait indiqué Sasume, cela fonctionne très bien.
Romain [RVweb.fr]

11

rvweb
Si je met '#include "includes.h"' dans plusieurs fichiers .c, il me les déclare plusieurs fois.

Normalement non, c'est là l'intérêt du fichier d'entête: utiliser une seule et même variable dans différents fichiers .c
rvweb
Donc en fait dans dans mon fichier includes.h je dois déclarer toutes les variables avec 'extern', et dans main.c je dois à nouveau les déclarer mais sans 'extern'? Cela ne me paraît pas très pratique...


Pourtant spectras te donnes une méthode souvent utilisée (regarde les sources de Venus, sur le forum Software)
rvweb
Et sinon j'ai utilisé les variables globales, comme me l'avait indiqué Sasume, cela fonctionne très bien.


Fais attention, si ton programme n'est ni archivé ni compressé, les variables globales gardent leur valeur entre deux lancements de ton programme...

12

D'accord, merci pour ces conseils. Je vais continuer mon programme et voir comment je pourrai l'améliorer ensuite.
Romain [RVweb.fr]