[ Résolu] [Cobol] chaîne vers numérique

chaîne vers numérique [ Résolu] [Cobol] - Divers - Programmation

Marsh Posté le 20-12-2006 à 16:06:56    

:hello:  

 

Plantage du décor :
Deux variables :
05  CHAINE  PIC X(18).
05  NOMBRE PIC 9(18).

 

La variable CHAINE contient un numérique de taille variable (ça peut être 5 comme 523487936545632018).

 

Besoin : Mettre CHAINE DANS NOMBRE.

 

Problème : Ça ne marche pas quand on a 5 dans CHAINE (quand toute la chaîne n'est pas remplie). En debug, au moment du MOVE CHAINE TO NOMBRE j'ai INVALID DECIMAL.

 

Question : Comment faire ?

 

Idée : Je dois m'y prendre mal avec mes tentatives de cadrage à droite (JUST RIGHT) ou encore le remplacement (INSPECT CHAINE REPLACING LEADING SPACES BY ZEROES).

 


Merci pour vos réponses.

Message cité 1 fois
Message édité par Kilyn le 21-12-2006 à 13:08:17

---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 20-12-2006 à 16:06:56   

Reply

Marsh Posté le 20-12-2006 à 16:44:46    

Kilyn a écrit :

:hello:  
 
Plantage du décor :
Deux variables :  
05  CHAINE  PIC X(18).
05  NOMBRE PIC 9(18).
 
La variable CHAINE contient un numérique de taille variable (ça peut être 5 comme 523487936545632018).
 
Besoin : Mettre CHAINE DANS NOMBRE.
 
Problème : Ça ne marche pas quand on a 5 dans CHAINE (quand toute la chaîne n'est pas remplie). En debug, au moment du MOVE CHAINE TO NOMBRE j'ai INVALID DECIMAL.
 
Question : Comment faire ?
 
Idée : Je dois m'y prendre mal avec mes tentatives de cadrage à droite (JUST RIGHT) ou encore le remplacement (INSPECT CHAINE REPLACING LEADING SPACES BY ZEROES).
 
 
Merci pour vos réponses.


 
Essaye ca pour ta déclaration :  
05  CHAINE
     10 NOMBRE PIC 9(18).
 
ou meme avec un 88

Message cité 1 fois
Message édité par polo021 le 20-12-2006 à 16:45:25
Reply

Marsh Posté le 20-12-2006 à 17:17:51    

polo021 a écrit :

Essaye ca pour ta déclaration :
05  CHAINE
     10 NOMBRE PIC 9(18).

 

ou meme avec un 88


 :hello:

 

Merci pour ta réponse. Le problème c'est que je récupère le contenu d'une SYSIN dans CHAINE qui doit forcément être un PIC X. Et ta solution ne compile pas.

 


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 20-12-2006 à 17:24:01    

Ca fait longtemps que je n'ai plus fait de cobol mais quand tu déclares sur plusieurs niveaux, le niveaux supérieur est toujours implicitement reconnu comme du char.
Qu'as tu comme erreur qd tu compiles ceci ?
05 CHAINE2.
    10 NOMBRE PIC 9(18).
 
MOVE CHAINE (de ta sysin) TO CHAINE2.
 
 
ou bien quand tu compiles ceci? :  
05 CHAINE2 PIC X(18).
05 NOMBRE redefines CHAINE2 PIC 9(18).
 
MOVE CHAINE (de ta sysin) TO CHAINE2.

Message cité 1 fois
Message édité par polo021 le 20-12-2006 à 17:26:18
Reply

Marsh Posté le 20-12-2006 à 17:27:22    

polo021 a écrit :

Ca fait longtemps que je n'ai plus fait de cobol mais quand tu déclares sur plusieurs niveaux, le niveaux supérieur est toujours implicitement reconnu comme du char.
Qu'as tu comme erreur qd tu compiles ceci ?
05 CHAINE2.
    10 NOMBRE PIC 9(18).

 

MOVE CHAINE (de ta sysin) TO CHAINE2.

 


ou bien quand tu compiles ceci? :
05 CHAINE2 PIC X(18).
05 NOMBRE redefines CHAINE2 PIC 9(18).

Je viens de penser au REDEFINES donc j'attends la fin de la compilation (j'avais fait une faute de frappe pour le mot clé REDEFINES :pfff: ).

 

PS : Elle est longue cette compilation.

 



---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 20-12-2006 à 17:42:56    

Bon quel que soit la méthode ça me fait ça à la compilation :
Data items "CHAINE (ALPHANUMERIC REFERENCE MODIFIED ITEM)" and "NOMBRE (NUMERIC INTEGER)" had overlapping storage.  An overlapping move will occur at execution time
A reference modifier with a non-positive value was found.  A value of 1 was substituted.

Vais me pendre si on ne me débarasse pas de ce langage de @$^§.  :fou:


Message édité par Kilyn le 20-12-2006 à 17:44:46

---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 20-12-2006 à 18:03:50    

Bonjour,
 
Il n'existe pas de conversion implicite entre de l'alpha-numérique et du numérique en Cobol. Il faut donc écrire soi-même une routine de conversion ou utiliser celle d'une bibliothèque.
 
Voici un petit programme de conversion :

IDENTIFICATION DIVISION.
*=======================
PROGRAM-ID. STR2DEC.
* Programme pour convertir une chaine de caractère en un nombre
 
DATA DIVISION.
*=============
WORKING-STORAGE SECTION.
*-----------------------
77  INPUT_BUFFER         PIC X(10).
77  DECIMAL_NUMBER       PIC 9(10).
77  TMP1_NUM             PIC 9(10) COMP.
 
77  CHAR                 PIC X JUST.
77  NUM                  PIC 9.
77  I                    PIC 9(2).
* =================================================================
PROCEDURE DIVISION.
 
MAIN.
*----
*   1. Getting a string of characters
    DISPLAY "INPUT A DECIMAL NUMBER"
    ACCEPT INPUT_BUFFER
 
*   2. Converting a string of characters to a decimal number
    INITIALIZE DECIMAL_NUMBER
    MOVE 1 TO I
    MOVE INPUT_BUFFER(I:1) TO CHAR
    ADD 1 TO I
    PERFORM UNTIL CHAR < "0" OR > "9" OR I > 10
       MOVE CHAR TO NUM
       COMPUTE DECIMAL_NUMBER = DECIMAL_NUMBER * 10 + NUM
       MOVE INPUT_BUFFER(I:1) TO CHAR
       ADD 1 TO I
    END-PERFORM
 
    DISPLAY DECIMAL_NUMBER WITH NO ADVANCING
    STOP RUN
    .

Reply

Marsh Posté le 20-12-2006 à 18:17:41    

Bon ça marche avec le redefines. J'avais juste oublié d'enlever le MOVE CHAINE TO NOMBRE. :pfff:


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 20-12-2006 à 18:24:12    

\o/ j'ai pas tout oublié

Reply

Marsh Posté le 21-12-2006 à 12:50:58    

J'ai parlé trop vite. Ça ne marche pas. :cry:  J'opte donc pour la solution de olivthill. Il faudrait qu'il m'explique le type des variables et à quoi sert DECIMAL_NUMBER.


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 21-12-2006 à 12:50:58   

Reply

Marsh Posté le 21-12-2006 à 13:03:09    

olivthill a écrit :

Bonjour,

 

Il n'existe pas de conversion implicite entre de l'alpha-numérique et du numérique en Cobol. Il faut donc écrire soi-même une routine de conversion ou utiliser celle d'une bibliothèque.

 

Voici un petit programme de conversion :

 


 

Bon j'ai compris que DECIMAL_NUMBER était le nombre en sortie qu'on voulait. Et ça marche.  :love:  Suis trop contente. Merci à toi olivthill. Merci aussi à polo021 d'avoir essayé de m'aider. Grâce à vous et à ce forum je ne perds pas trop de temps sur ces difficultés techniques.  :jap:


Message édité par Kilyn le 21-12-2006 à 13:03:45

---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed