2014-02-05 55 views
0

在z/os主机上工作时,出现以下情况。我无法记录交易。 这里是我的代码, 它是使用jcl编写的事务。 Bur有些事情出错了。我的C代码有什么问题?

/* Include standard C header files */   
#include <ctype.h>    
#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>        
/* Include WebSphere MQ API header file */  
#include <cmqc.h>        
/* Boolean constants */   
#define TRUE 1     
#define FALSE 0        
/* Function prototypes */   
void displayUsage (char *programName);   
void displayMQError (char *message, MQLONG compCode, MQLONG reason);  
double parseAmount (char *amountString);   
/* Main Program    */ 

int main (int argc, char *argv[]) 
{   
    /* Variable definitions */  
    double paymentAmount;      /* Payment amount  */ 

    MQBYTE msgBuffer[1024];     /* Buffer for messages */ 

    MQCHAR* qmgrName; /* Queue manager name */ 
    MQCHAR* requestQueueName;     /* Request queue name */ 
    MQCHAR* replyQueueName;     /* Reply queue name  */ 
    MQCHAR* userID; /* Contestant user ID */ 
    MQCHAR* paymentDescription;    /* Payment description */ 

    MQGMO getMsgOptions = {MQGMO_DEFAULT}; /* Get options   */ 

    MQHCONN hConn = MQHC_UNUSABLE_HCONN;  /* Connection handle */ 

    MQHOBJ requestHObj = MQHO_UNUSABLE_HOBJ; /* Request queue handle */ 
    MQHOBJ replyHObj = MQHO_UNUSABLE_HOBJ; /* Reply queue handle */ 

    MQLONG compCode; /* API completion code */ 
    MQLONG openOptions;      /* Open queue options */ 
    MQLONG reason; /* API reason code  */ 
    MQLONG replyMsgLength = 0;    /* Reply msg length  */ 

    MQMD  requestMsgDesc = {MQMD_DEFAULT}; /* Message descriptor */ 
    MQMD  replyMsgDesc = {MQMD_DEFAULT};  /* Message descriptor */ 

    MQOD  requestQueueDesc = {MQOD_DEFAULT}; /* Object descriptor */ 
    MQOD  replyQueueDesc = {MQOD_DEFAULT}; /* Object descriptor */ 

    MQPMO putMsgOptions = {MQPMO_DEFAULT}; /* Put options   */ 

    /*****************************************/ 
    /* Initialisation and parameter checking */ 
    /*****************************************/ 

    printf ("********************************************************\n"); 
    printf ("Credit card payment unit test tool\n"); 
    printf ("********************************************************\n"); 
    printf (" \n");     

    switch (argc) 
    {  
    case 7 : qmgrName   = argv[1];  
       requestQueueName = argv[2];  
       replyQueueName = argv[3];  
       userID   = argv[4];  

       paymentAmount = parseAmount (argv[5]);      

       if ((paymentAmount < 0.01)  
       || (paymentAmount > 9999.99)) 
       {     
       printf ("The payment amount must be a valid numeric " \ 
"within the range 0.01 to 9999.99\n");   

       displayUsage (argv[0]);   
       return (1);  
       }     

       paymentDescription = argv[6];  

       if ((strlen (paymentDescription) < 1)     
       || (strlen (paymentDescription) > 35))    
       {     
       printf ("The payment description must be 1-35 " \  
"characters\n");   

       displayUsage (argv[0]);   
       return (1);  
       }     

       break;    

    default : printf ("Incorrect usage!\n");  
       displayUsage (argv[0]);   
       return (1);   
    }  

    printf ("You have requested a payment of %.2f with description " \  
      "'%s' for contestant %s\n", paymentAmount,      
      paymentDescription, userID);   

    printf (" \n");     

你能帮我吗? 我不知道如何编写我的Parm参数...

+0

发生了什么让你说“它出错了”?你期望什么?请包括一些示例输出。 – wallyk

+0

如果没关系,请拜托,看看我的问题 - 我的问题在这里是sequal:http://stackoverflow.com/questions/21578650/parm-value-not-interpreted-as-expected – user3275068

+0

你试过我在另一个问题上提出了非常简单的PARM? –

回答

2

当您遇到问题时,尝试通过程序跟踪所有输出回输入。

从您的其他问题之一:

********************************************************       
Credit card payment unit test tool       
********************************************************       

Incorrect usage!                 

Program Usage                 
-------------                 

PAYMENT <queue manager> <cics request queue> <reply queue> <userid> <payment value> <payment description> 

The payment description has a maximum length of 35 characters.     

The monetary value must be within the range 0.01 - 9999.99 

的前两行是很容易解释。最后两行,并非如此。他们在那里闪烁我们,因为确切的文字出现在节目中。但是,似乎在displayUsage函数中使用完全相同的文本。

在不同的错误情况下显示相同的文本是不好的。这就是为什么我们使用消息编号 - 消息可能是相同的,但编号将确切地标识它来自哪里。

线索是,你甚至不能得到一个非常简单的PARM被接受。

另一个线索是Incorrect usage!

何时打印该信息?当有不止七个参数时。错......但你只供应六个。

所以,如果应该有六个参数,程序是错误的。如果你应该提供七个参数,你的PARM是错误的。

您可以

// PARM='A,B,C,D,1,F,G' 

,将工作证明这一点。

顺便说一句,为什么使用switch而不是简单的if呢?使用if会使问题更加明显。

+0

谢谢你的好意,你试图帮助我解决我的问题!我参加了zos挑战赛,但我不想赢,我只想明白,为什么,在哪里我错了,因为我想在未来与大型机一起工作 如果可以的话,请看看我的任务,这里是 - 这部分任务在第13-16页 [任务](https://www.ibm.com/developerworks/community/groups/service/HTML/communityview?lang = en&communityUuid = 5ce0f094-4621-4d69-bbe0-5e9f2456fdb0#fullpageWidgetId = W23a3dd8f28d7_4ca2_94d0_fddadfc5da77&file = 4596ad45-ef27-4547-838b-dab41a99b5f7) – user3275068

+0

我已经完成了所有步骤,如上所述 - 您已经在我的jcl-code中看到了它: 1)我创建了JCL集合和成员支付,检查语法和修复错误使用sdfc, 2)我复制成员COMPPAY成员COMPPAY在我的JCL集。然后我改变了++ userid ++,因为它在任务中描述给我的用户ID,提交了COMPPAY - 所以加载模块为我编译, 3)然后提交我的工作 - 以及你知道的工作状态。 关于参数 - 有6个,不是7. SDFC显示没有语法错误。但我如何运行我的工作?也许,我运行它不是在正确的地方,必须运行它,例如。使用CICS ?. – user3275068

+0

幽默我。尝试使用第七个参数运行它,即使应该只有六个参数。我给了你一个简化的六参数PARM,并且你说你得到了同样的信息。试试七。 C代码需要七个参数。记住这是一场比赛。尝试7,并重新显示JCL和输出,如果这不起作用。不,请不要在CICS下运行它。该程序应该假装为CICS,用于测试。 –