Programmation en C

Résolu/Fermé
Utilisateur anonyme - 2 avril 2011 à 20:53
 Utilisateur anonyme - 10 avril 2011 à 16:14
Bonjour,

je voudrai savoir si c'est possible de modifier un define au cours d'un programme ? Si oui comment faire ?

merci

2 réponses

Il me semble que ce n'est pas possible. La plupart des compilateurs vont afficher "ERREUR : redéfinition de macro" ou un message équivalent.
D'un coté c'est logique : si on définit deux marcos avec le même nom, comment le compilateur sait-il laquel utiliser.
0
moi enfete c'est juste redefinir sa valeur car j'ai ce bout de code la mais je ne peux pas mettre de variable a la fonction system alors je penser au define mais comme sa ne marche pas :

do
{
printf("Entrez le nombre de secondes avant l'extinction : ");
scanf("%d", &delai);

if(delai < 0 || delai > 315360000)
{
printf("Entrez un nombre de secondes entre 0 (arret immediat) et 315360000 (10 ans)\n\n");
}
}while(delai < 0 || delai > 315360000);

VALEUR = delai;

system("shutdown -s -t VALEUR");
}
0
Il y a des fautes d'orthographes et de grammaire.

delai est une variable. Tu ne peut pas définir un "define" avec une variable! Le define est généré lors de la compilation.

Uilise sprintf ou des fonctions plus au point niveau sécurité si tu as. Tu passe ensuite un pointeur sur la commande dans system.

L'usage de la fonction system est à proscrire si c'ets un programme sérieux en raison des nombreuses failles de sécurités qu'elle contient.

Un dernier truc fait attention au type de variable de delai qui, si c'est un int ou un long ne dépassera jamais 315360000.
0
Tu peux aussi utiliser
#undef 

puis un nouveau define pour changer la valeur.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
10 avril 2011 à 13:03
Cela ne résoudra pas son problème puisque les macros marchent en précompilation pas à l'exécution.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
6 avril 2011 à 22:18
Bonjour,

Ce n'est pas un comportement standard.
Par contre vous pouvez tout simplement utiliser une variable, une chaîne de caractère, concaténer les deux avec sscanf et l'injecter dans system().
Encore mieux, ne pas utiliser system() mais plutôt utiliser l'API.

Cdlt,
0
pouvez vous me dire comment utiliser l'API (je ne sais pas ce que c'est) et comment on concaténer avec un sscanf et l'injecter ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
7 avril 2011 à 22:12
Quand on ne sait pas, il y a wiki :-) : https://fr.wikipedia.org/wiki/Windows_API
Pour éteindre la machine avec les API sur windows : https://docs.microsoft.com/en-us/windows/win32/shutdown/how-to-shut-down-the-system?redirectedfrom=MSDN (c'est plus long mais plus efficace et plus propre).
Sinon pour la concaténation avec sprintf (pas sscanf, erreur de ma part), il suffit de mettre :
char chaine[32];
int valeur=5;
sprintf(chaine,"%s %d","shutdown -s -t ", valeur);
system(valeur);

Cdlt,
0
correction de la concaténation :

char chaine[32];
int valeur = 5;
sprintf(chaine, "shutdown -s -t %d", valeur);
system(chaine);

mais merci a toi quand meme
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
9 avril 2011 à 22:44
Pourquoi dis-tu correction de la concaténation alors que la concaténation est bonne ? oO.
Par contre, effectivement c'est bien system(chaine) et non system(valeur);
Mais je continue de dire que c'est mieux d'utiliser les api sur windows que system.
0
Utilisateur anonyme
9 avril 2011 à 23:23
desoler pour "correction de la concaténation" mais sinon moi ça marche avec sa :
sprintf(chaine, "shutdown -s -t %d", valeur);
et en plus je comprend mieux quand c'est comme ça

sinon pour les API je vais mis mettre mais un peu plus tard
0