| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| rougie 
 
 
 Joined: 14 Jun 2006
 Posts: 31
 
 
 
			    
 
 | 
			
				| Forwards declaration Problem??? |  
				|  Posted: Tue Jan 06, 2009 7:54 pm |   |  
				| 
 |  
				| Hello, 
 I am using PCW Version 4.083
 
 The following code has been tested in VC++ and works without any errors. However in PCW compiler I get an error saying that it is expecting a "{" at the forwards declaration line?????
 
 Can someone please consider the following code:
 
  	  | Code: |  	  | #include <18f4685.h> #device  *=16
 #device  ADC=8             //Analogs
 #device  ICD=TRUE
 #case                           //TURNS ON CASE SENSITIVITY IN CODE
 
 #fuses   HS,NOLVP,NOWDT,PUT
 #use     delay(clock=40M, oscillator=10M)
 #fuses   H4
 
 #include <stdlib.h>              // CCS LIBRARY STANDARD LIBRARY
 
 typedef long *LR;
 typedef long WPARAM;
 typedef long LPARAM;
 
 struct tagWnd; // forward declaration    <<< error points here ????
 
 typedef struct tagHwnd{
 struct tagWnd *handle;
 } HWND;
 
 typedef LR (*WNDPROC)(HWND, long, int, int);
 
 typedef struct tagWnd{
 WNDPROC  lpfnWndProc;
 int      style;
 long     backGround;
 long     titleMsg;
 long     extra;
 } WND, *pWND;
 
 //CALLBACK FUNCTION
 LR callerFunction(LR(*WNDPROC)(HWND, long, int, int) ,HWND h, long m, int w, int l);
 
 LR KWP(HWND x, long m, int w, int l);
 
 int main()
 {
 return 0;
 }
 | 
 Thankyou all for your feedback.
 
 Robert
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  | 
	
		|  | 
	
		| ECACE 
 
 
 Joined: 24 Jul 2006
 Posts: 94
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 06, 2009 9:14 pm |   |  
				| 
 |  
				| CCS C is not C++.  I'm not familiar with how you are defining your structure, but it does not look correct.  DL the manual and take a look at page 39.  Below is a clip from that page in how to define a structure. 
 
  	  | Code: |  	  | struct data_record { int a [2];
 int b : 2; /*2 bits */
 int c : 3; /*3 bits*/
 int d;
 }data_var;
 | 
 
 Others on the forum may be able to help more with this.  Good luck.
 _________________
 A HW Engineer 'trying' to do SW !!! Run!!!
 |  | 
	
		|  | 
	
		| Cont Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Cont |  
				|  Posted: Tue Jan 06, 2009 10:22 pm |   |  
				| 
 |  
				| Hello PCM, 
 Are you saying that PCW does not support forwards declarations. Simply compiling this as a .c file in VC++ compiles without errors.
 
 It seems that in C, doing a forward declaration is pretty common... like this:
 ======================
 struct tagWnd; // forward declaration    <<< error points here ????
 
 typedef struct tagHwnd{
 struct tagWnd *handle;
 } HWND;
 
 typedef struct tagWnd{
 WNDPROC  lpfnWndProc;
 int      style;
 long     backGround;
 long     titleMsg;
 long     extra;
 } WND, *pWND;
 ===================================
 
 Unfortunately I don't see a resolution from the link you posted. Sorry!
 
 I am looking to know what I should modify in my code in order to make the forwards declaration work.
 
 Please get back with any other advice. Your help is much appreciated!
 
 Confused!
 
 Robert
 |  | 
	
		|  | 
	
		| bkamen 
 
 
 Joined: 07 Jan 2004
 Posts: 1617
 Location: Central Illinois, USA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 06, 2009 10:59 pm |   |  
				| 
 |  
				| Again, 
 Don't think C is C++.
 
 Even more important,
 
 NEVER think C on a microcontroller is going to be the same as C for a full blown OS. (like gcc or any MS big-os product).
 
 So to answer your question: Yes, VC++ might compile that just fine.
 
 But it's not C.
 
 And it's not C on an 8bit microcontroller.
 
 Look at the section in the manual again. It's quite clear about how to define structures.
 
 Regards,
 
 -Ben
 _________________
 Dazed and confused? I don't think so. Just "plain lost" will do.  :D
 |  | 
	
		|  | 
	
		| dyeatman 
 
 
 Joined: 06 Sep 2003
 Posts: 1968
 Location: Norman, OK
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 06, 2009 11:16 pm |   |  
				| 
 |  
				| Thanks bkamen and so now I add my two cents worth.. 
 As was said earlier CCS is an embedded compiler.  It is NOT considered (or intended) to be fully ANSI compliant. The CCS compiler is also less than 1/10th the size of VC++ and runs on a much less capable processor with a Harvard architecture.
 
 CCS DOES accept forward declarations of procedures because I do it all the time.  However, since it is not C++ it does not accept forward declaration of STRUCTS.  When I encountered this a few years ago I just accepted it and moved on by reordering my declarations.
 |  | 
	
		|  | 
	
		| bkamen 
 
 
 Joined: 07 Jan 2004
 Posts: 1617
 Location: Central Illinois, USA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 06, 2009 11:22 pm |   |  
				| 
 |  
				| Amen brother. _________________
 Dazed and confused? I don't think so. Just "plain lost" will do.  :D
 |  | 
	
		|  | 
	
		| rougie 
 
 
 Joined: 14 Jun 2006
 Posts: 31
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 07, 2009 2:35 pm |   |  
				| 
 |  
				| >Look at the section in the manual again. It's quite clear about how to >define structures. 
 Which manual?  I have the PIC Reference manual and the PIC micro by Nigel Gardner?????
 
 If its one of these is there a page #?
 
 Robert
 |  | 
	
		|  | 
	
		| ECACE 
 
 
 Joined: 24 Jul 2006
 Posts: 94
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 07, 2009 2:47 pm |   |  
				| 
 |  
				| See my original reply to you.  CCS manual, page 39. _________________
 A HW Engineer 'trying' to do SW !!! Run!!!
 |  | 
	
		|  | 
	
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Fri Jan 09, 2009 1:40 pm |   |  
				| 
 |  
				| I have two books related to CCS: 
 1-The ref manual
 2-The exercise book
 
 and I have a manual called "Pic Micro" from Nigel Gardner !
 
 None of which correlate my issue to p.39.
 
 The rest of my C books have nothing to do with CCS.
 
 Anyways defining the structure as shown below and then type casting any accessing operations to the handle pointer gets rid of the error:
 
 
  	  | Code: |  	  | typedef struct tagHwnd{ void *handle;
 } HWND;
 | 
 
 This is all I was looking for:    Amen!
 
 However, there is yet another issue with function pointers which I rather discuss it with CCS directly!
 
 Thanks all for your suggestions!
 
 Regards
 Robert
 |  | 
	
		|  | 
	
		| FvM 
 
 
 Joined: 27 Aug 2008
 Posts: 2337
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jan 09, 2009 4:43 pm |   |  
				| 
 |  
				| You possibly didn't understood it has an answer to your question, but ECACE simply mentioned the struct syntax definition in the CCS pdf manual. Although it's pdf page 51, it has a printed page number 39. As previously discussed, a struct declaration body (component list) is apparently required with CCS C. Thus your circular definition requiring a forward tag definition doesn't work. 	  | Quote: |  	  | None of which corolate my issue to p.39. | 
 
 If I understand right, ANSI C99 basically provides a forward reference for structs, so it's not wrong to expect it with CCS C, but as said, embedded compiler usually have limitations.
 
 I think, it can be done - less smart - by using an untypified pointer in the primary struct definition, that can be type casted later in ther code. I just realized, you already did.
 |  | 
	
		|  | 
	
		|  |