Se connecter

Informatique

Programmation

Sujet : Faire une variable globale en C, c'est grave ?
1
Pseudo supprimé
Niveau 8
21 avril 2019 à 15:16:37

Salut,
Je code en C en se moment et pour un de mes programmes c'est beaucoup plus simple de faire une variable globale plutôt que de passer par des locals dans les fonctions....
C'est vraiment treeeeeees grave ou sa peut passer de faire ça ?

no_lift_69
Niveau 10
21 avril 2019 à 15:38:52

donne l'exemple

Pseudo supprimé
Niveau 8
21 avril 2019 à 16:02:00

C'est assez complexe, en gros je code avec la sdl j'ai une boucle whille qui sert de boucle de gameplay au jeu.
Et dans cette boucle il y a une fonction qui sert a vérifié l'event en cours et dans cette fonction si je crée des variables elles seront réinitialiser à chaque itération de la boucle.
Donc j'ai fait passer un de mes variable en globale pour " pas me faire chié"

no_lift_69
Niveau 10
21 avril 2019 à 16:27:21

mmmouai

F-Bardamu
Niveau 10
21 avril 2019 à 18:56:15

Pour le coup ça a pas l'aire très compliqué de passé le paramètre de ta fonction par référence.
Juste une petite histoire de pointeur

MrAnge
Niveau 10
21 avril 2019 à 19:46:03

sinon les variables qui ne doivent pas être réinitialiser à chaque fois que tu rentre dans ta fonction tu les déclares en static

ça permet d'initialiser une seul et unique fois ta variable au lancement du programme et ensuite elle resterons à leur valeur en sortie de fonction

MrAnge
Niveau 10
21 avril 2019 à 19:52:53

Ah bah je peut plus editer :snif:

Je tient a dire que les variables global sont à évité car tu peut vite te retrouver a ne plus savoir où ta variable à été modifier pour la dernière fois et en cas de bug tu vas vouloir debugger, et la les vrais problème commence si ton code est un peu complexe et un peu long, car tu vas passer des heures à chercher où est modifier ta variables et quelle fonction fait que sa déconne

blackapplex
Niveau 10
21 avril 2019 à 19:55:34

C'est vraiment treeeeeees grave ou sa peut passer de faire ça ?

Ca n'a rien de grave, il faut simplement comprendre pourquoi tu le fais, pourquoi c'est plus génant de faire autrement, et qu'est-ce que ça implique en terme de mémoire, de restructuration s'il fallait s'en passer, est-ce que c'est possible que t'ais à le faire pour une prochaine variable, puis une autre, puis une autre? etc.

La programmation nous permet de faire plein de chose, aucune n'est mauvaise par défaut, l'important c'est de comprendre.

EsclaveFoodora
Niveau 8
21 avril 2019 à 20:09:55

Les variables globales sont à bannir, excepté dans le cas où elles sont nécessaire et où on peut pas faire sans :(

Si c'est un petit prog d'entrainement ça va, y a pas mort d'homme, mais si tu peux trouver une solution sans, essaye, ça te fera bosser en plus la syntaxe du C :ok:

godrik
Niveau 22
21 avril 2019 à 21:48:35

De facon general, la question d'utiiser des variables globales ou non est une question d'ingenirie logicielle.
Quand une variable est lobale, elle devient accessible de partout. Ca veut dire qu'il devient plus difficile de traquer de qui va changer cette variable ou ce qui ne va pas la changer. Ca veut dire que les fonctions qui l'utilisent sont sensibles aux effet de bords. Ca les rends plus difficile a debugger par exemple.

Est ce que ca veut dire qu'il ne faut jamais les utiliser? Pas forcement. Mais si il y a une facon simple de s'en passer, il est preferable de s'en passer. En d'autre terme, a mon sens, il faut une raison solide pour les utiliser.

De facon general dans mes cours, les etudiants qui utilisent des variables globales sans bonne raison perdent des points dans la categorie "ingenierie logicielle".

Sidomaster
Niveau 6
25 avril 2019 à 02:26:05

Ton sujet t'interdit les variables globales ?

Au pire go singleton ! :cute:

89ron
Niveau 10
25 avril 2019 à 09:15:28

Singleton en C ? rendors-toi...

Sidomaster
Niveau 6
25 avril 2019 à 11:24:34

Le 25 avril 2019 à 09:15:28 89ron a écrit :
Singleton en C ? rendors-toi...


int SingletonEnC() {
     // La variable static sera défini au premier appel (ensuite cette ligne est skippé)
     static int instance = 42;
     // Renvoie de la var
     return instance;
 }

Tu mets la variable en static dans une fonction et tu l'a récupères quand tu en a besoin par un appel (on est d'accord c'est un peu moins opti car il y a le coût de l'appel)
Tu peux aussi faire ça avec des pointeurs, struct, etc.

Les singletons en c existent... :cute:

lokilok
Niveau 10
25 avril 2019 à 11:28:51

C'est pas un singleton ça, c'est une globale constante.

MrAnge
Niveau 10
25 avril 2019 à 12:45:31

Bon c'est plus vraiment le sujet mais ça m’intéressais d'essayé ce singleton en C, et je dirais que du coup ça devrais ressembler à ceci :

int *SingletonEnC()
{
	static int instance = 42;
	
	return &instance;
}

int main(void) {
	// your code goes here
	int *toto = 0;
	
	toto = SingletonEnC();
	
	*toto = 53;
	
	printf("%ld", *SingletonEnC());
	
	return 0;
	
}

Sans ce post j'y aurais jamais pensé (bon après tous j'ai jamais eu besoin de singleton en C) m'enfin sa reste intéressant :hap:

lokilok
Niveau 10
25 avril 2019 à 13:17:24

C'est pas parce que tu mets ta variable globale dans une fonction que ça en devient un singleton, un singleton c'est une classe que tu ne peux instancier qu'une fois, je vois pas trop le rapport dans ce cas là.

MrAnge
Niveau 10
25 avril 2019 à 13:30:02

le fait de mettre la variable en static fait qu'elle ne s'instancie qu'une seule et unique fois.

Le fait de passer l'adresse de la variable en retour de fonction permet de la récupérer et de la setter en dehors.

sachant que la on a pris l'exemple avec une variable toute simple mais tu pourrais très bien retourner l'adresse d'une structure

si jamais tu as envie tu peut essayé le morceau de code que j'ai mit plus haut sur ideone.

Pour moi un singleton n'as vraiment d’intérêt que pour une classe (permettre l'appel à des méthode en gérant les donnés dans une seul et unique instance pour éviter de te retrouver avec des incohérence).
Donc en C aucun intéret je suis bien d'accord, enfin on pourrais toujours pousser le truc pour rajouter des pointeurs sur fonction dans l'instance du "Singleton" mais la c'est plus de mon niveau :hap:

lokilok
Niveau 10
25 avril 2019 à 19:01:55

le fait de mettre la variable en static fait qu'elle ne s'instancie qu'une seule et unique fois.

Oui mais encore une fois c'est pas ça un singleton, le but d'un singleton c'est de pouvoir avoir une seule instance d'une classe, d'un type si tu veux, là ton int tu peux en déclarer autant que tu veux ce que tu as fais n'y change rien, et si ça avait été une structure à la place d'un int ça aurait été pareil tu aurais quand même pu l'instancier autant de fois que tu veux.

Là c'est juste une globale que tu as.

MrAnge
Niveau 10
25 avril 2019 à 19:11:01

Le 25 avril 2019 à 19:01:55 lokilok a écrit :
Oui mais encore une fois c'est pas ça un singleton, le but d'un singleton c'est de pouvoir avoir une seule instance d'une classe, d'un type si tu veux, là ton int tu peux en déclarer autant que tu veux ce que tu as fais n'y change rien, et si ça avait été une structure à la place d'un int ça aurait été pareil tu aurais quand même pu l'instancier autant de fois que tu veux.

Là c'est juste une globale que tu as.

Je pense que je comprend ce que tu veux dire. Par contre je comprend pas comment tu pourrais le mettre en oeuvre, est ce que tu aurais un morceau de code (relativement simple) qui permettrait d'instancier deux fois la variables ?

Edit : parce que la le problème c'est qu'on aurais pas de constructeur privé. Par contre y'a pas de class en C ce ne sont que des fonctions donc on fait des appels pas des instanciations, c'est la où du coup j'ai du mal à comprendre pourquoi on pourrais instancié deux fois la variable dans la fonction.

lokilok
Niveau 10
25 avril 2019 à 19:12:26

Bah tu déclares un int ailleurs et pouf t'as une nouvelle instance, ton int est pas un singleton.

1
Sujet : Faire une variable globale en C, c'est grave ?
News culture
La Planète des Singes : Le Nouveau Royaume - la révolution simienne est en marche !
   Retour haut de page
Consulter la version web de cette page