|
|
View previous topic :: View next topic |
Author |
Message |
Rich_Man
Joined: 05 Dec 2013 Posts: 6
|
passing structures to functions by reference |
Posted: Tue Dec 31, 2013 12:53 pm |
|
|
I am trying to pass a structure to a function by reference to be able to return several variables. It is not working. I feel like I have done this many times in other compilers, but I don't know why it's not working.
Here is the code:
Code: |
typedef struct _struc_data
{
int a;
int b;
}struc_data;
void test_function(struc_data * s_temp)
{
*s_temp->a = 1;
*s_temp->b = 2;
return;
}
void main()
{
struc_data s_data;
s_data.a = 22;
s_data.b = 33;
printf("before a = %d b = %d\r\n", s_data.a, s_data.b);
test_function(&s_data);
printf("after a = %d b = %d\r\n", s_data.a, s_data.b);
return;
}
|
the output is:
before: a = 22 b = 33
after: a = 22 b = 33
does anyone know why it is not returning the correct values? |
|
|
Rich_Man
Joined: 05 Dec 2013 Posts: 6
|
|
Posted: Tue Dec 31, 2013 1:12 pm |
|
|
OK, this works, but I'm not sure why. I've not done it this way before.
Code: |
void test_function([struc_data* s_temp)
{
s_temp->a = 1;
s_temp->b = 2;
return;
}
|
I have tried Code: | test_function(struc_data *s_temp) |
and Code: | test_function(struc_data * s_temp) |
but that didn't work.
it's this that works Code: | test_function(struc_data* s_temp) |
Could someone explain the difference? Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Dec 31, 2013 2:33 pm |
|
|
This is wrong:
Quote: |
void test_function(struc_data *s_temp)
{
*s_temp->a = 1;
*s_temp->b = 2;
}
|
This is correct:
Quote: |
void test_function(struc_data *s_temp)
{
s_temp->a = 1;
s_temp->b = 2;
}
|
In other words, you do not use an asterisk to access a structure pointer
inside a function.
Moving the asterisk around inside the function parameter list, as you did
below, shouldn't make any difference at all:
Quote: |
I have tried
test_function(struc_data *s_temp)
and:
test_function(struc_data * s_temp)
but that didn't work.
it's this that works:
test_function(struc_data* s_temp) |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19568
|
|
Posted: Wed Jan 01, 2014 1:56 am |
|
|
Just to explain a fraction further. This is the difference between '->', and '.', when accessing a structure.
The latter, is used to access an element inside a structure.
If you have a pointer to a structure, you can then use:
*structureptr.element
So you are using '*' to say 'this is a pointer to a structure', and then accessing the element inside this.
The former says 'access the element inside the structure pointed to by'.
So if you have a pointer to a structure you use:
structureptr->element
So the -> form already says 'this is a pointer to a structure', and replaces the '* .' construction.
With your:
*s_temp->a = 1;
You are saying 'locate the structure pointed to by s_temp, then use this structure as a pointer'.....
No wonder it has problems.
As a separate 'comment', get rid of the return at the end of main. There is nowhere to return 'to'. Remember that in CCS, you are not running inside an OS, your code is the entire program. Then realise that if this was on a real chip and using the hardware UART, the code would not work. The last couple of characters being send by the printf, would never be sent. Reason is that since the code drops off the end into 'nowhere', at this point CCS puts a 'sleep' instruction, to prevent code walking off through memory, doing unexpected things. So the chip would go to sleep before the last couple of characters in the hardware buffering had sent.....
As a further comment, K&R, calls -> the 'structure pointer operator'. Says it all.
Just to pick up on one other point, your thread title talks about 'by reference'. This is not access 'by reference'. You are passing a pointer, and accessing through a pointer. In C passing 'by reference', uses a different syntax and operation. You code as:
Code: |
typedef struct _struc_data
{
int a;
int b;
}struc_data;
void test_function(struc_data & s_temp)
{
s_temp.a = 1;
s_temp.b = 2;
return;
}
void main()
{
struc_data s_data;
s_data.a = 22;
s_data.b = 33;
printf("before a = %d b = %d\r\n", s_data.a, s_data.b);
test_function(s_data); //note no &
printf("after a = %d b = %d\r\n", s_data.a, s_data.b);
while (TRUE); //stop dropping off the end
}
|
No use of pointers at all!....
In C, 'by reference', just uses the '&' construct in the function declaration. The structure is then treated as if it is 'local' to this function, using the '.' form for access, and the compiler hands the 'reference' of the variable to the function as if it is a local parameter. No pointer accessing, or passing of values at all.
Have a good New Year. |
|
|
Rich_Man
Joined: 05 Dec 2013 Posts: 6
|
|
Posted: Tue Jan 07, 2014 9:50 am |
|
|
Thanks for all the good information and help. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|