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 ?
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...
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)
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)
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)
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);
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);
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);
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.
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.
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.
Paul Bacelar
> fp = fopen("outBCd.txt", "a");
fclose(fp);
fp, le FILE* de retour de fopen est fermé par fclose mais:
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
> fp = fopen("outBCd.txt", "a");
fclose(fp);
fp, le FILE* de retour de fopen est fermé par fclose mais:
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
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
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 ?
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 ?
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 ?
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
"Paul Bacelar" <paul.bacelar@PASDESPAMlaposte.net> wrote in
news:dtptq1$oqr$1@apollon.grec.isp.9tel.net:
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*.
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
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)
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)
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)
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.
> 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.
> 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.