2014-02-05 83 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,用於測試。 –