Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   passing pointer as function parameter (http://www.velocityreviews.com/forums/t444357-passing-pointer-as-function-parameter.html)

Roman Mashak 09-14-2006 08:08 AM

passing pointer as function parameter
 
Hello,

I belive the reason of problem is simple, but can't figure out.

This is piece of code:

struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

extern void proc_v4(char *, ssize_t, struct timeval *);
....

int main(void)
{
static char recvbuf[BUFSIZE];
ssize_t n;
struct timeval tv2;

...

proc_v4(recvbuf, n, &tv2);
}

void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
{
struct icmp *icmp;
...
/* here I parse IP packet and address pointer on ICMP packet */
...
tvsend = (struct timeval *) icmp->icmp_data;
}

The problem is after calling proc_v4() the value of 'tv2' doesn't change,
what I can't understand, because I pass pointer, and then re-assign pointer
into another one.

Where is the problem? Thanks a lot.

With best regards, Roman Mashak. E-mail: mrv@tusur.ru



T.M. Sommers 09-14-2006 08:29 AM

Re: passing pointer as function parameter
 
Roman Mashak wrote:
> Hello,
>
> I belive the reason of problem is simple, but can't figure out.
>
> This is piece of code:
>
> struct timeval {
> long tv_sec; /* seconds */
> long tv_usec; /* microseconds */
> };
>
> extern void proc_v4(char *, ssize_t, struct timeval *);
> ...
>
> int main(void)
> {
> static char recvbuf[BUFSIZE];
> ssize_t n;
> struct timeval tv2;
>
> ...
>
> proc_v4(recvbuf, n, &tv2);
> }
>
> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
> {
> struct icmp *icmp;
> ...
> /* here I parse IP packet and address pointer on ICMP packet */
> ...
> tvsend = (struct timeval *) icmp->icmp_data;


What you probably want to do is assign values to the elements of
tvsend. Even if you had done everything else right (and you
haven't), icmp->icmp_data might cease to exist when proc_v4 ends,
depending on where it came from, so you don't want to keep a
pointer to it unless you know that it will live on.

> }
>
> The problem is after calling proc_v4() the value of 'tv2' doesn't change,
> what I can't understand, because I pass pointer, and then re-assign pointer
> into another one.
>
> Where is the problem? Thanks a lot.


You aren't doing what you think you are doing. What you think
you are doing is something like:

struct timeval *tv2;
proc_v4(..., &tv2);

This is very different from what you are really doing.

--
Thomas M. Sommers -- tms@nj.net -- AB2SB


=?ISO-8859-1?Q?=22Nils_O=2E_Sel=E5sdal=22?= 09-14-2006 08:33 AM

Re: passing pointer as function parameter
 
Roman Mashak wrote:

> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
> {
> struct icmp *icmp;
> ...
> /* here I parse IP packet and address pointer on ICMP packet */
> ...
> tvsend = (struct timeval *) icmp->icmp_data;

This line assigns to the tvsend pointer. the tvsend pointer
is local to this function.

You want to assign to what it points at rather, as the caller pointed
it at a struct timeval it can access:

*tvsend = *(struct timeval *) icmp->icmp_data;

Or
struct timeval *tmp

tmp = (struct timeval *) icmp->icmp_data;
tvsend->tv_sec = tmp->tv_sec;
tvsend->tv_usec = tmp->tv_usec;

> }


Another problem is icmp->icmp_data; might indeed not values
a struct timeval that your platform can understand..
(alignment problems, padding and endianess might skew things)


Default User 09-14-2006 05:59 PM

Re: passing pointer as function parameter
 
Roman Mashak wrote:


> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
> {
> struct icmp *icmp;
> ...
> /* here I parse IP packet and address pointer on ICMP packet */
> ...
> tvsend = (struct timeval *) icmp->icmp_data;
> }
>
> The problem is after calling proc_v4() the value of 'tv2' doesn't
> change, what I can't understand, because I pass pointer, and then
> re-assign pointer into another one.


That's covered in the FAQs:

<http://c-faq.com/ptrs/passptrinit.html>




Brian

Roman Mashak 09-15-2006 01:06 AM

Re: passing pointer as function parameter
 
Hello, Default!
You wrote on 14 Sep 2006 17:59:36 GMT:

??>> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
??>> {
??>> struct icmp *icmp;
??>> ...
??>> /* here I parse IP packet and address pointer on ICMP packet */
??>> ...
??>> tvsend = (struct timeval *) icmp->icmp_data;
??>> }
??>>
??>> The problem is after calling proc_v4() the value of 'tv2' doesn't
??>> change, what I can't understand, because I pass pointer, and then
??>> re-assign pointer into another one.

DU> That's covered in the FAQs:

DU> <http://c-faq.com/ptrs/passptrinit.html>
Hm, I'm confused. FAQ reecommends to pass the function address of pointer.
Is it considered to be a "right standard confirming way" ?
On the other hand: passing just pointer and assigning the value to what the
pointer points at (as was proposed by Nils O. Selasdal) - works well.

Which way is correct?

Thank you.

With best regards, Roman Mashak. E-mail: mrv@tusur.ru



Keith Thompson 09-15-2006 01:26 AM

Re: passing pointer as function parameter
 
"Roman Mashak" <mrv@tusur.ru> writes:
> Hello, Default!
> You wrote on 14 Sep 2006 17:59:36 GMT:
>
> ??>> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
> ??>> {
> ??>> struct icmp *icmp;
> ??>> ...
> ??>> /* here I parse IP packet and address pointer on ICMP packet */
> ??>> ...
> ??>> tvsend = (struct timeval *) icmp->icmp_data;
> ??>> }
> ??>>
> ??>> The problem is after calling proc_v4() the value of 'tv2' doesn't
> ??>> change, what I can't understand, because I pass pointer, and then
> ??>> re-assign pointer into another one.
>
> DU> That's covered in the FAQs:
>
> DU> <http://c-faq.com/ptrs/passptrinit.html>
> Hm, I'm confused. FAQ reecommends to pass the function address of pointer.
> Is it considered to be a "right standard confirming way" ?
> On the other hand: passing just pointer and assigning the value to what the
> pointer points at (as was proposed by Nils O. Selasdal) - works well.
>
> Which way is correct?


It depends on what you want to do.

In general, if you have a FOO, and you want a function to modify its
value for you, you need to pass the function a FOO* (i.e., you pass it
a pointer to a FOO so it can modify your FOO).

If the FOO itself happens to be a pointer to something (i.e., you want
the function to modify a pointer object for you), then passing a FOO*
means passing a pointer-to-pointer-to-something.

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.

Default User 09-15-2006 06:27 PM

Re: passing pointer as function parameter
 
Roman Mashak wrote:

> Hello, Default!
> You wrote on 14 Sep 2006 17:59:36 GMT:


> DU> <http://c-faq.com/ptrs/passptrinit.html>
> Hm, I'm confused. FAQ reecommends to pass the function address of
> pointer. Is it considered to be a "right standard confirming way" ?
> On the other hand: passing just pointer and assigning the value to
> what the pointer points at (as was proposed by Nils O. Selasdal) -
> works well.
>
> Which way is correct?


Ok, I think I confused your post with one in a different thread.




Brian


All times are GMT. The time now is 01:59 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.