1

Bonjour tout le monde

Eh bien voila j'écris ce topic pour tous ceux qui veulent créer des boites de dialogues (comme celles du TIOS) sans avoir à taper 50 fois le même code...
#define USE_TI92PLUS          // Ne pas compiler pour  #define USE_V200              // Ti-89 (pour le moment)  #define SAVE_SCREEN  #define OPTIMIZE_ROM_CALLS  #define voir(expr) printf(#expr " = %d\n", expr)  #define voir_str(expr) printf(#expr " = %s\n", expr)    #include <tigcclib.h>  char *titre,*request[5],*text[5];    void dialogue(char *titre,char *text[5],char *request[5], int bt_1, int bt_2) {      int nb_text=0,nb_req=0,i=0,y=15,taille_max=0;        for(i=0;i<5;i++) {      if(strlen(text[i])) ++nb_text;   //Nombre de textes      taille_max=max(taille_max,strlen(text[i]));      if(strlen(request[i])) ++nb_req; //Nombre de requests      taille_max=max(taille_max,strlen(request[i]))    }    taille_max=max((6*taille_max),(4*strlen(titre)));    int taillex=taille_max+10,tailley=10*nb_text+12*nb_req+29;    //11 car 8 pour la taille du texte et 3 pour le decalage  vertical +29 pour les boutons            char buffer[105];  //100 pour 20*5 requests + 5 '\0'    char buffer2[21];    char buffer3[21];    char buffer4[21];    char buffer5[21];    char *buf=buffer;    char *buf2=buffer2;    char *buf3=buffer3;    char *buf4=buffer4;    char *buf5=buffer5;      int decalage_buffer=0;    if(nb_req)      taillex=max(taillex,200);    if(bt_1||bt_2)      taillex=max(taillex,35);    if(bt_1&&bt_2)      taillex=max(taillex,70);        //Pour la place occupee par les boutons s'il y en a    HANDLE h = DialogNewSimple (taillex,tailley);    DialogAddTitle (h,titre,bt_1,bt_2);    for(i=0;i<nb_text;i++,y+=10)      DialogAddText (h,3,y,text[i]);    for(i=0;i<nb_req;i++,y+=12,decalage_buffer+=20)      DialogAddRequest (h,3,y,request[i],decalage_buffer,20,30-strlen(request[i]));    DialogDo(h,CENTER,CENTER,buffer,NULL);      if(nb_req==0)      goto fin;    while(*buf2++=*buf++);          //Copie dans buffer2    if(nb_req<2)      goto fin;    buf+=(20-(strlen(buffer2)+1));  //Va au 3eme buffer    while(*buf3++=*buf++);          //Copie dans buffer3    if(nb_req<3)      goto fin;    buf+=(20-(strlen(buffer3)+1));  //Va au 4eme buffer    while(*buf4++=*buf++);          //Copie dans buffer4    if(nb_req<4)      goto fin;    buf+=(20-(strlen(buffer4)+1));  //Va au 5eme buffer    while(*buf5++=*buf++);          //Copie dans buffer5    if(nb_req<5)      goto fin;    fin:    HeapFree (h);  }    void _main(void)  {    int bt_1,bt_2;      titre="Creation de votre personnage - Page 1";    text[0]="Vous allez maintenant créer";    text[1]="votre personnage et choisir";    text[2]="ses aptitudes et caractéristiques.";    request[0]="Entrez votre nom:";    bt_1=BT_NONE;    bt_2=BT_OK;    dialogue(titre, text, request, bt_1, bt_2);  }
Comment l'utiliser: Il n'y a qu' à assigner des chaînes de caractères aux variables *text[5], *request[5] et *titre.

Les popups ne sont pas encore gérées, désolé(ça viendra..., faut juste que je relise un peu la documentation).


Elements Soul, mon projet sur TI-92+ (et d'ailleurs mon seul VRAI projet)
Avancement :

Interface : 90 %
Système de combats : 95 %
BDDs : 60 %
Histoire : 5 %

2

PS: J'avais oublié: Pour faire apparaître le dialogue, il faut écrire "dialogue(titre, text, request, bt_1, bt_2);".

J'espère que ça pourra vous être utile smile
Elements Soul, mon projet sur TI-92+ (et d'ailleurs mon seul VRAI projet)
Avancement :

Interface : 90 %
Système de combats : 95 %
BDDs : 60 %
Histoire : 5 %

3

Tes tests if (strlen(text[i])) peuvent être simplifiés en if (text[i]) (ou if (text[i]!=NULL)).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

Plutôt if (text[i][0] != 0)

5

PpHd (./4) :
Plutôt if (text[i][0] != 0)

Mais ici, il suffit de tester que la chaîne n'est pas NULL, si on n'a rien écrit dans le tableau global, ce sera NULL (initialisation automatique des BSS par le code de démarrage).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

Dans ce cas j'appelle pas ca simplifier, mais corriger un bug.

7

Merci pour vos corrections !
Et j'ai pas trouvé comment faire pour simplifier ce passage:
char *buf=buffer; char *buf2=buffer2; char *buf3=buffer3; char *buf4=buffer4; char *buf5=buffer5;du style =buffer[5]") en un truc du style char *buf[5]=buffer;      //(Je sèche à "=buffer", je vois pas comment mettre quelque chose (là, je vois pas comment faire (à "=buffer"), faut vraiment que je relise K&R...)
Elements Soul, mon projet sur TI-92+ (et d'ailleurs mon seul VRAI projet)
Avancement :

Interface : 90 %
Système de combats : 95 %
BDDs : 60 %
Histoire : 5 %

8

heu ça dépend ce que tu veux faire en fait, parce que tel quel je ne comprends pas trop l'objectif de toutes ces affectations de pointeurs ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

Bonne question, au fait. J'ai dû faire ça il y a longtemps pour une raison qui m'est inconnue confus ...
Mais ce que je veux faire c'est supprimer toutes ces déclarations pour n'en faire qu'une, pour raccourcir le programme. Mais bon, tant que ca fonctionne sans planter... ca me va.
Je pense que je peux me passer de ça, ça rendra le code un peu plus compliqué, surtout qu'à la base, j'avais écrit ce code pour les débutants en C qui trouvent dur de créer les dialogues en C ("Oulala c'est quoi encore que ce truc de eek fou je comprends rien avec leur buffers c'est quand même vachement plus facile avec le TI-Basic !") et qui veulent faire un peu comme en TI-Basic (moi-même je me suis dit ce que je viens de citer smile ).
Elements Soul, mon projet sur TI-92+ (et d'ailleurs mon seul VRAI projet)
Avancement :

Interface : 90 %
Système de combats : 95 %
BDDs : 60 %
Histoire : 5 %

10

StoneWolf (./9) :
Mais bon, tant que ca fonctionne sans planter... ca me va.
Bof, c'est quand même une mauvaise habitude à mon avis de se permettre de ne pas comprendre son propre code.
Peut-être aussi qu'en testant tu n'es pas tombé sur un cas où ça plante, mais qu'il y en a quand même...
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

11

J'ai du faire des resets (beaucoup beaucoup de resets) pour y arriver, et j'ai testé le programme dans beaucoup de cas différents (ex: pas de titre, de texte, de requête etc.) pour qu'il ne plante pas (ou au moins très peu), mais comme tu le dis Sasume :
Peut-être aussi qu'en testant tu n'es pas tombé sur un cas où ça plante, mais qu'il y en a quand même...
Elements Soul, mon projet sur TI-92+ (et d'ailleurs mon seul VRAI projet)
Avancement :

Interface : 90 %
Système de combats : 95 %
BDDs : 60 %
Histoire : 5 %

12

StoneWolf (./7) :
Merci pour vos corrections !
Et j'ai pas trouvé comment faire pour simplifier ce passage:
char *buf=buffer; char *buf2=buffer2; char *buf3=buffer3; char *buf4=buffer4; char *buf5=buffer5;du style =buffer[5]") en un truc du style char *buf[5]=buffer;      //(Je sèche à "=buffer", je vois pas comment mettre quelque chose (là, je vois pas comment faire (à "=buffer"), faut vraiment que je relise K&R...)

memcpy() ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

13

Pollux

Merci ! smile
Elements Soul, mon projet sur TI-92+ (et d'ailleurs mon seul VRAI projet)
Avancement :

Interface : 90 %
Système de combats : 95 %
BDDs : 60 %
Histoire : 5 %