Correct way to pass arguments to this function

This is a discussion on Correct way to pass arguments to this function within the C Programming forums, part of the General Programming Boards category; Hi, I have a standard Internet Checksum function as follows: Code: uint16_t checksum_f(uint16_t *addr, uint32_t length) { register long sum ...

  1. #1
    Registered User
    Join Date
    Mar 2008
    Posts
    25

    Correct way to pass arguments to this function

    Hi,

    I have a standard Internet Checksum function as follows:

    Code:
    uint16_t checksum_f(uint16_t *addr, uint32_t length) {
    
    
    register long sum = 0;
    while (length > 1) {
    sum += * (unsigned short *) addr++;
    length -= 2;
    }
    if (length > 0)
    sum += * (unsigned char *) addr;
    while (sum >> 16)
    sum = (sum & 0xFFFF) + (sum >> 16);
    return ~sum
    }
    If I wanted to calculate a checksum for the following two things, how would I correctly pass in the parameters to the checksum function:

    Code:
    typedef struct DATE {
    
    
    uint16_t year; uint8_t month; uint8_t day;
    }
    Code:
    int main () {
    
    
    DATE tx *txPtr DATE *rxPtr uint8_t rx_buffer[100]; uint16_t checksum1, checksum2; txPtr = &tx; // this will get filled with date information at some point rxPtr = (DATE *)rx_buffer; // rx buffer contains a date // now assume there is data in each // what do you pass in to get the checksum of the data contained in the rx and tx structs? checksum1 = checksum_f(?, ?); checksum2 = checksum_f(?, ?);
    }
    Thanks!
    Last edited by eponymous; 03-18-2008 at 10:00 AM.

  2. #2
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    checksum_f(rxPtr , sizeof (DATE));

    I suppose
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  3. #3
    Registered User
    Join Date
    Mar 2005
    Location
    Mountaintop, Pa
    Posts
    1,059
    Give this a try...
    Code:
    typedef struct {
    	uint16_t year;
    	uint16_t month;
    	uint16_t day;
    }DATE;
    Code:
    int main(void)
    {
    	DATE tx = {1976, 03, 27};
    	DATE *txPtr = {0};
    	DATE *rxPtr = {0};
    	uint16_t rx_buffer[100] = {1974, 02, 25};
    	uint16_t checksum1 = 0;
    	uint16_t checksum2 = 0;
    	uint16_t test[3] = {0};
    	txPtr = &tx; // this will get filled with date information at some point
    	rxPtr = (DATE *)rx_buffer; // rx buffer contains a date
    	memcpy(test, txPtr, sizeof DATE);
    	checksum1 = checksum_f(test, sizeof test);
    	memset(test, 0, sizeof test);
    	memcpy(test, rxPtr, sizeof DATE);
    	checksum2 = checksum_f(test, sizeof test);
    	return 0;
    }

  4. #4
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    why do you need memcpy? Just a waste of CPU power moreover - if DATE has some padding - you are getting a buffer overrun
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  5. #5
    Registered User
    Join Date
    Mar 2005
    Location
    Mountaintop, Pa
    Posts
    1,059
    Quote Originally Posted by vart View Post
    why do you need memcpy? Just a waste of CPU power moreover - if DATE has some padding - you are getting a buffer overrun
    Because this will NOT work...
    checksum_f(rxPtr , sizeof (DATE));

    I suppose
    You're trying to use a DATE variable for the 1st parm of the function which requires an unsigned int pointer. Thus, I used memcpy to convert the DATE variable to a variable that is compatible with the function.
    Last edited by BobS0327; 03-19-2008 at 05:50 AM. Reason: clarification

  6. #6
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    You're trying to use a DATE variable
    Not DATE but pointer to DATE - so simple casting will be enogh

    memcpy just overcomplicates things, and potentially (not very likely but still) could have some side effects due to padding
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  7. #7
    Registered User
    Join Date
    Mar 2005
    Location
    Mountaintop, Pa
    Posts
    1,059
    Quote Originally Posted by vart View Post
    Not DATE but pointer to DATE - so simple casting will be enogh

    memcpy just overcomplicates things, and potentially (not very likely but still) could have some side effects due to padding
    It really should be a unsigned int pointer not a pointer to DATE.

    This

    checksum_f(rxPtr , sizeof (DATE));
    should be this

    Code:
    checksum_f((uint16_t *) rxPtr , sizeof (DATE));

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Beginner Needs help in Dev-C++
    By Korrupt Lawz in forum C++ Programming
    Replies: 20
    Last Post: 09-28-2010, 01:17 AM
  2. dllimport function not allowed
    By steve1_rm in forum C++ Programming
    Replies: 5
    Last Post: 03-11-2008, 03:33 AM
  3. Replies: 9
    Last Post: 01-02-2007, 03:22 PM
  4. <Gulp>
    By kryptkat in forum Windows Programming
    Replies: 7
    Last Post: 01-14-2006, 12:03 PM
  5. Contest Results - May 27, 2002
    By ygfperson in forum A Brief History of Cprogramming.com
    Replies: 18
    Last Post: 06-18-2002, 01:27 PM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21