2016-02-12 2 views
-1

Je serais très reconnaissant pour tout pointeur vers ce que c'est exactement que je fais mal avec le programme COBOL très minime, très trivial ci-dessous. Il arrondit un résultat avec l'outil standard de COBOL, l'élément de langage ROUNDED. L'arrière-pensée consiste à construire une application étendue et à appliquer une métrique temporelle à différents modes d'arrondi, étant donné une longue série d'opérations et des arrondis subséquents pour chaque mode. (Le motif encore plus inavoué est d'apprendre COBOL à rebours, il ne s'agit que d'un projet dans ce plan, puis d'essayer de décrocher un emploi en utilisant et en développant COBOL).Pourquoi la syntaxe d'arrondi de GnuCOBOL ne compile-t-elle pas?

Le programme est répertorié ci-dessous. Il effectue une addition simple, et le résultat est passé à une variable avec une largeur de données plus petite qui impose l'arrondi.

000100 IDENTIFICATION DIVISION. 
000200 PROGRAM-ID. ROUNDINGTEST. 
000300 ENVIRONMENT DIVISION. 
000400 DATA DIVISION. 
000500 WORKING-STORAGE SECTION. 
000600 01 OPERAND01 PIC S9(2)V9(4) VALUE 1.4745. 
000610 01 OPERAND02 PIC S9(2)V9(4) VALUE 1.9874. 
000610 01 RESULT PIC S9(2)V9(2). 
000700 PROCEDURE DIVISION. 
000800 PROGRAM-BEGIN. 
000900 COMPUTE RESULT ROUNDED MODE NEAREST-EVEN 
001000  = OPERAND01 + OPERAND02 
001010 END-COMPUTE 
001020 
001100 PROGRAM-DONE. 
001200 STOP RUN. 

La compilation avec le compilateur GnuCOBOL, comme ci-dessous, donne les résultats ci-dessous.

[email protected]:~/CobolProjects$ cobc -b ROUNDINGTEST.cob 
ROUNDINGTEST.cob: In paragraph 'PROGRAM-BEGIN': 
ROUNDINGTEST.cob:11: Error: syntax error, unexpected MODE 
[email protected]:~/CobolProjects$ 

Aucun échange du mode indiqué vers un autre mode, Troncature, Envers-Moins ... produit un changement. Commentant les lignes 000900, 001000 et 001010 donne une réponse sans erreur, donc clairement le problème n'est pas un problème en cascade de plus tôt dans le code ou toute forme de mésaventure syntaxique plus tard - c'est l'arrondi qui ne fonctionne pas.

GNU COBOL 2.0 (Anciennement OpenCobol) [11FEB2012 version] Guide du programmeur 2e édition 21 Novembre 2013

a la syntaxe COMPUTE comme ci-dessous

COMPUTE {identifiant-1 [arrondissement options] } ... = | EQUAL arithmétique-expression-1 [taille-error-clause] [END-COMPUTE]

et la syntaxe du qualificatif arrondi (arrondi au choix ci-dessus) 012 Où le «IS» est une option de lisibilité non obligatoire.

Compact et trivial que cela puisse paraître, aucune quantité de révision ou d'essai ne m'a réussi à réussir. Toute communication significative sur le sujet serait très appréciée.

+0

Un paragraphe/SECTION doit se terminer par un point/une période. Je reçois des résultats différents de votre échec (j'ai utilisé V2,0 du compilateur, pas la version 1.1) mais toujours un échec. Le message pourrait être meilleur (!), Si vous voulez vous connecter à l'espace GnuCOBOL sur SourceForge.net, cela pourrait provoquer une amélioration utile. Hey, vous pourriez même chercher à le coder vous-même. –

+0

Un paragraphe/SECTION doit en effet se terminer par un point/une période, et donc ils le font tous dans mon code, y compris PROGRAM-BEGIN. et PROGRAM-FAIT. le plus proche du point de défaillance. Quel message particulier est-ce qui pourrait être mieux, le message d'erreur du compilateur à travers le shell?Voulez-vous que je mette les options du compilateur pour qu'il y ait plus de viande dans le message d'erreur? Hm. J'ai l'impression que la zone de recherche est bien délimitée. – Titchmarsh

+0

SourceForge est un excellent prochain arrêt, cependant. Bonne suggestion. Soyez regarder dans bientôt. – Titchmarsh

Répondre

1

(Ceci devrait probablement être un commentaire, pas une réponse, mais voulait que la liste de codes apparaisse).

Cela fonctionne, comme le projet de loi a fait remarquer:

000100 IDENTIFICATION DIVISION.           
000200 PROGRAM-ID. ROUNDINGTEST.           
000300 ENVIRONMENT DIVISION.            
000400 DATA DIVISION.             
000500 WORKING-STORAGE SECTION.           
000600 01 OPERAND01 PIC S9(2)V9(4) VALUE 1.4745.      
000610 01 OPERAND02 PIC S9(2)V9(4) VALUE 1.9874.      
000610 01 RESULT PIC S9(2)V9(2).         
000700 PROCEDURE DIVISION.            
000800 PROGRAM-BEGIN.             
000900 COMPUTE RESULT ROUNDED MODE NEAREST-EVEN      
001000  = OPERAND01 + OPERAND02          
001010 END-COMPUTE             
001020 .                 
001100 PROGRAM-DONE.              
001200 STOP RUN.               

La période sur 1020 change l'état du compilateur de la recherche d'une autre déclaration au paragraphe-la recherche d'un nouveau paragraphe ou de la déclaration, qui pourrait être une étiquette.

+0

Tout ce que vous me dites est parfaitement logique, mon sentiment pour la façon dont les programmes COBOL doivent être répartis est exactement corroboré par ce que vous écrivez, seul mon compilateur me donne exactement le même message d'erreur pour toutes les combinaisons, sans période, avec la période seul sur 1020 ou avec la période juste après END-COMPUTE. Probablement, mon compilateur a un bug, ou GnuCOBOL n'est pas encore prêt pour ça. – Titchmarsh

+0

Il est clair que c'est une cause perdue. Aucune raison de s'enliser là-dedans. Je suis un débutant ici et je n'ai pas encore le droit de voter, alors je vais simplement écrire un merci à MM. Tiffin et Woodger pour leur temps et considération. – Titchmarsh

+0

@Titchmarsh En regardant de plus près, votre version du compilateur n'est pas 2.0, c'est une version antérieure qui ne supporte pas ROUNDED MODE IS. Essayez une version avec 'COMPUTE RESULT ROUNDED *> MODE NEAREST-EVEN', en commentant le MODE. Pas une cause perdue, juste un blip. –