90

avec la 0.33 il n'y a plu les bug par contre le <>+haut et <>+bas ne fonctionne pas a tout le temp confus

91

hwti> CA MARCHE!!!!!toptoptoptop

avec cette nouvelle version, mon fichier source qui plantait au début marche totalement.
Heuuuu, par contre,.... J'ai juste un peut augmenté la taille des buffers. Je suis passé de 16384 à 32768. Faudrai faire un buffer variable, que ce soit l'utilisateur qui le règle en fonction de ces besoinsgrin.

Car 32Ko c BEAUCOUP TROP pour une petite applicationsmile

il faudrai faire un truc du genre:
autosymb (source, destination, taille_buffer)
en imposant bien sur des limitessmile

92

Quand je parle de limites, c en minimum et en maximum.
C pas la peine d'essayer avec un buffer de 3 octetswink

93

le buffer c'est la taille initiale, normalement avec realloc (que j'ai désactivé là parce que ça plantait en quittant) le buffer était agrandi selon les besoins

94

Donc actuellement, il n'est pas réagrandi, c ca?

T'en pense koi de mon idée de buffer variableconfus

95

je pense que ce serait mieux si ça marchait avec realloc (c'est mieux si l'utilisateur n'a rien à entrer, et la différence de performance est très faible). Si personne ne voit pourquoi ça ne marche pas (tsssKevin, où est tu ?), je vais remplacer malloc/realloc/free par HeapAllocHigh/HeapRealloc/HeapFree

96

Fin tragiquetsss

97

J'ai matté ton code et je trouve:

if ((labelsindex + len > labelssize) && ((labels = (char *)realloc(labels,labelssize += BUFFER_SIZE)) == NULL)) return -1;

ce serait pas:
if (labelsindex + len > labelssize)
{
if ((labels = (char *)realloc(labels,labelssize += BUFFER_SIZE)) == NULL)) return -1;
}

EN DEUX FOIS!!!!!!!!

car il lancera realloc même si la limite n'est pas atteinte.

Faut voirgrin

98

Non si la premiere condition n'est pas verivié, ca teste pas la 2eme (&&)
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

99

Il fera la deuxième condition quelque soit le résultat de la première donc il va lancer realloc pour attendre son résultat et comparer!!!!!!!!!!

100

TiMad> fais ca en TI-basic et on en reparle, OK?

101

ce que TiMad dit est vrai
&& ou || en C ne testent la 2ème expression que si la première est vraie

102

guigui> il y a quelques différences entre le TI-BASIC et le C smile
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

103

Raison ou pas, ca marche ma modif.
g recompilé en mettant un buffer de 4096 et en faisant ma modif, ET CA MARCHE BANDE DE CLOPORTEdevil

Oups, je m'emporteembarrassed

Et j'ai testé avec mon trés gros fichier poseur de problèmegrin

D'autres suggestionspicol

104

si ça marche il faudra voir avec Kevin car ce serait un bug de TIGCC

105

squale92> tu a déjà fait du TI-Basic ou du basic en général?

exemple:

imaginons que j'ai fait une fonction qui test si un fichier existe ou pas qui s'appel tst_file(nom_fichier) qui renvoie 1 si existant sinon 0, tu me suis?

dans un prog, si je met:
if tst_file(ma_variable)=1 AND ma_variable=9999: goto ...

ne marchera PAS si ma_variable est inexistante!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ca va planter mon prog basic!!!!!!!!!!!!!!!!!!

mais

if tst_file(ma_variable)=1 then
if ma_variable=9999: goto ...
EndIF

marchera!!!!!!

106

guigui> j'ai déjà fait du TI-BASIC, il a très longtemps smile
(ça va faire deux ans dans un mois que je n'en ai plus fait smile)
=> je me souviens plus trop smile

cela dit, pr ce qui est basic, je te crois : je serai incapable de dire si tu dis vrai ou non.
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

107

mais le C n'est pas pareil, regarde dans le doc de TIGCC, je crois que c'est indiqué, la 2ème condition n'est pas testée si la première est fausse pour && ou vraie pour ||

c'est pour ça que je vais regarder et comparer les codes ASM générés car ils devraient être identiques en théorie

108

OUI, mais ca marche avec ma modif, comment explique tu ca alors?????

Pourtant, g remis le buffer à 4096 et mis

if ((labelsindex + len > labelssize))
{
if ((labels = (char *)realloc(labels,labelssize += BUFFER_SIZE)) == NULL) return -1;
}

ainsi que

if (varsindex + len > varssize)
{
if ((vars = (char *)realloc(vars,varssize += BUFFER_SIZE)) == NULL) return -1;
}

Le programme ne plante plus même avec de trés grosse sources!

109

Peut être un don du ciel alorshum, je ne crois pas. C pareil pour tous les languagesmad

110

Mais même si ca marche comme vous le dite, c pas propre.

Je n'aime pas faire un programme ou je ne suis pas sûr à 100% de sa façon de réagir.
Ma méthode et mieux car même si ca fait la même chose qu'avant, c pas sur que ce soit la même chose pour un autre language.

De toute façon, les compilateurs sont intelligents, si ca réagi pareil, le code sera le même au final. Mais c plus sur de faire comme ça, c toutsmile

111

non
dans la doc de TIGCC http://tigcc.ticalc.org/doc/opers.html#logbit on a :

Unlike the bitwise operators, '&&' and '||' guarantee left-to-right evaluation. expr1 is evaluated first; if it is zero, expr1 && expr2 gives 0 (false), and expr2 is not evaluated at all. With expr1 || expr2, if expr1 is nonzero, expr1 || expr2 gives 1 (true), and expr2 is not evaluated at all.

112

Pour info, j'ai recompilé en mettant la méthode originale (tout sur la même ligne).
J'ai réussi à lancer autosymb sans plantage sur ma trés grosse source ASM. bizzardconfus

113

Aurai-tu corrigé le problème sans faire exprer, hwti????

114

non, ça marchait pas, tu as remis la même chose que moi, exactement les mêmes parenthèses ou pas ?
tu as quelle version de TIGCC ?

115

TIGCC version 0.94 beta 18
Le code actu de la source (exscuse, je l'ai mis en français et un peut amélioré):

#define NO_CALC_DETECT
#define NO_EXIT_SUPPORT
#define OPTIMIZE_ROM_CALLS
#define USE_TI89
//#define USE_TI92PLUS
//#define USE_V200
#define NO_AMS_CHECK

#include <stdio.h>
#include <string.h>
#include <statline.h>
#include <args.h>
#include <kbd.h>
#include <alloc.h>
#include <graph.h>
#include <vat.h>

char ProcessFile(char *File);
//char _strcmp(register const char *s1 asm("a0"),register const char *s2 asm("a1"));
//char *_strtok(register char *s asm("a0"));
//char *_strtoknext(void);

int labelnb,varnb;
char prgflags;
//4096
//24576
//28672
//32768

#define BUFFER_SIZE 4096
char *labels,*vars;
long labelssize,varssize,labelsindex,varsindex;
short error;

void _main(void)
{
FILE *f2;
char mainfile[19],outfile[18];
CESI argptr = top_estack;
LCD_BUFFER buf;
char *c;
char a;


labelssize = BUFFER_SIZE;
varssize = BUFFER_SIZE;
labelsindex = 0;
varsindex = 0;
labelnb = 0;
varnb = 0;
prgflags = 0;
error = 0;

FontSetSys(0);
if ((RemainingArgCnt(argptr) == 2) || (GetArgType(argptr) == STR_TAG))
{
mainfile[0]=0;
strcpy(mainfile+1, GetStrnArg(argptr));
if (GetArgType(argptr) == STR_TAG) {
strcpy(outfile,GetStrnArg(argptr));
goto goodargs;
}
}
ST_helpMsg("Syntaxe : autosymb (source, destination)")
return;


goodargs:
if ((labels = (char *)malloc(BUFFER_SIZE)) == NULL) {
ST_helpMsg("Plus de mémoire!")
return;
}
if ((vars = (char *)malloc(BUFFER_SIZE)) == NULL) {
ST_helpMsg("Plus de mémoire!")
free(labels);
return;
}

LCD_save(buf);
clrscr();

*labels = 0;
*vars = 0;

a = ProcessFile(mainfile+1);
if (a == 0) {
puts("Impossible de charger le fichier source!n")
goto end;
} else if (a == -1) {
puts("Plus de mémoiren")
error = 1;
goto end;
}

puts("Ecriture des informations symboliques...n")

if (!(f2 = fopen(outfile,"wt"))) {
puts("Impossible de créer le fichier de sortie!n")
error = 1;
goto end;
}

fputs("_db_lab:n_l0 ",f2);

fwrite(labels,1,labelsindex,f2);

fputs("dc.w 0n_db_var:n_v0 ", f2);

fwrite(vars,1,varsindex,f2);

fputs("dc.w 0n"
"_iv dc.w _db_var-_ivn"
"_il dc.w _db_lab-_iln"
" dc.b "dinf"", f2);

fclose(f2);

if (prgflags == 0) {
static char include1[] = " ;DB92_SYMBr "
"nop: NOPr "
" dc.w $6000,endsymb-nop-4r "
" dc.l 'DB92'r "
" dc.w 0,endsymb-nopr "
" include "";
static char include2[] = ""r "
"endsymb:r "
";END DB92_SYMBr r";
HANDLE hdl = SymFindPtr(mainfile+strlen(mainfile+1)+1,0)->handle;
unsigned int len = *(unsigned int *)(HeapDeref(hdl)) + 2;
unsigned int len2 = strlen(outfile) + sizeof(include1) + sizeof(include2) - 2;
if (!(HeapRealloc(hdl,len + len2))) {
puts("Impossible de changer la taille de la sourcen")
error = 1;
goto end;
}
void * ptr = HeapDeref(hdl);
*(unsigned int *)ptr = len + len2 - 2;
ptr +=4;
memmove(ptr + len2,ptr,len - 4);
c = include1;
while ((a = *c++)) *(char *)ptr++ = a;
c = outfile;
while ((a = *c++)) *(char *)ptr++ = a;
c = include2;
while ((a = *c++)) *(char *)ptr++ = a;
}

end:
free(labels);
free(vars);
puts("nAPPUYEZ SUR UN TOUCHE POUR QUITTER")
if (error) ngetchx();
LCD_restore(buf);
}

char ProcessFile(char * File)
{
FILE *f1;
int AlreadyRead;
char dummy[512],dummy2[512],dummy3[512], dummy4[512];
char *c,*s1,*s2;
int len;
char a;

f1 = fopen(File,"rt")
if (!f1)
{
printf("Fichier %s introuvablen",File);
error = 1;
return 0;
}

printf("Analyse fichier %s...n",File);

//Recherche des labels
do
{
c=fgets(dummy, 512, f1);
if (!c) break;
s1=strtok ( c, " n" );
if (s1 == NULL) continue;
if (!strcmp(s1, ";DB92_SYMB")) {
prgflags = 1;
do {
if (!fgets(dummy, 512, f1 )) break;
if (!strcmp(dummy, ";END DB92_SYMBn")) break;
} while (1);
continue;
}
if (s1[0]==';') continue;
s2=strtok ( NULL, " n" );
if(!cmpstri(s1, "include"))
{
if((*s2 == '"') || (*s2 == ''')) s2++;
s1=strtok ( s2, " n'"" );
if (ProcessFile(s1) == -1) return -1;
}
else
{
if (s1[strlen(s1)-1]==':')
{
if (s2) {
s2[3]=0;
if(!cmpstri(s2, "dc.") || !cmpstri(s2, "ds.")) continue; // pas un vrai label
}
s1[strlen(s1)-1]=0;
sprintf(dummy2,"dc.w %s-_l%dr "
"_l%d dc.w _l%d-_l%dr "
" dc.b "%s"r "
" evenr "
"_l%d ",s1,labelnb,labelnb+1,labelnb+2,labelnb+1,s1,labelnb+2);
labelnb+=2;

len = strlen(dummy2);

if ((labelsindex + len > labelssize))
{
if ((labels = (char *)realloc(labels,labelssize += BUFFER_SIZE)) == NULL) return -1;
}
strcpy(labelsindex+labels,dummy2);
labelsindex += len;
continue;
}
}
} while (1);

rewind(f1);

//Recherche des variables
AlreadyRead = 0;
do
{
if(!AlreadyRead) c=fgets ( dummy, 512, f1 );
else {
c = strcpy(dummy, dummy4);
AlreadyRead = 0;
}
if (!c) break;
s1=strtok ( c, " n" );
if (!s1) continue;
if (!strcmp(s1, ";DB92_SYMB")) {
do {
if (!fgets(dummy, 512, f1 )) break;
if (!strcmp(dummy, ";END DB92_SYMBn")) break;
} while (1);
continue;
}
if (s1[0]==';') continue;
s2=strtok ( NULL, " " );

//AlreadyRead = 0;
if(s2 == NULL) {
c = fgets(dummy3, 512,f1);
if (!c) break;
strcpy(dummy4, dummy3);
s2=strtok ( c, " " );
AlreadyRead = 1;
}
else {
a = s2[3];
s2[3] = 0;
if (!cmpstri(s2, "dc.") || !cmpstri(s2,"ds.")) {
if (s1[strlen(s1)-1]==':') s1[strlen(s1)-1]='';
switch (a)
{
case 'b' :
case 'B' : a = '0';break;
case 'w' :
case 'W' : a = '1';break;
case 'l' :
case 'L' : a = '2';break;
default : continue;
}
sprintf(dummy2,"dc.w %s-_v%dr "
"_v%d dc.w _v%d-_v%dr "
" dc.b %c,"%s"r "
" evenr "
"_v%d ",s1,varnb,varnb+1,varnb+2,varnb+1,a,s1,varnb+2);
varnb+=2;

len = strlen(dummy2);

if (varsindex + len > varssize)
{
if ((vars = (char *)realloc(vars,varssize += BUFFER_SIZE)) == NULL) return -1;
}

strcpy(varsindex+vars,dummy2);
varsindex += len;
continue;
}
}

} while (1);

fclose(f1);
return 1;
}

116

Comment on fait pour affichier du code avec des couleurs sur ce site???

117

Je recommence en plus clair:
#define NO_CALC_DETECT #define NO_EXIT_SUPPORT #define OPTIMIZE_ROM_CALLS #define USE_TI89 //#define USE_TI92PLUS //#define USE_V200 #define NO_AMS_CHECK #include <stdio.h> #include <string.h> #include <statline.h> #include <args.h> #include <kbd.h> #include <alloc.h> #include <graph.h> #include <vat.h> char ProcessFile(char *File); //char _strcmp(register const char *s1 asm("a0"),register const char *s2 asm("a1")); //char *_strtok(register char *s asm("a0")); //char *_strtoknext(void); int labelnb,varnb; char prgflags; //4096 //24576 //28672 //32768 #define BUFFER_SIZE 4096 char *labels,*vars; long labelssize,varssize,labelsindex,varsindex; short error;       void _main(void) {   FILE *f2;   char mainfile[19],outfile[18];      CESI argptr = top_estack;      LCD_BUFFER buf;      char *c;      char a;      labelssize = BUFFER_SIZE;      varssize = BUFFER_SIZE;      labelsindex = 0;      varsindex = 0;      labelnb = 0;      varnb = 0;      prgflags = 0;      error = 0;      FontSetSys(0);   if ((RemainingArgCnt(argptr) == 2) || (GetArgType(argptr) == STR_TAG))   {        mainfile[0]=0;        strcpy(mainfile+1, GetStrnArg(argptr));        if (GetArgType(argptr) == STR_TAG) {                strcpy(outfile,GetStrnArg(argptr));                goto goodargs;        }   }   ST_helpMsg("Syntaxe : autosymb (source, destination)");   return; goodargs:   if ((labels = (char *)malloc(BUFFER_SIZE)) == NULL) {        ST_helpMsg("Plus de mémoire!");        return;   }   if ((vars = (char *)malloc(BUFFER_SIZE)) == NULL) {        ST_helpMsg("Plus de mémoire!");        free(labels);        return;   }      LCD_save(buf);   clrscr();      *labels = 0;      *vars = 0;      a = ProcessFile(mainfile+1);      if (a == 0) {           puts("Impossible de charger le fichier source!n");           goto end;      } else if (a == -1) {           puts("Plus de mémoiren");           error = 1;           goto end;      }   puts("Ecriture des informations symboliques...n");   if (!(f2 = fopen(outfile,"wt"))) {        puts("Impossible de créer le fichier de sortie!n");        error = 1;        goto end;        }   fputs("_db_lab:n_l0 ",f2);   fwrite(labels,1,labelsindex,f2);   fputs("dc.w 0n_db_var:n_v0 ", f2);   fwrite(vars,1,varsindex,f2);   fputs("dc.w 0n"   "_iv dc.w _db_var-_ivn"   "_il dc.w _db_lab-_iln"   " dc.b "dinf"", f2);   fclose(f2);      if (prgflags == 0) {           static char include1[] = " ;DB92_SYMBr "           "nop: NOPr "             " dc.w $6000,endsymb-nop-4r "           " dc.l 'DB92'r "           " dc.w 0,endsymb-nopr "           " include "";        static char include2[] = ""r "        "endsymb:r "        ";END DB92_SYMBr r";        HANDLE hdl = SymFindPtr(mainfile+strlen(mainfile+1)+1,0)->handle;           unsigned int len = *(unsigned int *)(HeapDeref(hdl)) + 2;           unsigned int len2 = strlen(outfile) + sizeof(include1) + sizeof(include2) - 2;           if (!(HeapRealloc(hdl,len + len2))) {                puts("Impossible de changer la taille de la sourcen");                error = 1;                goto end;                }           void * ptr = HeapDeref(hdl);           *(unsigned int *)ptr = len + len2 - 2;           ptr +=4;           memmove(ptr + len2,ptr,len - 4);           c = include1;           while ((a = *c++)) *(char *)ptr++ = a;        c = outfile;           while ((a = *c++)) *(char *)ptr++ = a;        c = include2;           while ((a = *c++)) *(char *)ptr++ = a;      } end:   free(labels);   free(vars);      puts("nAPPUYEZ SUR UN TOUCHE POUR QUITTER");      if (error) ngetchx();      LCD_restore(buf); } char ProcessFile(char * File) {           FILE *f1;           int AlreadyRead;           char dummy[512],dummy2[512],dummy3[512], dummy4[512];           char *c,*s1,*s2;           int len;           char a;           f1 = fopen(File,"rt");           if (!f1)           {                printf("Fichier %s introuvablen",File);                error = 1;                return 0;           }           printf("Analyse fichier %s...n",File);           //Recherche des labels           do           {                c=fgets(dummy, 512, f1);                if (!c) break;                s1=strtok ( c, " n" );                if (s1 == NULLcontinue;                if (!strcmp(s1, ";DB92_SYMB")) {                     prgflags = 1;                     do {                       if (!fgets(dummy, 512, f1 )) break;                       if (!strcmp(dummy, ";END DB92_SYMBn")) break;                     } while (1);                     continue;              }                if (s1[0]==';'continue;                s2=strtok ( NULL" n" );                if(!cmpstri(s1, "include"))                {                     if((*s2 == '"') || (*s2 == ''')) s2++;                     s1=strtok ( s2, " n'"" );                  if (ProcessFile(s1) == -1) return -1;              }              else              {            if (s1[strlen(s1)-1]==':')         {           if (s2) {                s2[3]=0;                  if(!cmpstri(s2, "dc.") || !cmpstri(s2, "ds.")) continue;  // pas un vrai label           }           s1[strlen(s1)-1]=0;                          sprintf(dummy2,"dc.w %s-_l%dr "                          "_l%d dc.w _l%d-_l%dr "                          " dc.b "%s""                          " evenr "                          "_l%d ",s1,labelnb,labelnb+1,labelnb+2,labelnb+1,s1,labelnb+2);                          labelnb+=2;                          len = strlen(dummy2);                          if ((labelsindex + len > labelssize))                          {                           if ((labels  = (char *)realloc(labels,labelssize += BUFFER_SIZE)) == NULL) return -1;                          }                     strcpy(labelsindex+labels,dummy2);                     labelsindex += len;         continue;        }      }           } while (1);      rewind(f1);      //Recherche des variables            AlreadyRead = 0;         do        {              if(!AlreadyRead) c=fgets ( dummy, 512, f1 );       else {            c = strcpy(dummy, dummy4);            AlreadyRead = 0;       }          if (!c) break;           s1=strtok ( c, " n" );           if (!s1) continue;              if (!strcmp(s1, ";DB92_SYMB")) {                     do {                       if (!fgets(dummy, 512, f1 )) break;                       if (!strcmp(dummy, ";END DB92_SYMBn")) break;                     } while (1);                     continue;              }                if (s1[0]==';') continue;                s2=strtok ( NULL, " " );                //AlreadyRead = 0;                if(s2 == NULL) {                     c = fgets(dummy3, 512,f1);             if (!c) break;         strcpy(dummy4, dummy3);         s2=strtok ( c, " " );         AlreadyRead = 1;                }       else {                  a = s2[3];                  s2[3] = 0;               if (!cmpstri(s2, "dc.") || !cmpstri(s2,"ds.")) {                 if (s1[strlen(s1)-1]==':') s1[strlen(s1)-1]='';               switch (a)               {                 case 'b' :                 case 'B' : a = '0';break;                 case 'w' :                 case 'W' : a = '1';break;                 case 'l' :                 case 'L' : a = '2';break;                 default : continue;               }                          sprintf(dummy2,"dc.w %s-_v%dr "                          "_v%d dc.w _v%d-_v%dr "                          " dc.b %c,"%s""                          " evenr "                          "_v%d ",s1,varnb,varnb+1,varnb+2,varnb+1,a,s1,varnb+2);                          varnb+=2;                           len = strlen(dummy2);                          if (varsindex + len > varssize)                          {                           if ((vars  = (char *)realloc(vars,varssize += BUFFER_SIZE)) == NULL) return -1;                          }                                                    strcpy(varsindex+vars,dummy2);                           varsindex += len;               continue;                     }                }   } while (1);           fclose(f1);            return 1; }

118

tu as changé quoi ? (à part le français et l'ajout de error)
je mettrait error mais pour le français comme DB92 est en anglais, autosymb sera en anglais, mais rien ne t'interdit de traduire à chaque nouvelle version

119

g touvé tout seul pour l'insertion de sourcesgrin

petite question, ca sert à koi EVEN en asmconfus

120

even fait en sorte que l'instruction ou la variable qui suit soit à une adresse paire