OVH Cloud OVH Cloud

limite traitement programme console ?

22 réponses
Avatar
ologram
Bonjour,

Je programme en amateur.

Au boulot nous travaillons sur windows XP avec un =E9mulateur VT320 vers
un programme sur un serveur linux.

Je ne suis pas autoris=E9 =E0 "attaquer" les tables du programme, et pour
pouvoir palier =E0 certains manques de ce programme, je rappatrie des
donn=E9es vers une base de donn=E9es Access.

Pour cela j'ai r=E9alis=E9 une macro en C dans un programme console, qui
fait des copiers/coller vers un fichier txt. J'envois de touches
virtuelles puis je r=E9cup=E8re le clipboard et j'extrais les =E9l=E9ments
qui m'int=E9ressent que je place dans des variables.

Tout fonctionne correctement, sauf quand je lance la macro sur un grand
nombre de "fiches" =E0 copier. J'ai r=E9alis=E9 des tests et ai ajout=E9
proc=E9dures de v=E9rification mais rien =E0 faire mon programme plante
vers le 200=E8me =E9cran copi=E9.

J'ai recopi=E9 les =E9l=E9ments de Dr Watson pour les plantages mais
=E9videmment je ne comprends pas les messages des fautes r=E9pertori=E9es.
J'esp=E8rais avoir toujour le m=EAme message d'erreur mais ce n'est pas
le cas.

Y a t'il une masse maximum d'=E9l=E9ments qu'un programme console peut
traiter ?

Y a t'il moyen de d=E9cripter les messages d'erreurs de Dr WATSON. Sinon
existe t'il un moyen de surveiller mon application et de r=E9cup=E9rer
des informations me permettant de comprendre ce qui plante ?

Merci pour vos informations

ologram

10 réponses

1 2 3
Avatar
ologram
Bon ne connaissant pas ADPLUS, j'ai essayé les débuggeurs à ma
disposition : dev-c++ et codeblocks. Dev-c++ via gdb donne des infos
incompréhensibles pour un novice, par contre codeblocks renvoit ceci :
#0 0x7c911010 ntdll!RtlEnumerateGenericTableLikeADirectory (??:??)
#1 0x77c0b90d msvcrt!_lock (??:??)
#2 0x00000020 ?? (??:??)
#3 0x0022ff18 ?? (??:??)
#4 0x77c10efa msvcrt!fputs (??:??)
#5 0x00000000 ?? (??:??)
#6 0x00000001 ?? (??:??)
#7 0x0022ec20 ?? (??:??)
#8 0x00004000 ?? (??:??)
#9 0x0022ffe0 ?? (??:??)
#10 0x77c05c94 msvcrt!_except_handler2 (??:??)

vu la ligne #4 j'ai testé le programme sans lancer l'écriture vers
fichier qui se trouve dans RecupVarDet(void) et le programme n'a plus
calé.

Il y a peut-être qq chose de mauvais dans mon code (voir plus bas), ou
peut-être y a t'il une limite en écriture dans les fichiers ?

void RecupVarDet(void)
{
for (s=0; s < 6 & s < inbLignes; s++)
{
ExtractBufReel(284, 5, BCDvar.engBCDno);
printf("%sn", BCDvar.engBCDno);
ExtractBuf(259, 4, BCDvar.engBCDaa);
printf("%sn", BCDvar.engBCDaa);
itoa(InoLigne, BCDvar.noLigne, 10);
printf("Recup_noLigne = %sn", BCDvar.noLigne);
InoLigne = InoLigne + 1;
ExtractBufFormat(822+(s*82*2), 77, BCDvar.detFourn);
printf("%sn", BCDvar.detFourn);
ExtractBufReel(766+(s*82*2), 11, BCDvar.prixHTVA);
printf("%sn", BCDvar.prixHTVA);
ExtractBuf(794+(s*82*2), 4, BCDvar.TauxTVA);
printf("%sn", BCDvar.TauxTVA);
ExtractBuf(312, 10, BCDvar.dateBCD);
printf("%sn", BCDvar.dateBCD);
ExtractBufReel(753+(s*82*2), 11, BCDvar.quantite);
printf("%sn", BCDvar.quantite);
ExtractBuf(740+(s*82*2), 15, BCDvar.noProd);
printf("%sn", BCDvar.noProd);
ExtractBufReel(802+(s*82*2), 12, BCDvar.prixTotLigne);
printf("%s/%sn", BCDvar.engBCDaa, BCDvar.engBCDno);
printf("InoLigne : %in", InoLigne);
if ((fopen("outBCd.txt", "r"))== NULL)
{
MessageBox (NULL, "Erreur : impossible d'ouvrir outBCd.txt" ,
"ERREUR", 0 + MB_ICONEXCLAMATION + MB_SYSTEMMODAL);
printf("Erreur %c l'ouverture de "outBCd.txt"n", 133); /*
%c, 133 = à */
break;
}
else
{
fp = fopen("outBCd.txt", "a");
fputs(BCDvar.engBCDaa, fp);
fputs(Tab, fp);
fputs(BCDvar.engBCDno, fp);
fputs(Tab, fp);
fputs(BCDvar.engBCDaa, fp);
fputs(slash, fp);
fputs(BCDvar.engBCDno, fp);
fputs(Tab, fp);
fputs(BCDvar.noLigne, fp);
fputs(Tab, fp);
fputs(BCDvar.dateBCD, fp);
fputs(Tab, fp);
fputs(BCDvar.detFourn, fp);
fputs(Tab, fp);
fputs(BCDvar.noProd, fp);
fputs(Tab, fp);
fputs(BCDvar.quantite, fp);
fputs(Tab, fp);
fputs(BCDvar.prixHTVA, fp);
fputs(Tab, fp);
fputs(BCDvar.TauxTVA, fp);
fputs(Tab, fp);
fputs(BCDvar.prixTotLigne, fp);
fputs(Ligne, fp);
fclose(fp);
}
}

}
Avatar
Christian ASTOR
ologram wrote:

Il y a peut-être qq chose de mauvais dans mon code



Des fopen() sans fclose(), forcément, au bout d'un moment ça pète...
Avatar
Christian ASTOR
Christian ASTOR wrote:

ologram wrote:
Il y a peut-être qq chose de mauvais dans mon code





Des fopen() sans fclose(), forcément, au bout d'un moment ça pète...



... fopen() qui de plus ne sert à rien (puisque "a")
(BTW, on ne fait généralement pas des fopen()-fclose() dans une boucle,
mais au début et à la fin du prog)
Avatar
ologram
J'ai changé le texte de la fonction comme suit pour opérer les
fopen() et fclose() en dehors de la boucle. J'ai changé également
changé les fputs en fprintf.

J'arrive maintenant a "capturer" 213 écrans au lieu de 92, mais ça
bloque toujours. Ce texte est-il correct ?

D'autre part j'ai lancé l'applic. avec ADPLUS, mais je ne sais pas
quel est le fichier, ou quelle partie de fichier je dois vous soumettre
pour y voir plus clair....

Merci pour votre aide

ologram

void RecupVarDet(void)
{
ToOutBCD_ligne[0]='';
for (s=0; (s < 6) & (s < inbLignes); s++)
{
ExtractBuf(259, 4, BCDvar.engBCDaa);
strcat(ToOutBCD_ligne, BCDvar.engBCDaa);
printf("%sn", BCDvar.engBCDaa);
strcat(ToOutBCD_ligne, Tab);

ExtractBufReel(284, 5, BCDvar.engBCDno);
strcat(ToOutBCD_ligne, BCDvar.engBCDno);
printf("%sn", BCDvar.engBCDno);
strcat(ToOutBCD_ligne, Tab);

strcat(ToOutBCD_ligne, BCDvar.engBCDaa);
strcat(ToOutBCD_ligne, slash);
strcat(ToOutBCD_ligne, BCDvar.engBCDno);
strcat(ToOutBCD_ligne, Tab);

itoa(InoLigne, BCDvar.noLigne, 10);
strcat(ToOutBCD_ligne, BCDvar.noLigne);
printf("Recup_noLigne = %sn", BCDvar.noLigne);
strcat(ToOutBCD_ligne, Tab);
InoLigne = InoLigne + 1;
printf("InoLigne : %in", InoLigne);


ExtractBuf(312, 10, BCDvar.dateBCD);
strcat(ToOutBCD_ligne, BCDvar.dateBCD);
printf("%sn", BCDvar.dateBCD);
strcat(ToOutBCD_ligne, Tab);

ExtractBufFormat(822+(s*82*2), 77, BCDvar.detFourn);
strcat(ToOutBCD_ligne, BCDvar.detFourn);
printf("%sn", BCDvar.detFourn);
strcat(ToOutBCD_ligne, Tab);

ExtractBuf(740+(s*82*2), 15, BCDvar.noProd);
strcat(ToOutBCD_ligne, BCDvar.noProd);
printf("%sn", BCDvar.noProd);
strcat(ToOutBCD_ligne, Tab);

ExtractBufReel(753+(s*82*2), 11, BCDvar.quantite);
strcat(ToOutBCD_ligne, BCDvar.quantite);
printf("%sn", BCDvar.quantite);
strcat(ToOutBCD_ligne, Tab);

ExtractBufReel(766+(s*82*2), 11, BCDvar.prixHTVA);
strcat(ToOutBCD_ligne, BCDvar.prixHTVA);
printf("%sn", BCDvar.prixHTVA);
strcat(ToOutBCD_ligne, Tab);

ExtractBuf(794+(s*82*2), 4, BCDvar.TauxTVA);
strcat(ToOutBCD_ligne, BCDvar.TauxTVA);
printf("%sn", BCDvar.TauxTVA);
printf("%sn", ToOutBCD_ligne);
strcat(ToOutBCD_ligne, Tab);

ExtractBufReel(802+(s*82*2), 12, BCDvar.prixTotLigne);
strcat(ToOutBCD_ligne, BCDvar.prixTotLigne);
printf("engagement : %s/%sn", BCDvar.engBCDaa, BCDvar.engBCDno);
strcat(ToOutBCD_ligne, Tab);
strcat(ToOutBCD_ligne, Ligne);

}
if ((fopen("outBCd.txt", "r"))== NULL)
{
MessageBox (NULL, "Erreur : impossible d'ouvrir outBCd.txt" ,
"ERREUR",
0 + MB_ICONEXCLAMATION + MB_SYSTEMMODAL);
printf("Erreur %c l'ouverture de "outBCd.txt"n", 133);
/*%c, 133 = à */
return 0;
}

else
{
fp = fopen("outBCd.txt", "a");
fprintf(fp, "%s", ToOutBCD_ligne);
fclose(fp);
}
}
Avatar
Christian ASTOR
ologram wrote:
J'ai changé le texte de la fonction comme suit pour opérer les
fopen() et fclose() en dehors de la boucle.



Ben non, c'est exactement pareil.
fopen() inutile, pas de fclose() et ouverture-fermeture multiples.
On ouvre 1 seule fois en début de prog et on passe le pointeur de
fichier aux fonctions.
Avatar
Paul Bacelar
> fp = fopen("outBCd.txt", "a");

fclose(fp);



fp, le FILE* de retour de fopen est fermé par fclose mais:

if ((fopen("outBCd.txt", "r"))== NULL)



Qui ferme le FILE* créé par ce fopen ?

<CODE>
fp = fopen("outBCd.txt", "a");
if (fp)
{
MessageBox (NULL, "Erreur : impossible d'ouvrir outBCd.txt" ,"ERREUR",
MB_ICONEXCLAMATION | MB_SYSTEMMODAL);
printf("Erreur %c l'ouverture de "outBCd.txt"n", 133);/*%c, 133 = à
*/
return 0;
}
else
{
fprintf(fp, "%s", ToOutBCD_ligne);
fclose(fp);
}
</CODE>

Pour ADPLUS, c'est un DrWatson de luxe et il génère un fichier de log qui
montre les problèmes de l'application durant l'exécution et qui génère un
fichier dmp lors d'un crash.

Postez le fichier de log s'il n'est pas trop long.

Les problèmes que vous rencontrez semble assez basics. Une revue de code par
une personne plus expérimenté devrait être efficace.
--
Paul Bacelar
Avatar
ologram
Tout d'abord merci pour vos réponses.

Vous avez raison je programme en amateur...

Si je comprend bien les remarques de Christian Astor, je dois écrire
une seule fois dans le fichier. Sinon je ne saisi pas comment écrire
dans le fichier Dans ce cas je vais me retrouver avec une variable qui
peut être énorme si j'ai beaucoup d'écran à copier : 64 Ko ?

Mais est-ce que je ne devrais pas plutôt poser ces questions sur
fr.comp.lang.c ?
Avatar
Cyrille Szymanski
"Paul Bacelar" wrote in
news:dtptq1$oqr$:

Les problèmes que vous rencontrez semble assez basics. Une revue de
code par une personne plus expérimenté devrait être efficace.



Oui, il y a beaucoup de choses qui ne vont pas dans ce code ; si un jour il
fonctionne je pense que ce sera par hasard... ;-) Pardon pour mon côté
cynique.

Quelques bons conseils :

* Commenter le code pour expliquer ce qu'il fait.

* Les fonctions str*() sont dépréciées, il vaut mieux utiliser la version
strn*() : strncat(ToOutBCD_ligne, BCDvar.engBCDaa, 4);

* Utiliser ASSERT() pour détecter les problèmes :
ptr = strchr(nbLignes, '/');
ASSERT( ptr!=NULL );
nbLignes[ptr-nbLignes] = '';

* Toujours vérifier les valeurs de retour des fonctions.

* Une synchronisation à base de Sleep() sent le pâté à plein nez.

* Soigner l'acquisition et la libération de ressources comme dans l'exemple
de Paul pour FILE*.

--
Cyrille Szymanski
Avatar
Christian ASTOR
ologram wrote:

Si je comprend bien les remarques de Christian Astor, je dois écrire
une seule fois dans le fichier. Sinon je ne saisi pas comment écrire
dans le fichier Dans ce cas je vais me retrouver avec une variable qui
peut être énorme si j'ai beaucoup d'écran à copier : 64 Ko ?



Non, je parlais de l'ouverture du fichier : on fait un seul fopen() (ou
CreateFile() au début; on ne l'ouvre pas n fois pour le refermer n fois
(comme tu as oublié de le fermer, c'est d'ailleurs ce qui a posé
problème, puisque tu te retrouvais avec des dizaines de handles ouverts
par ton process)
Avatar
ologram
> Non, je parlais de l'ouverture du fichier : on fait un seul fopen() (ou
CreateFile() au début; on ne l'ouvre pas n fois pour le refermer n fois
(comme tu as oublié de le fermer, c'est d'ailleurs ce qui a posé
problème, puisque tu te retrouvais avec des dizaines de handles ouverts
par ton process)



Pour ce qui est de fermer : if ((fopen("outBCd.txt", "r"))== NULL),
j'avais effectivement mal compris l'exemple que j'ai pioché dans mon
bouquin d'initiation...

Mais comment dois-je écrire dans le fichier alors ? Toutes les
fonctions que j'ai trouvées dans le documentation doivent mentionner
"fp [fp=fopen(nomfichier, mode)]" (fputs, fputc, fprintf, etc...) et
donc, si je comprend bien, ouvrir à nouveau le fichier.
1 2 3