Trouver un petit compilateur C

Résolu/Fermé
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 8 févr. 2013 à 11:40
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 8 févr. 2013 à 18:01
Bonjour,

Je ne suis pas étranger à la programmation avec divers langages mais je n'ai pas développé sous C ni C++. Je suis sous Windows XP SP3 et je cherche un petit compilateur C (genre Small C qui existait avant) pour me faire un tout petit exécutable se contentant, selon le paramètre passé (-d ou -f) d'enregistrer dans un fichier donné la date et l'heure (de début et de fin) dans le genre :

D: 12/01/2013, 08:30:17 - F: 12/01/2013, 18:30:34
D: 13/01/2013, 08:46:03 - F: 13/01/2013, 19:32:18
etc...

Pas besoin d'interface graphique. C'est juste l'exécution d'une commande qui n'envoie rien sur l'écran.

Qui pourrait m'aider à trouver ce petit compilateur de base qui n'a pas besoin des bibliothèques Windows mais qui devra fonctionner sur Win32

Merci beaucoup pour vos réponses

A voir également:

2 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 8/02/2013 à 12:17
Salut heliconius,

Dans le genre petit tu as TCC de Fabrice Bellard.

https://bellard.org/tcc/

L'exécutable tcc.exe, avec le répertoire include et lib tiennent en 800 ko dans la dernière version disponible.

Avec ses options par défaut, il compile ceci :

#include <stdio.h>  

int main()  
{  
  printf("Hello world\n");  
  return 0;  
}

sous la forme d'un .exe de 2 ko.

Apparemment, TCC n'est plus maintenu cependant.

Pourquoi veux tu un "petit compilateur" ?


Dal
0
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 140
8 févr. 2013 à 13:12
En fait j'aimerais un exécutable genre "horodate.exe" qui, lancé automatiquement au démarage tel que "horodate -d", inscrirait :

D: 08/02/2013, 10:32:18
dans un fichier "usage.txt"

Pour éteindre mon PC, une icône sur mon bureau lancerait un batch contenant :
horodate -f
shutdown

de façon à rajouter au fichier "usage.txt"

D: 08/02/2013, 10:32:18 - F: 08/02/2013, 21:35:12
Mais comme je ne veux pas que ça me gêne lors de l'utilisation, je n'ai pas envie de fenêtres DOS qui s'ouvriraient à cause d'une écriture sur la console. Le programme irait chercher la date et heure et l'inscrirait dans un fichier. C'est tout. Il n'y a pas besoin d'un compilateur dernier cri pour bâtir des applications Windows. Juste ça. C'est la raison de l'adjectif "petit"

En tout cas merci pour ta réponse, je vais aller voir et viendrai en faire une ici.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
8 févr. 2013 à 13:58
Re,

Si la taille du compilateur n'est pas un critère pour toi, tu devrais plutôt installer quelque chose comme Codeblocks avec le compilateur MinGW, qui te permettra d'avoir un EDI, avec un débogueur, et qui est un environnement plus sympa si tu débutes en C que la ligne de commande et l'éditeur de texte.

www.codeblocks.org
http://www.codeblocks.org/downloads/26
choisis "codeblocks-12.11mingw-setup.exe" pour te procurer la version embarquant le compilateur MinGW.

MinGW est le portage de GCC sous Windows.

Tu peux faire du C, comme du C++, du Windows si tu veux. C'est convivial, cela marche bien et c'est maintenu :-)


Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 8/02/2013 à 14:08
Note : tu dis je n'ai pas envie de fenêtres DOS qui s'ouvriraient à cause d'une écriture sur la console

J'ai bien peur que tu doives dans ce cas faire une application Windows, car les applications "Console" vont ouvrir une console (qui s'affichera et se refermera très vite), même si elle n'affichent rien.

Ton application Windows n'a cependant pas à avoir d'interface.

Tu crées avec le wizard Codeblocks un projet "Win32 GUI project", et tu ne gardes que :

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)  
{  
    return 0;  
}

et rien d'autre (hormis les entêtes nécessaires à la compilation, bien sûr).

Une fois compilé, ton programme n'affichera rien (et ne fera rien, dans ce cas, d'ailleurs :-).

Le wizard de Codeblocks crée par défaut un projet C++.

Tu peux le changer en C en suivant les indications figurant ici : https://forums.commentcamarche.net/forum/affich-27088736-probleme-avec-l-installation-sdl-avec-le-c#1


Dal
0
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 140
Modifié par heliconius le 8/02/2013 à 15:16
Merci beaucoup pour tes infos. Puis-je te contacter en privé ? (je n'ai pas envie de polluer ce forum) Merci.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
8 févr. 2013 à 15:36
Le forum est là aussi pour aider les personnes rencontrant des problèmes similaires aux tiens.

Si nous échangeons en privé, cet objectif n'est pas rempli :-)

Cela dit, en principe, je ne refuse pas de répondre.


Dal
0
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 140
Modifié par heliconius le 8/02/2013 à 16:41
Ben voilà:

#include <stdio.h>    
#include <time.h>  

const char * Jour[] = {"Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"};  

int main(int argc, char *argv[])    
{    
  time_t timestamp;  
  struct tm * t;  
   
  timestamp = time(NULL);  
  t = localtime(&timestamp);  

  if(argc<2)  
    {  
      /* s'il n'y a pas d'argument */  
      printf("%s\n", "============================================");  
      printf("%s", "Arrêt prolongé a/c du ");  
      printf("%s %02u/%02u/%04u %02u:%02u:%02u\n", Jour[t->tm_wday], 1+t->tm_mday, 1+t->tm_mon, 1900 + t->tm_year, t->tm_hour, t->tm_min, t->tm_sec);  
      printf("%s\n", "============================================");  
    }  
  else  
    {  
      if(argv[1]=="-d") {  
         printf("%s %02u/%02u/%04u %02u:%02u:%02u ", Jour[t->tm_wday], 1+t->tm_mday, 1+t->tm_mon, 1900 + t->tm_year, t->tm_hour, t->tm_min, t->tm_sec);  
      }  
      if(argv[1]=="-f") {  
         printf("- %s %02u/%02u/%04u %02u:%02u:%02u ", Jour[t->tm_wday], 1+t->tm_mday, 1+t->tm_mon, 1900 + t->tm_year, t->tm_hour, t->tm_min, t->tm_sec);  
      }  
      if(argv[1]=="-h") {  
         printf("%s\n", "horodate    : Enregistre Arrêt prolongé a/c du <date système>");  
         printf("%s\n", "horodate -d : Enregistre la <date système> de début");  
         printf("%s\n", "horodate -f : Enregistre la <date système> de fin");  
         printf("%s\n", "NB: Enregistrements dans le fichier 'usage.txt' du répertoire courant");  
      }  
    }  

  return 0;  
}


Pour tester l'argument argv[1], si je fais
printf("%s\n", argv[1]);
ça me l'écrit en me prouvant qu'il a été pris en compte. Mais si je fais
switch(argv[1]) {  
  case '-d' : blablabla; break;  
  case '-f' : blablabla; break;  
  case '-h' : blablabla; break;  
}
ça me génère une erreur : constant expression expected
alors, je change en moins élégant, par la succession de if()
if(argc<2)        { blablabla; }  
if(argv[1]=='-d') { blablabla; }  
if(argv[1]=='-f') { blablabla; }  
if(argv[1]=='-h') { blablabla; }
ça ne génère pas d'erreur, ça m'affiche ce que je veux lorsqu'il n'y a pas d'argument (les écritures dans un fichier, on verra plus tard) mais ça ne m'affiche rien si un argument est fourni. :(

C pas facile !

NB: c'est compilé avec TCC.
Cela dit, TCC : 281 Ko ; Codeblocks que j'ai téléchargé mais pas encore installé : 98 Mo !
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 8/02/2013 à 17:29
switch / case ne permet pas la comparaison sur des chaînes; Il faudrait comparer sur un char éventuellement.

Pour que le if fonctionne sur une comparaison de chaînes, il faut que tu fasses ... une comparaison de chaînes en C.

Cela se fait avec la fonction strcmp présente dans l'entête string.h, pas avec l'opérateur d'égalité.

Donc, tu ajoutes string.h à ton code et tu fais, par exemple :

if (strcmp(argv[1], "-d") == 0)

Vois http://www.cplusplus.com/reference/cstring/strcmp/


Dal
0