tama Admin
Nombre de messages : 12376 Age : 32 Localisation : DTC ? :triso: Humeur : =) items : o Personalized field : huh ? oO Réputation : 3 Points : 9434 Date d'inscription : 08/08/2007
Profil TI: 84+, 89 tita, 89 tita TO: infini :p Spécialité: C 68k
| Sujet: [C] VAT : application du cours Mer 25 Juin 2008, 00:05 | |
| Bah voilà, la théorie c'est bien beau, mais sans exemple on avance pas trop en général. C'est un tutorial très court, qui sert d'application à ce qui a été dit auparavant. Le but du programme qu'on va étudier est de donner la liste de tous les programmes de tous les dossiers sur la calculette, et de donner leur taille et le type de fichier (texte, programme, ASM ...) Normalement, si vous avez bien suivi le cours, il ne devrait y avoir aucune difficulté. Allons-y !
Voici donc le code de notre programme : - Citation :
#include < tigcclib.h >
void _main(void) { ........LCD_BUFFER bufr; ........LCD_save(bufr); ........clrscr();
........SYM_ENTRY *sym = SymFindFirst(NULL, FO_RECURSE);
........short s, key; ........HANDLE handle; ........char *ptrFILE, *end; ........unsigned char type; ........char type_str[10]; ........unsigned short size;
........while(sym) ........{ .................s = sym -> flags.bits.folder;
.................if (!s) .................{ .........................handle = sym -> handle; .........................ptrFILE = HeapDeref(handle); .........................size = *(unsigned short*)ptrFILE + 2; .........................end = ptrFILE + size - 1; .........................type = *(unsigned char*)end;
.........................switch(type) .........................{ ........................................case 0x2D: ...................................................strcpy(type_str,"STRING"); ...................................................break;
........................................case 0xDB: ..................................................strcpy(type_str,"MATRIX"); ..................................................break;
........................................case 0xDC: ..................................................strcpy(type_str,"FUNCTION"); ..................................................break;
........................................case 0xDD: .................................................strcpy(type_str,"DATA"); .................................................break;
........................................case 0xDE: .................................................strcpy(type_str,"GDB"); .................................................break;
........................................case 0xDF: .................................................strcpy(type_str,"PICTURE"); .................................................break;
........................................case 0xE0: .................................................strcpy(type_str,"TEXT"); .................................................break;
........................................case 0xF3: .................................................strcpy(type_str,"ASM PRGM"); .................................................break;
........................................case 0xF8: .................................................strcpy(type_str,"OTHER"); .................................................break; .........................}
.........................printf(" FILE : %s\n...SIZE : %u\n...TYPE : %s [%i]\n",sym->name,size,type_str,type); .................} .................else .................{ .........................printf("FOLDER : %s\n",sym->name); .................}
.................key = ngetchx();
.................if (key == KEY_ESC) .................{ .........................LCD_restore(bufr); .........................exit(0); .................}
.................sym = SymFindNext(); ........}
........LCD_restore(bufr); }
Et voilà ! - Citation :
Oui, mais encore ? -__-'
Patience, j'vais expliquer, mais y a pas grand-chose de nouveau, vous devriez à ce stade être capable de comprendre comment ça fonctionne "en gros" Bon, allons-y : Tout d'abord : - Citation :
........LCD_BUFFER bufr; ........LCD_save(bufr); ........clrscr();
Ces lignes servent à créer un "buffer écran", c'est un peu comme un tableau de taille très grande, correspondant à l'écran (de mémoire 3840 éléments pour la TI89), qui sert à sauvegarder l'état de l'écran ensuite ( LCD_save(bufr);), puis on efface l'écran ( clrscr();) - Citation :
........SYM_ENTRY *sym = SymFindFirst(NULL, FO_RECURSE);
Ici, on initialise la recherche. Drôles d'arguments n'est-ce pas ? En fait, il faut s'intéresser au 2ème argument, nommé le flag FO_RECURSE (=0x02) est un flag qui permet de créer une recherche dans tous les dossiers présents sur la calculette, le premier argument sert à initialiser la recherche, c'est pourquoi il est mis à NULL pour pouvoir commencer au 1er dossier Ainsi, si vous avez les dossiers MAIN, MATHS, PHYSIQUES et que vous "lancez la recherche" à l'aide de l'instruction : - Citation :
........SYM_ENTRY *sym = SymFindFirst(SYMSTR("MATHS"), FO_RECURSE);..//attention ! le 1er argument est un SYM_STR!)
Le dossier MAIN sera alors ignoré car situé avant MATHS dans l'ordre alphabétique Capiche ? Non, relisez, oui, on continue: - Citation :
........short s, key; ........HANDLE handle; ........char *ptrFILE, *end; ........unsigned char type; ........char type_str[10]; ........unsigned short size;
Ici, on initialise les variables qu'on va utiliser pour la suite :
- s : fichier ou dossier ? (cf suite)
- key : touche appuyée
- handle : handle du fichier
- ptrFILE : pointeur sur le début des données
- end : pointeur sur la fin des données
- type : type du fichier
- type_str : chaine correspondant au nombre type
- size : taille du fichier
- Citation :
........while(sym) ........{ ........//... ........sym = SymFindNext(); ........}
Rien à dire ? cf chapitre II du tuto Intéressons-nous au corps du programme, ce qu'il y a à l'intérieur de la boucle : - Citation :
.................s = sym -> flags.bits.folder;
Ici, on regarde si ce qu'on "analyse" actuellement est un fichier ou un dossier. Si s vaut 0, c'est un fichier, sinon c'est un dossier (cf structure d'une SYM_ENTRY : - Citation :
typedef struct {
| char name[8]; unsigned short compat; union {
| unsigned short flags_n; struct {
| unsigned int busy : 1, local : 1, flag1_5 : 1, flag1_4 : 1, collapsed : 1, twin : 1, archived : 1, in_view : 1; unsigned int folder : 1, overwritten : 1, checked : 1, hidden : 1, locked : 1, statvar : 1, graph_ref_1 : 1, graph_ref_0 : 1;
| } bits;
| } flags; HANDLE handle;
| } SYM_ENTRY;
- Citation :
.................if (!s) .................{ .................//... .................else .................//... .................}
Mise en application de ce qui a été dit précedemment |
|
tama Admin
Nombre de messages : 12376 Age : 32 Localisation : DTC ? :triso: Humeur : =) items : o Personalized field : huh ? oO Réputation : 3 Points : 9434 Date d'inscription : 08/08/2007
Profil TI: 84+, 89 tita, 89 tita TO: infini :p Spécialité: C 68k
| Sujet: Re: [C] VAT : application du cours Mer 25 Juin 2008, 00:22 | |
| suite du tuto à venir... j'l'avais fini et un malheureux clic m'a tout fait perdre snif |
|