Comment réparer un U4038 dans un programme simple
Je suis en train d'exécuter un simple programme COBOL sur z/OS du Système central. Le programme ne s'ouvre et se ferme d'un fichier. Il se compile sans erreur mais quand je le lance j'obtiens un U4038
abend.
C'est le code du programme:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7- | --+----8
IDENTIFICATION DIVISION.
PROGRAM-ID. LISTKSDS
AUTHOR. TestingUser
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO DATAIN
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY EST-KEY
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD INFILE.
COPY EST01.
WORKING-STORAGE SECTION.
01 VARIABLES.
05 WS-FILE-STATUS PIC X(2).
LINKAGE SECTION.
PROCEDURE DIVISION.
DISPLAY "STARTING PROGRAM.."
PERFORM INITIALIZATION
PERFORM TERMINATION
GOBACK.
INITIALIZATION.
DISPLAY "OPENING FILE.."
OPEN INPUT INFILE
IF WS-FILE-STATUS IS NOT EQUAL TO '00'
THEN
GO TO ERROR-EXIT
END-IF.
TERMINATION.
CLOSE INFILE.
ERROR-EXIT.
Travail de compilation:
//TESTUSEC JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP1 EXEC IGYWCL,PARM=(LIB)
//SYSLIB DD DSN=TES.COPIES.TEST,DISP=SHR
//COBOL.SYSIN DD DSN=TES.SOFT.SRC(SRC04),DISP=SHR
//LKED.SYSLMOD DD DISP=SHR,DSN=TES.SOFT.LIB
//LKED.SYSIN DD *
ENTRY LISTKSDS
NAME LISTKSDS(R)
/*
//*
Travail à fournir:
//TESTUSEC JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=TES.SOFT.LIB,DISP=SHR
//*
//STEP1 EXEC PGM=LISTKSDS,REGION=2M
//DATAIN DD DSN=TES.VS.TEST,DISP=SHR
//*
- Aussi vous avez remarqué que vous n'avez aucune
//SYSOUT DD SYSOUT=?
où ? est ce que vous devez utiliser pour votre sortie (site-défini). Cela signifie que vous avez deux bobine entrées pour votre TRAVAIL (avec le même JOBNO) et de votre ÉCRAN de sortie est probablement dans la première, et probablement la Langue de l'Environnement message ainsi.
Vous devez vous connecter pour publier un commentaire.
Un
U4038
abend est un utilisateur abend qui vient de la Langue, l'Environnement, le "run-time" pour Mainframe programmes (il prend en charge plusieurs châssis langues).Vous avez plus d'informations à ce sujet. Si vous regardez votre bobine de sortie, je m'attend de vous pour être en mesure de trouver plus d'informations.
Vous avez spécifié un FICHIER d'ÉTAT de la clause sur la sélection de votre dossier, de sorte que le U4038 est peu probable d'être associées au fichier.
Cependant, il est probable que vous avez un problème de fichier qui est à la tête de ce problème de programme.
C'est probablement être le problème. Si elle n'est pas la problème, c'est un problème:
Je soupçonne que vous êtes l'obtention d'un non-zéro dans WS-FICHIER d'ÉTAT. Le paragraphe contenant c'est
PERFORM
ed, et laGO TO
est de vous emmener en dehors de la plage de l'EFFECTUER. Lorsque vous testez pour un non-zéro fichier d'état, il est toujours une bonne idée d'DISPLAY
la valeur non nulle que vous rencontrez.Utilisant ALLER À l'extérieur de la plage de l'exécution, est particulièrement mauvaise. Votre programme continuera à partir de la cible alinéa de l'ALLER et juste garder de tomber dans des séquentiellement dans le code suivant.
Vous n'avez pas de "code". Ainsi, le programme "tombe de la fin". Ce n'est pas une chose à faire, de sorte que vous obtenez une fin anormale.
Bien que nous ne pouvons pas voir le contenu du cahier, la chose qui a donné la supposée non nulle fichier d'état se trouve probablement entre les deux, la définition de ce fichier, et le fichier que vous avez spécifié sur le DATAIN DD déclaration.
Plus probable est qu'il existe une disparité dans la taille des données définies dans votre programme pour le fichier nommé dans le JCL ou la clé définie dans le programme ne correspond pas au fichier dans le JCL.
Vous avez besoin de localiser le message supplémentaire dans votre bobine de sortie. Normalement aider beaucoup. Si vous ne pouvez pas l'obtenir à partir de cette pâte, de l'ensemble de la SYSOUT sortie de la step.
Vous êtes en utilisant un nombre minimal de points/périodes, mais il est préférable de les placer sur une ligne qui leur est propre, dans la colonne 12, de sorte qu'ils ne sont attachées à aucun code. Ensuite, vous ne pouvez pas copier le code et accidentellement à la fin avec l'arrêt complet/période de fondamentalement mauvais endroit.
Vous aurait également reçu un compilateur de diagnostic, que votre ERREUR-la SORTIE contient pas de code. Toujours regarder vos messages et corriger le code en conséquence.
Également prêter attention à l'indentation. Il n'a pas de signification pour le compilateur, mais vous format le code pour le lecteur humain, de sorte s'il vous plaît prêter attention à ce que, comme vous ne savez jamais quand vous serez un peu plus tard, ou l'un de vos coéquipiers à 2h du matin. Ou de votre tuteur/mentor de l'examen de votre travail.
Sur votre linkedit/bind vous avez spécifié DISP=SHR. Changement de DISP=VIEUX, s'il vous plaît. Si vous parvenez à exécuter deux linkedits dans le même temps, vous pouvez corbeille de votre bibliothèque.