CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Problem with a Structure....

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
JAM2014



Joined: 24 Apr 2014
Posts: 138

View user's profile Send private message

Problem with a Structure....
PostPosted: Mon Feb 03, 2020 5:43 pm     Reply with quote

Hi All,

Admittedly a Structure 'newbie' here.....

I have the following structure definition:
Code:

typedef struct _AzElInfo
{
   int16 AZ;
   int8 EL;
} AzElInfo;


I try to use the elements in the Structure like this:
Code:

AzElInfo.AZ = 90;
AzElInfo.EL = 90;


But, for each I get the compiler error 'element is not a member'!

Compiler is PCH v5.050

What am I doing wrong?

Jack
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Feb 03, 2020 5:49 pm     Reply with quote

You typedef'ed it. This creates a type. You should then use the type
to declare an instance of the structure. Here's an example:

This test program compiles with no errors:
Code:
#include <18F46K22.h>
#fuses INTRC_IO, NOWDT, BROWNOUT, PUT, NOPBADEN
#use delay(clock=4M)
#use rs232(baud=9600, UART1, ERRORS)

typedef struct _AzElInfo
{
   int16 AZ;
   int8 EL;
} AzElInfo;

AzElInfo my_struct;

//==============================
void main()
{

//AzElInfo.AZ = 90;
//AzElInfo.EL = 90;


my_struct.AZ = 90;
my_struct.EL = 90;



while(TRUE);
}
JAM2014



Joined: 24 Apr 2014
Posts: 138

View user's profile Send private message

PostPosted: Tue Feb 04, 2020 4:16 pm     Reply with quote

Hi PCM,

I actually wanted that TypeDef, but I should have mentioned those details explicitly. This structure exists in an include file that handles the decoding/parsing of a data string passed to it. After reading your reply, I realized I needed to do the following:

Code:

AzElInfo->AZ = 90; //<--- This is test code. An actual calculation goes here!


In my main program I have the following:

Code:

   //Needed for the AZ_EL_Decode Parsing Routines.....
   AZELInfo MyAZELInfo;

   //Here we put the Az & El data into the AZEL structure...
   AZEL_decode(Msg_Buffer, &MyAZELInfo);

Azimuth = MyAZELInfo.AZ;
Elevation = MyAZELInfo.EL;


It's all working like a champ now! Very Happy

Thanks!

Jack
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Feb 04, 2020 10:29 pm     Reply with quote

I don't like your comment here:
JAM2014 wrote:

//Needed for the AZ_EL_Decode Parsing Routines.....
AZELInfo MyAZELInfo;

Your comment implies that the line of code above is a "bodge" designed
to get around a limitation or something.

But in fact, it's needed to create an instance of the structure defined
in the typedef statement. If that line is not there, the compiler will
not allocate any RAM for the structure. It will not exist.

This method, typedef of a structure and the creation of an instance of it,
is part of the C language. It's not a bodge.

Here I've made a test program with two structures. One is typedef'ed
and the other is not:
Code:

#include <18F46K22.h>
#fuses INTRC_IO, NOWDT, BROWNOUT, PUT, NOPBADEN
#use delay(clock=4M)
#use rs232(baud=9600, UART1, ERRORS)

// This one is typedef'ed:
typedef struct _AzElInfo_typdef
{
   int16 AZ;
   int8 EL;
} AzElInfo_typedef;


// This one is not:
struct _AzElInfo_not_typedef
{
   int16 AZ;
   int8 EL;
} AzElInfo_not_typedef;

//==============================
void main()
{


while(TRUE);
}


Now let's look at the .SYM file to see how the compiler allocated RAM:
Quote:

000 @SCRATCH
001 @SCRATCH
001 _RETURN_
002 @SCRATCH
003 @SCRATCH
004 rs232_errors
005-007 AzElInfo_not_typedef
F55 CCP_5
F55 CCP_5_LOW
F56 CCP_5_HIGH
F58 CCP_4_LOW
F58 CCP_4
F59 CCP_4_HIGH

We see that it allocated RAM for the structure that's not typedef'ed,
but it did not do it for the typdef'ed one.

If you create a typedef, it is essential to use the new type to declare
an instance of the type, to get the compiler to actually create it in RAM.
Ttelmah



Joined: 11 Mar 2010
Posts: 19225

View user's profile Send private message

PostPosted: Wed Feb 05, 2020 1:24 am     Reply with quote

To 'reinforce' this, it is worth simply 'reading the manual'.
Quote from the typedef manual page:
Quote:

The identifier does not allocate space but rather may be used as a type specifier in other data definitions


Typedef is a way of declaring a 'shorthand' for a declaration. It declares a
new type by name, that can then be used to declare variables. It does
not itself declare the variable.
JAM2014



Joined: 24 Apr 2014
Posts: 138

View user's profile Send private message

PostPosted: Mon Feb 10, 2020 5:15 pm     Reply with quote

Hello PCM,

Of course, everything you say is 100% correct! Thank you for your help, and for reiterating that point!

That comment was poorly worded! Sometimes I cut-n-paste comments with minimal editing, and this was one of them. I should have done a better job!

Thanks again for the reminder! Very Happy

Jack
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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