|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Dans ce cas, ton compilateur cobol microfoc... est complètement débile et ne tient pas compte des règles de base du Cobol ANS.
Quand tu définis une zone PIC S9(1), le S représente le signe et le 9(1) le nombre maxi de chiffres que peut comporter la zone. Dans ce cas, c'est 1 seul chiffre de -9 à +9. Ton programme ne marchera jamais correctement sur des ordinateurs dignes de ce nom. |
|
|
10
|
|
|
#22 | |||
|
Membre Expert
![]() ![]() |
Et pourtant même les deux compilateurs Microsoft 4.5 et IBM Cobol/2 donnent le bon résultat attendu :
Citation:
Code :
|
|||
|
|
10
|
|
|
#23 | |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
Il y a cadrage à droite dans la zone réceptrice VCOMP-3 et les 3 premiers 9 du nombre 9999 sont perdus, c'est à dire la partie la plus significative. Seul subsiste le 9 de l'unité car VCOMP-3 est défini sur un seul chiffre 9(1), peu importe son usage. Disons que ces deux compilateurs sont un peu moins débiles que le Cobol Microfocus mais un peu seulement puisqu'ils acceptent d'additionner 9999 dans une zone trop petite pour contenir le résultat. Y-a-t-il au moins un warning à la compil ? |
|
|
|
10
|
|
|
#24 | |||
|
Membre Expert
![]() ![]() |
Citation:
Aucun warning de troncature signalé, d'autres compilateurs l'auraient fait sur l'addition. Code :
|
|||
|
|
10
|
|
|
#25 |
|
Nouveau Membre du Club
![]() Inscription : mai 2008 Messages : 80 ![]() |
Bonjour,
Je vous ai mis un tableau en pièces jointes des possibilités de range pour une déclaration en COMP. Par exemple : Déclaration PIC S9(1) COMP à PIC S9(4) COMP Range -9999 à +9999 2 bytes Je ne sais pas si j'interprète correctement, mais pour une déclaration en PIC S9(1), 2 octets seront utilisés en mémoire, d'où la possibilité de mettre 9999 avec mon compilateur "débile" Mais, j'utilise deux octets alors que je n'en déclare qu'un.... J'ai peur que ça écrase la variable qui suit en working, je vais vérifier... |
|
|
00
|
|
|
#26 |
|
Nouveau Membre du Club
![]() Inscription : mai 2008 Messages : 80 ![]() |
Bon... Vous avez raison... Même si mon compilateur permet d'alimenter la variable déclarée en PIC 9(1) COMP-3 avec la valeur 9999 et d'afficher ce résultat.... il en est tout autre dans son utilisation... Dans son utilisation, je n'ai que la valeur 9.
PomPomPom... Au final, je suis repassé en USAGE BINARY en testant en dur la valeur 255 (cf le problème initial). Merci pour votre aide... quand j'aurai un peu de temps je reviendrai sur ce poste. J'ai appris des choses, c'est cool |
|
|
00
|
|
|
#27 | ||||||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 096 ![]() |
Citation:
Par contre, il existe avec le COBOL z/OS un nouveau format COMP-5 dit 'native binary' qui permet de s'affranchir de ce type de problématique. Citation:
Code :
VDISPLAY= 9999 VCOMP-5 PIC S9 COMP-5 |
||||||
|
|
10
|
|
|
#28 | ||
|
Membre Expert
![]() ![]() |
Citation:
Citation:
Il n'y a aucun risque d'écrasement ou d'empiètement dans la WSS, ton compilateur saura se démerder. En plus il saura bien gérer les alignements nécessaires sur demi-mot ou simple mot pour les niveaux 01. Pour le niveau 77, il n'y a pas d'alignement. Les risques d'extension (étalement) dans les diverses sections de la Data Division proviennent d'une mauvaise utilisation des pointeurs, et pour certains compilateurs, des indices des tableaux, des zones à longueur variable et du facteur de blocage. |
||
|
|
10
|
|
|
#29 | ||||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
Dans la mesure où le compilateur MF accepte HIGH-VALUE, je ne vois pas pourquoi il n'accepterait pas LOW-VALUE. Je voudrais savoir la valeur que tu obtiens en mettant HIGH-VALUE et LOW-VALUE dans une zone déclarée en binaire. Peux-tu refaire un essai tel qu'illustré au post #9 de ce fil sous Cobol MF en remplaçant simplement le MOVE X"00" par MOVE LOW-VALUE ? _____________________________________________________________ Citation:
Citation:
_____________________________________________________________ Citation:
|
||||
|
|
10
|
|
|
#30 | ||
|
Nouveau Membre du Club
![]() Inscription : mai 2008 Messages : 80 ![]() |
Citation:
Citation:
C'est bien ça le COMP-5, ça marche dans l'utilisation que j'ai de la variable sur 1 digit bien que ce ne soit aps très portable. Mais, c'est toujours le même problème, la zone est tronquée lors de son utilisation dans les programmes... @Mercure : je referai le test sur le LOW-VALUE. |
||
|
|
00
|
|
|
#31 | |
|
Membre à l'essai
![]() Jean Développeur Grands Systèmes IBM Inscription : août 2008 Messages : 24 ![]() |
Citation:
En résumé, HIGH-VALUE et LOW-VALUE n'est pas utilisable pour des variables numériques codées en binaire. D'autre part, pour maîtriser réellement le nombre de digit réellement utilisés il vaut mieux faire le déclaration en PIC 9(n). ou en PIC 9(n) PACKED-DECIMAL. Le BINARY ou COMP pouvant être variable suivant la bécane cible et des paramètres d'optimisation demandés à la compilation (on peut se retrouver avec une zone mémoire sur 16, 32 voire 64 bits alors qu'on pense en avoir qu'un seul octet --Sur IBM je n'ai pas rencontré de problème de ce genre, c'était sur HP9000 il y a une douzaine d'années et un compilo un peu exotique il me semble, méfiance quand même--). @+ PS: attention à la perte de performance, si l'on fait des calculs sur des valeurs DISPLAY ou PACKED-DECIMAL toutes les bécanes n'ayant pas les instructions matérielles pour cela (Opérateur Décimal) ces valeurs sont converties en binaire ou en flottant pour effectuer l'opération puis le résultat doit vers converti dans l'autre sens. |
|
|
|
10
|
|
|
#32 | |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Citation:
|
|
|
|
10
|
|
|
#33 | ||||||
|
Nouveau Membre du Club
![]() Inscription : mai 2008 Messages : 80 ![]() |
Salut et merci pour votre participation.
@Mercure, j'ai un peu de temps, je fais le test maintenant Résultat NUMDISPLAY = 255 ! Il y avait une façon encore plus simple : DATA DIVISION. Code :
Mais mon deuxième problème est de stocker ces deux octets... dans une zone alpha sur un caractère... et ce n'est pas possible Y a-t-il une astuce? Si je redécoupe une zone alphanumérique comme suit : Code :
Et si je le fais comme ça : Code :
|
||||||
|
|
00
|
|
|
#34 | |||||
|
Nouveau Membre du Club
![]() Inscription : mai 2008 Messages : 80 ![]() |
Citation:
|
|||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com