Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2015, à 11:19

dva2tlse

[RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Bonjour le forum; j'ai déjà posé ici des questions relatives au développement que j'ai à faire. C'est un gros programme en fortran, enfin gros pour moi en tous cas, qui ne suis pas du tout développeur mais ingénieur mécanicien, et le problème qui se pose à moi est que lors de la lecture d'un des fichiers d'entrée, il se produit l'erreur suivante :

	At line 2189 of file /S/DATA/DVA/F90/BN/p2srfd.f
	Fortran runtime error: Bad value during integer read

C'est une banale lecture dans une variable indicée comme il y en a des dizaines d'autres :

	read(MDana(Tana), '(I1, I1)') Mana, Dana

    Pour ceux qui ne parlent pas le fortran, ça vaut dire qu'on lit dans la variable MDana(Tana); c'est une chaine de deux caractères, et chacun est interprété comme un entier, pour remplir les variables entières Mana et Dana.

En essayant avec un autre fichier d'entrée, qui est lu et dont les deux millions de lignes sont mis en mémoire dès le début du programme, il se produit la même erreur au même endroit et je ne la vois qu'en redirigeant la sortie vers un fichier temporaire que j'examine, sinon l'écran devient illisible, pire que les dernières lignes que j'ai sélectionnées ici, et je suis obligé de réinitialiser le  terminal pour pouvoir recommencer à travailler. Ceci me fait supposer qu'une espèce de caractère fantôme ne veut pas se laisser lire, et serait un séquence escape-bidule que je connais mal, ou l'envoie au terminal quand j'essaye de l'afficher pour voir ce qui se passe.
(il y a cinq fichiers d'entrée, un seul de sortie, et quelques autres temporaires ou d'entrées facultatives selon les options choisies)
   

      file1='PY/premier-526PYL-MR3.ana' -> Ok au début, puis...
fabmat:00 Les perturbations sont :  41 00 00 00 00, ltmp=     2202  22024100000000   0.00  0.00                                          
fabmat:00 Pert's :  41 00 00 00 00, ltmp=     2202  22024100000000   0.00  0.00, lana+imat= 1966 +    81 =  2047
fabmat:00 Les perturbations sont :  4
fabmat:00 Les perturbations sont :  4 ®
fabmat:00 Les perturbations sont :  4 ® $Î
fabmat:00 Les perturbations sont :  4 ® $Î «
fabmat:00 Les perturbations sont :  4 ® $Î « ?K
fabmat:00 Les perturbations sont :  4 ® $Î « ?K, ltmp=     2202  22024®$Ϋ?Kõ®ì\u0152?•0$=r¡¿ , lana+imat= 1966 +    82 =  2048
      file1='PY/deuxième-111PYLON-MR3.ana' -> Ok au début, puis...
fabmat:00 Pert's :  81 71 00 00 00, ltmp=     2202  22028171000000   0.00   0.00, lana+imat= 1867 +   180 =  2047
fabmat:00 Les perturbations sont :  8
fabmat:00 Les perturbations sont :  8 ®
fabmat:00 Les perturbations sont :  8 ® $Î
fabmat:00 Les perturbations sont :  8 ® $Î «
fabmat:00 Les perturbations sont :  8 ® $Î « ?K
fabmat:00 Les perturbations sont :  8 ® $Î « ?K, ltmp=     2202  22028®$Ϋ?Kõ®ì\u0152?•0$=r¡¿                                        
fabmat:00 Pert's :  8 ® $Î « ?K, ltmp=     2202  22028®$Ϋ?Kõ®ì\u0152?•0$=r¡¿, lana+imat= 1867 +   181 =  2048
      file1='PY/troisième-211PYL-MR2.ana' -> Ok au début, puis...	
fabmat:00 Pert's :  81 00 00 00 00, ltmp=     2307  23078100000000   0.00   0.00, lana+imat= 1684 +   363 =  2047
fabmat:00 Les perturbations sont :  8
fabmat:00 Les perturbations sont :  8 ®
fabmat:00 Les perturbations sont :  8 ® $Î
fabmat:00 Les perturbations sont :  8 ® $Î «
fabmat:00 Les perturbations sont :  8 ® $Î « ?K
fabmat:00 Les perturbations sont :  8 ® $Î « ?K, ltmp=     2307  23078®$Ϋ?Kõ®ì\u0152?•0$=r¡¿                                        
fabmat:00 Pert's :  8 ® $Î « ?K, ltmp=     2307  23078®$Ϋ?Kõ®ì\u0152?•0$=r¡¿, lana+imat= 1684 +   364 =  2048

On voit aussi, que bien que les fichiers soient structurés légèrement différemment, l'erreur se produit toujours au même moment qui est la 2048-ième lecture. (avant la position de lecture, 2047 qui marche, et 2048 qui plante, j'ai fait s'afficher la taille des blocs du fichier d'entrée qui ont été lus jusqu'à présent, et on voit [loin à droite] que la taille du premier bloc, qui lui à été lu complètement, diffère d'un fichier à l'autre)
Et ce nombre 2048 me fait tilt à l'instant en écrivant, serait ce une limitation informatique quelconque ou quelque chose que je n'aurai déclaré qu'à 2K ?

Est-ce que quelqu'un aurait une idée de vérification à faire ? Toutes les idées et questions sont bienvenues puisqu'elles pourraient m'amener à vérifier une chose à laquelle je n'aurais pas pensé et qui pourrait peut-être m'amener à comprendre le problème.
Merci,
David

Dernière modification par dva2tlse (Le 30/01/2015, à 09:29)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#2 Le 27/01/2015, à 12:06

claudius01

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

dva2tlse a écrit :

...En essayant avec un autre fichier d'entrée, qui est lu et dont les deux millions de lignes sont mis en mémoire dès le début du programme...
...Et ce nombre 2048 me fait tilt à l'instant en écrivant, serait ce une limitation informatique quelconque ou quelque chose que je n'aurai déclaré qu'à 2K ?

1) Quelle est la taille d'un tel fichier ?
2) 2048 est effectivement un nombre "poétique" qui fait penser à la taille d'un buffer mémoire définie par l'application voire le système.
3) Il faut remonter au code qui recopie les données lues du fichier vers le buffer mémoire puis suivre celui-ci pour déterminer avant toute chose s'il est intègre avant toute manipulation...

Hors ligne

#3 Le 27/01/2015, à 12:20

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Bonjour claudius,
le fichier fait un peu plus de 50 gigas; je ne comprends pas ce que tu veux dire par "suivre"; mais il n'est pas impossible qu'en effet les lignes lues soient mises en mémoire de façon déjà impropre; je vais vérifier ça,
Merci,
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#4 Le 27/01/2015, à 12:27

credenhill

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

hello
voir avec les commandes od ou hd si il y a un caractère spécial à cette position dans le fichier.

En ligne

#5 Le 27/01/2015, à 12:45

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Merci credenhill,
ça va me donner du boulot pour six mois de tout vérifier octet par octet ;-), mais je ne connaissais pas la commande "od";
Je ne vois pas l'intérêt de "hd" puisque le man (sur une red-hat) me parle de disque.
en tout cas merci,
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#6 Le 27/01/2015, à 12:57

credenhill

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

essayer hexdump (hd c'est hexdump avec certains params.)
ces commandes affichent un compteur à gauche, qui permet de localiser immédiatement 2048

En ligne

#7 Le 27/01/2015, à 13:04

pingouinux

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Bonjour,
1) Il faudrait visualiser la chaîne de 2 caractères MDana(Tana) au moment de l'erreur, car elle doit contenir autre chose que des chiffres
2) Je suis d'accord avec claudius01 pour la piste du 2048. Y a-t-il des tableaux dimensionnés à cette valeur ?
3) Voir éventuellement l'encodage du fichier de données
4) Vérifier aussi la compatibilité des déclarations de variables (integer*4, integer*8, …)

Hors ligne

#8 Le 27/01/2015, à 13:28

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Merci à tous, j'ai refait tourner mon programme avec de sorties de contrôle supplémentaires; en particulier la partie ltmp(i:i+9) qui est la sous-chaine extraite d'une ligne du fichier d'entrée; c'est cette sous-chaine qui devrait être lue en cinq groupes de deux entiers; et on voit bien dès la première ligne de chaque section, que la 2047 est "propre" alors que la 2048 contient quelques insanités.

fabmat:00 ltmp(i:i+9)= :8200000000:
fabmat:00 Les perturbations sont :  82
fabmat:00 Les perturbations sont :  82 00
fabmat:00 Les perturbations sont :  82 00 00
fabmat:00 Les perturbations sont :  82 00 00 00
fabmat:00 Les perturbations sont :  82 00 00 00 00
fabmat:00 Les perturbations sont :  82 00 00 00 00, ltmp=     2307  23078200000000   0.00   0.00
fabmat:00 Pert's :  82 00 00 00 00, ltmp=     2307  23078200000000   0.00   0.00 , lana+imat= 1689 +   358 =  2047

fabmat:00 ltmp(i:i+9)= :7®$Ϋ?K:
fabmat:00 Les perturbations sont :  7
fabmat:00 Les perturbations sont :  7 ®
fabmat:00 Les perturbations sont :  7 ® $Î
fabmat:00 Les perturbations sont :  7 ® $Î «
fabmat:00 Les perturbations sont :  7 ® $Î « ?K
fabmat:00 Les perturbations sont :  7 ® $Î « ?K, ltmp=     2307  23077®$Ϋ?Kõ®ì\u0152?·0$=r¡¿
fabmat:00 Pert's :  7 ® $Î « ?K, ltmp=     2307  23077®$Ϋ?Kõ®ì\u0152?·0$=r¡¿, lana+imat= 1689 +   359 =  2048

Donc je continue mon exploration pour trouver la cause intiale de tout ceci, parce que si je traite par petits bouts de 2000 lignes alors que j'en ai deux millions, ça va me faire mille fichiers temporaires, PAS GLOP.
Merci et à bientot, dés que j'ai avancé,
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#9 Le 27/01/2015, à 14:50

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Après avoir un peu avancé :
Quand j'édite "à la main" le fichier d'entrée dont l'image en mémoire déconne et que je me place sur la bonne ligne, elle est parfaitement "propre"; donc ce doit être la "bufferisation" qui patine, et comme j'ai besoin que ces informations soient en mémoire, je cherche encore.


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#10 Le 28/01/2015, à 10:16

credenhill

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

l'indexation du tableau commence à 0 plutôt qu'à 1 ?

En ligne

#11 Le 28/01/2015, à 11:00

claudius01

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Excellente remarque ;-)
D'après Fortran - 7. Arrays (The index of the real arrays A and B start at 1 while the index for the integer array C starts at 0.)
Et donc en Fortran, les indices de tableaux commencent à 1.

Hors ligne

#12 Le 28/01/2015, à 12:43

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

En f77 l'indexation commence à 1, mais en gfortran que j'utilise on peut commencer à 0 à condition de le déclarer, ce que je fais parfois, mais dans aucun des tableaux qui entrent en jeu ici.

Et j'ai encore un peu avancé; j'ai vérifié que le sous programme lecana, qui lit le fichier d'entrée gigantesque que j'appelle le ".ana" fonctionnait bien, et qu'il me remplissait correctement la table de deux millions de chaines de quarante caractères, représentant chacune une ligne du ".ana";
par contre, un autre sous-programme lit un autre fichier, le ".pch", en six boucles. Et ça change l'image en mémoire du grand tableau quelque part entre le milieu de la troisième boucle et celui de la quatrième.

Pourtant ce sous-programme n'agit pas du tout sur le grand tableau de lignes, puisque j'ai même dû le rajouter en argument d'entrée quand j'ai vu qu'il devenait corrompu pendant le déroulement de ce sous-programme lecpch.
Hédonc je m'apreçois que la 2048-ième ligne du tableau change pendant le déroulement de ce sous programme lecpch alors que rien ne semble le provoquer.

Si vous avez des idées, merci de me les donner pour avancer encore un peu.
David


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#13 Le 28/01/2015, à 13:20

pingouinux

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Ça ressemble fort à des tableaux insuffisamment dimensionnés, ou à des zones de mémoire qui se recouvrent (instruction EQUIVALENCE ou COMMON, par exemple)

Hors ligne

#14 Le 28/01/2015, à 13:59

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Oui en effet, ça ressemble, mais je n'ai ni EQUIVALENCE ni COMMON dans ce programme, et une version précédente a déjà marché avec le grand tableau de deux millions de lignes;  mais c'était avant que je ne crée le sous-programme lecpch, pendant le déroulement duquel le grand tableau change. (alors que ce sous-programme n'y touche pas).
GRRR.

Dernière modification par dva2tlse (Le 28/01/2015, à 14:11)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#15 Le 28/01/2015, à 14:13

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Le sous-programme lecpch lit des données (de contraintes) dans le ".pch", dans l'ordre où arrivent les éléments (finis), d'abord des QUAD's, puis des ROD's, puis des TRIA's (qui sont traités par la même portion de programme que les QUAD's).
Et ce sont les premiers QUAD's de la boucle 4 qui font changer le tableau.


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#16 Le 28/01/2015, à 14:23

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Et ce sont les premiers QUAD's de la boucle 4 qui font changer le tableau. Et même LE premier; après le dernier TRIA (donc le dernier élémént) de la boucle 3, le grand tableau est Ok. Mais après le premier QUAD de la boucle 4, qui est aussi le premier élément, le tableau devient pourri.


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#17 Le 28/01/2015, à 14:29

claudius01

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

A ce stade et pour éviter de relire et/ou instrumenter le code, il est intéressant voire indispensable de passer un outil comme Valgrind (cf. un cas de Détection dépassement de tableau ;-).
D'ailleurs même lorsque cela fonctionne très bien, il est bon de passer de tels outils sauf si on ne veut pas se faire peur (il y a tellement de programmes qui tombent en marche...)

Hors ligne

#18 Le 28/01/2015, à 14:36

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Oui merci de me suggérer ça, parce que j'en connaissais l'existence sans l'avoir jamais utilisé ni vraiment savoir en détail à quoi ça servait; donc je vais regarder la doc' et peut être me lancer.


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#19 Le 28/01/2015, à 14:47

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Mais par contre il faudrait que j'envoie tout chez moi pour bosser "chez ma maison" pour pouvoir l'installer direct avec les liens apt, alors qu'ici au boulot, les machines sont des red hat, dont je ne sais même pas si c'est du debian, et si les admiin's peuvent installer des choses facilement. Enfin je SAIS que NON parce qu'ils ont du boulot par dessus la tête, m'enfin je vais demander en passant par un chef qu'il va falloir convaincre.

  [.../...]

Et ce que j'ai vu en commençant à potasser un peu de doc' me refroidit encore; ça parle de C/C++ et non de fortran. Donc je vais plutôt continuer d'instrumenter mon programme comme je l'ai fait jusqu'à maintenant.

Dernière modification par dva2tlse (Le 28/01/2015, à 14:54)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#20 Le 28/01/2015, à 15:25

claudius01

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

A priori aucun souci car tu a écris au post #12 que tu utilisais gfortran...
cf. Debugging Memory Issues with Valgrind et FORTRAN90 Examples of the VALGRIND Memory Leak Detector avec l'exemple memleak que j'ai testé avec succès sur un Ubuntu 12.04 ;-)
Cela fonctionne car en final, que le programme soit écrit en C, C++ ou Fortran, l'analyse s'effectue sur le code assembleur exécuté associé aux informations de débogage générées par "gcc -g ... " ou "gfortran -g ..." ;-)

Dernière modification par claudius01 (Le 28/01/2015, à 15:46)

Hors ligne

#21 Le 29/01/2015, à 08:41

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Ok pour valgrind avec le fortran; maintenant il faut que je convainque mon chef pour le faire installer, puisque chez moi je n'ai qu'un petit PC ordinaire, alors qu'ici, je peux utiliser 19 coeurs de la RED HAT.


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#22 Le 29/01/2015, à 09:34

pingouinux

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Est-ce que le problème apparaît si tu tournes sur un seul processeur ?

Hors ligne

#23 Le 29/01/2015, à 13:31

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Là n'est pas le problème, pour l'instant je ne tourne que sur un seul proc'; les 19 c'est pour les runs de production qui tournent une nuit ou 20 heures avec 11000 éléments; là je n'en traite que 3, en 90s, et donc sur un seul proc'.

Et j'ai fini par localiser que ça chiait à l'élément 123 de la quatrième boucle mais je n'ai pas encore scruté le fichier d'entrée à cet endroit.

Dernière modification par dva2tlse (Le 29/01/2015, à 14:49)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#24 Le 29/01/2015, à 15:15

dva2tlse

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

Heu... En fait il n'y a pas d'emplacement précis du fichier d'entrée avec ce que je croyais être un "caractère fantôme" puisque à chaque fois que je change le code, pour affiner ce que je supposais être une localisation dangereuse, la ligne à partir de laquelle le programme affiche des insanités change; ce qui doit bien vouloir signifier que ça dépend du remplissage de la mémoire.
Alors peut-être que Valgrind m'aiderait... ?


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#25 Le 29/01/2015, à 16:09

credenhill

Re : [RéSOLU] erreur simpliste lors de la lecture d'un entier sur un car.

et cette option ?
-fsanitize=bounds
    This option enables instrumentation of array bounds. Various out of bounds accesses are detected. Flexible array members and initializers of variables with static storage are not instrumented.

En ligne