Outils pour utilisateurs

Outils du site


exercices:debut

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
exercices:debut [10/10/2019 09:11]
webmestre [TP5]
exercices:debut [18/09/2020 15:05] (Version actuelle)
webmestre
Ligne 27: Ligne 27:
  
 Utilisez les entêtes : Utilisez les entêtes :
 +
 <code c> <code c>
 #include <​stdio.h>​ #include <​stdio.h>​
Ligne 32: Ligne 33:
 #include <​stdlib.h>​ #include <​stdlib.h>​
 #include <​linux/​byteorder/​little_endian.h>​ #include <​linux/​byteorder/​little_endian.h>​
 +
 </​code>​ </​code>​
  
-Même un source C peut être compilé avec "​g++"​ (pour pourvoir ​utiliser la syntaxe ANSI-C).+Même un source C peut être compilé avec "​g++"​ (pour pouvoir ​utiliser la syntaxe ANSI-C).
  
 Regardez la documentation des fonctions : Regardez la documentation des fonctions :
 +
 <code c> <code c>
        FILE *fopen(const char *path, const char *mode);        FILE *fopen(const char *path, const char *mode);
Ligne 44: Ligne 47:
        ​size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);        ​size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        int fprintf(FILE *stream, const char *format, ...);        int fprintf(FILE *stream, const char *format, ...);
 +
  
 </​code>​ </​code>​
  
-{{:​exercices:​minixstructure.c|}}+{{:​exercices:​minixstructure.c|minixstructure.c}}
  
-{{:​exercices:​td2.minixfs.zip|}} +{{:​exercices:​td2.minixfs.zip|td2.minixfs.zip}}
- +
-Pour voir le fichier en hexadécimal utilisez emacs et la commande : M-x hexl-mode //(Esc-x suivi de hexl-mode)//​+
  
 +Pour voir le fichier en hexadécimal utilisez emacs et la commande : M-x hexl-mode //(Esc-x suivi de hexl-mode)//​ ou "od -x td2.MinixFS"​ ou "xxd td2.MinixFS"​
  
 Exemple de code c Exemple de code c
 +
 <code c> <code c>
 #include <​stdio.h>​ #include <​stdio.h>​
Ligne 61: Ligne 65:
 int int
 main (int argc, char** argv, char** envp) { main (int argc, char** argv, char** envp) {
- fprintf (stdout, "Hello World\n"​);​ +    ​fprintf (stdout, "Hello World\n"​);​ 
- return 0;+    return 0;
 } }
 +
 </​code>​ </​code>​
  
 Exemple de compilation Exemple de compilation
 +
 <code bash> <code bash>
 $ gcc test.c $ gcc test.c
 $ ./a.out $ ./a.out
 +
 </​code>​ </​code>​
  
Ligne 78: Ligne 85:
 int int
 main (int argc, char** argv, char** envp) { main (int argc, char** argv, char** envp) {
- FILE *file = fopen (argv[1], "​r"​);​+    ​FILE *file = fopen (argv[1], "​r"​);​
  
- for (int i = 2; i < argc; i++) { +    ​for (int i = 2; i < argc; i++) { 
- int adresse; +        int adresse; 
- sscanf (argv[i], "​%x",​ &​adresse);​ +        sscanf (argv[i], "​%x",​ &​adresse);​ 
- fprintf (stdout, "​convert 0x%x = %d\n", adresse, adresse); +        fprintf (stdout, "​convert 0x%x = %d\n", adresse, adresse); 
-+    
- return 0;+    return 0;
 } }
 +
 </​code>​ </​code>​
  
Ligne 92: Ligne 100:
 $ gcc test.c $ gcc test.c
 $ ./a.out td2.minixfs 0x20 0x40 $ ./a.out td2.minixfs 0x20 0x40
 +
 </​code>​ </​code>​
  
Ligne 105: Ligne 114:
 int int
 main (int argc, char** argv, char** envp) { main (int argc, char** argv, char** envp) {
- FILE *file = fopen (argv[1], "​r"​);​ +    ​FILE *file = fopen (argv[1], "​r"​);​ 
- fseek (file, 0x1000, SEEK_SET);+    fseek (file, 0x1000, SEEK_SET);
  
- int n = 3; +    ​int n = 3; 
- struct S tab [n];+    struct S tab [n];
  
- fread (tab, sizeof (struct S), n, file);+    ​fread (tab, sizeof (struct S), n, file);
  
- for (int i = 0; i < n; i++) +    ​for (int i = 0; i < n; i++) 
- fprintf (stdout, "a: 0x%x b: 0x%x\n",​ tab[i].a, tab[i].b);​ +        fprintf (stdout, "a: 0x%x b: 0x%x\n",​ tab[i].a, tab[i].b);​ 
- return 0;+    return 0;
 } }
 +
 </​code>​ </​code>​
 +
 +===== Mise au point =====
 +
 +Il existe un outil de mise au point des programmes écrits en C ou C++ : **gdb**.
 +
 +Il faut au préalable avoir compilé le vôtre avec l’option “**-g**”. Au moment de l’exécution,​ faîtes précéder la commande shell de “gdb - -args”.
 +<code bash>
 +gdb --args ./a.out A B C D
 +
 +</​code>​
 +
 +Voici quelques commandes :
 +
 +  * Vous pouvez placer un point d'​arrêt avec "​**break** ​ args.cpp:​6"​
 +  * Attendre le prompt gdb et saisissez “**run**”.
 +  * La commande “**where**” permet de savoir où l’on se trouve dans la pile d’exécution.
 +  * La commande “**frame** ​ n” permet de se placer dans la pile d’exécution.
 +  * Il est possible d’afficher des valeurs des variables avec la commande “**print**”.
 +
 +<WRAP center round tip 60%> Toutes ces actions peuvent être réalisées sous emacs:
 +
 +  * M-x shell : ouvre un terminal
 +  * M-x compile : lance une compilation avec un lien direct avec les erreurs
 +  * M-x gdb : lance la mise au point et l'​observation d'un programme
 +
 +</​WRAP>​
 +
  
  
exercices/debut.1570691482.txt.gz · Dernière modification: 10/10/2019 09:11 par webmestre

Outils de la page