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 |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
![](templates/subSilver/images/spacer.gif) |
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!!! |
|
![](templates/subSilver/images/spacer.gif) |
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 |
|
![](templates/subSilver/images/spacer.gif) |
bkamen
Joined: 07 Jan 2004 Posts: 1611 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 |
|
![](templates/subSilver/images/spacer.gif) |
dyeatman
Joined: 06 Sep 2003 Posts: 1924 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. |
|
![](templates/subSilver/images/spacer.gif) |
bkamen
Joined: 07 Jan 2004 Posts: 1611 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 |
|
![](templates/subSilver/images/spacer.gif) |
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 |
|
![](templates/subSilver/images/spacer.gif) |
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!!! |
|
![](templates/subSilver/images/spacer.gif) |
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 |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Fri Jan 09, 2009 4:43 pm |
|
|
Quote: | None of which corolate my issue to p.39. | 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.
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. |
|
![](templates/subSilver/images/spacer.gif) |
|