Programmation en C

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
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

  1. Antoine
     
    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
    1. Utilisateur anonyme
       
      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
    2. Antoine
       
      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
    3. Antoine
       
      Tu peux aussi utiliser
      #undef 

      puis un nouveau define pour changer la valeur.
      0
    4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Cela ne résoudra pas son problème puisque les macros marchent en précompilation pas à l'exécution.
      0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
    1. Utilisateur anonyme
       
      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
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    3. Utilisateur anonyme
       
      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
    4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    5. Utilisateur anonyme
       
      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