passing a parameter

Discussion in 'C++' started by muser, Sep 14, 2003.

  1. muser

    muser Guest

    How can I pass the parameter " long part_num[6], into a case
    statement. Case statement follows the function CheckDigit.

    i.e. CheckDigit( something, temp1 );

    Thank you for your help in advance.


    bool CheckDigit(long part_num[6], char* record)
    {

    int weightingfactor;
    int remainder;
    int weightitem1, weightitem2, weightitem3, weightitem4, weightitem5;
    int product;
    int Mod11 = 11;
    int checkdigit;
    char partnum[6];




    strncpy(partnum, &record[7], 6);
    partnum[6] = '\0';
    part_num[6] = atol( partnum );



    weightingfactor = 6;

    weightitem1 = (part_num[1] * weightingfactor);

    weightingfactor = 5;

    weightitem2 = (part_num[2] * weightingfactor);

    weightingfactor = 4;

    weightitem3 = (part_num[3] * weightingfactor);

    weightingfactor = 3;

    weightitem4 = (part_num[4] * weightingfactor);

    weightingfactor = 2;

    weightitem5 = (part_num[5] * weightingfactor);




    product = (weightitem1 + weightitem2 + weightitem3 + weightitem4 +
    weightitem5);

    remainder = (product % Mod11);

    checkdigit = (Mod11 - remainder);
    if(!part_num[6] == checkdigit)
    return false;


    return true;

    } case 'i':
    case 'I':
    case 'r':
    case 'R':
    ProcessIRecord( prnfile, temp1 );
    CheckDigit( temp1 );
    break;
     
    muser, Sep 14, 2003
    #1
    1. Advertising

  2. muser wrote:

    > How can I pass the parameter " long part_num[6], into a case
    > statement.


    I don't understand that question. You don't pass parameters to "case
    statements" (there's really no such thing as a case statement).

    > Case statement follows the function CheckDigit.
    >
    > i.e. CheckDigit( something, temp1 );
    >
    > Thank you for your help in advance.
    >
    >
    > bool CheckDigit(long part_num[6], char* record)


    Please not that you are not, in fact, passing an array to this function.
    The type of part_num is actually "long *". Therefore it may be prudent
    to also pass in the length of the array pointed to by part_num. The 6 in
    this case has no meaning (the compiler ignores it).

    Also, prefer std::string to char* for dealing with strings.

    > {
    >
    > int weightingfactor;
    > int remainder;
    > int weightitem1, weightitem2, weightitem3, weightitem4, weightitem5;


    Why not

    int weightitem[5];

    or

    std::vector<int> weightitem(5);

    ?

    > int product;
    > int Mod11 = 11;


    Is this really any better than just using the magic number 11? Use a
    descriptive name or don't use a name at all.

    > int checkdigit;
    > char partnum[6];


    Prefer std::string to char arrays when dealing with strings.

    >
    > strncpy(partnum, &record[7], 6);


    Are you quite sure you can index that far into record?

    > partnum[6] = '\0';


    This is illegal. The last valid index for partnum is 5.

    > part_num[6] = atol( partnum );


    If part_num is actually 6 elements long as you suggest, then this is
    illegal. The last valid index is 5.

    Also, atol is a very unsafe function. strtol would be better. using
    strings and streams (istringstream for this conversion) would be better
    still. Another good option would be something like boost::lexical_cast
    or your own conversion function (using one of the safe methods).

    > weightingfactor = 6;
    > weightitem1 = (part_num[1] * weightingfactor);
    > weightingfactor = 5;
    > weightitem2 = (part_num[2] * weightingfactor);
    > weightingfactor = 4;
    > weightitem3 = (part_num[3] * weightingfactor);
    > weightingfactor = 3;
    > weightitem4 = (part_num[4] * weightingfactor);
    > weightingfactor = 2;
    > weightitem5 = (part_num[5] * weightingfactor);


    OK.... Why did you not use an array or vector, then loop to do this? Or
    at least eliminate weightingfactor by multiplying by the magic number
    directly.

    >
    > product = (weightitem1 + weightitem2 + weightitem3 + weightitem4 +
    > weightitem5);
    >
    > remainder = (product % Mod11);
    >
    > checkdigit = (Mod11 - remainder);
    > if(!part_num[6] == checkdigit)


    Another bad index, probably.

    > return false;


    Indent that so people can see it goes with the 'if'. Better yet, enclose
    it in {}.

    >
    >
    > return true;
    >
    > }
    > case 'i':
    > case 'I':
    > case 'r':
    > case 'R':
    > ProcessIRecord( prnfile, temp1 );
    > CheckDigit( temp1 );
    > break;


    I'm afraid I still don't understand what you are asking. But your
    CheckDigit call here is missing a parameter.

    -Kevin
    --
    My email address is valid, but changes periodically.
    To contact me please use the address from a recent posting.
     
    Kevin Goodsell, Sep 14, 2003
    #2
    1. Advertising

  3. muser

    White Wolf Guest

    muser wrote:
    > How can I pass the parameter " long part_num[6], into a case
    > statement. Case statement follows the function CheckDigit.

    [SNIP]

    You cannot. The switch in C and C++ supports only integer values, not
    arrays.

    --
    WW aka Attila
     
    White Wolf, Sep 14, 2003
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    4
    Views:
    536
    Matteo
    Mar 29, 2007
  2. Stuart Redmann
    Replies:
    5
    Views:
    496
    Stuart Redmann
    Dec 14, 2007
  3. Replies:
    5
    Views:
    651
  4. Isti
    Replies:
    2
    Views:
    736
  5. Mister B
    Replies:
    8
    Views:
    570
    Nick Keighley
    Aug 26, 2010
Loading...

Share This Page