View previous topic :: View next topic |
Author |
Message |
Geps
Joined: 05 Jul 2010 Posts: 129
|
Creating Functions |
Posted: Wed Jul 21, 2010 3:05 am |
|
|
Hi,
I'm trying to create a function but the compiler (4.087) can't 'detect' my declares of the formal parameters and returns an Undefined Modifier error message. Where am I going wrong?
Code: |
void WriteData(char Data1[4], char Data2[4], char Data3[4], char Data4[4], int PageNum); //Function Prototype
void WriteData (char Data1[4], char Data2[4], char Data3[4], char Data4[4], int PageNum) {
#include <string.h>
if (PageNum == 0){ //error here
//code in here
}
}
|
When I declare the variable PageNum inside the function the program compiles fine. I've checked it against the PICmicro CCS C book by Nigel Gardner and it matches up with no obvious differences....
Cheers, |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Jul 21, 2010 3:16 am |
|
|
Move the #include line outside the function. It might be legal to do an include inside the function, but it is very uncommon. Problem is that in CCS the header files often contain code, so effectively you are inserting functions within your function which is illegal. |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed Jul 21, 2010 3:21 am |
|
|
Makes sense, thanks. Are the declarations right for the arguments? |
|
|
collink
Joined: 08 Jan 2010 Posts: 137 Location: Michigan
|
|
Posted: Wed Jul 21, 2010 5:38 am |
|
|
Geps wrote: | Makes sense, thanks. Are the declarations right for the arguments? |
Probably. One thing I might suggest is to never, ever use int and short and the like in your programs. The problem is that an int tends to be 8 bits on most (maybe all) PIC chips but could be 16 bits, 32 bits, 9 bits, who knows what on other architectures. If you get into the habit of explicitly defining the size you will never be surprised. As such, you might think of changing all your "int" to "int8". This is probably a small deal for you right now but sometimes accidentally getting a variable of a different size than you planned on can be bad. Also, it makes it more clear when reading the code. I like this also because I do a lot of desktop development where ints tend to be either 16 or 32 bit so seeing int8 reminds me that I cannot be putting 16 bit values into that variable. |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed Jul 21, 2010 7:24 am |
|
|
Cheers collink.
I converted the type to Char and it compiles fine. Can anyone please explain how/why? |
|
|
collink
Joined: 08 Jan 2010 Posts: 137 Location: Michigan
|
|
Posted: Wed Jul 21, 2010 7:36 am |
|
|
How or why what? Why does it compile fine when you use char even though it's really an integer? Because char and int8 are the same type in CCS. Characters have, as far as I know, never been anything other than numeric types in C. Numeric types can be used as characters. There's not a whole lot of distinction. It's perfectly legal to do this:
Code: |
int16 myVar;
myVar = 100 + 'C';
|
Geps wrote: | Cheers collink.
I converted the type to Char and it compiles fine. Can anyone please explain how/why? |
|
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed Jul 21, 2010 7:39 am |
|
|
That's why I'm confused. My prototype and fucntion now read:
Code: | void WriteData(char Data1, char Data2, char Data3, char Data4, char PageNum); |
And it compiles fine....As you say they're the same :S It's all rather confusing!
(The 'data's are no longer arrays as well but the problem wasn't with those. |
|
|
collink
Joined: 08 Jan 2010 Posts: 137 Location: Michigan
|
|
Posted: Wed Jul 21, 2010 7:45 am |
|
|
Geps wrote: | That's why I'm confused. My prototype and fucntion now read:
Code: | void WriteData(char Data1, char Data2, char Data3, char Data4, char PageNum); |
And it compiles fine....As you say they're the same :S It's all rather confusing!
(The 'data's are no longer arrays as well but the problem wasn't with those. |
Yes, it might be confusing at first but C allows you to treat integers as characters and characters as integer as you see fit. This allows for some good things. For instance, it makes switching between uppercase and lower case really easy. |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed Jul 21, 2010 7:48 am |
|
|
No sorry I meant why one version compiles and the other doesn't. |
|
|
collink
Joined: 08 Jan 2010 Posts: 137 Location: Michigan
|
|
Posted: Wed Jul 21, 2010 7:52 am |
|
|
Geps wrote: | No sorry I meant why one version compiles and the other doesn't. |
Oh, sorry... Yes, that's strange. All you changed was int to char? |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed Jul 21, 2010 7:59 am |
|
|
Yup. I moved the code around onto my Main.c page, changed 'if else's to 'select case's and lots of other little things but the code that the lines between declaring and used the variable didn't change apart from the different type.
Maybe an internal bug that reset itself somehow? Hmmm...... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Jul 21, 2010 10:04 am |
|
|
Rememebr that if the type is 'char', as opposed to char[] or char*, the handling of the data in the function has to change. In the former, you receive a char value. In the latter cases, you receive a pointer _to_ a char value. Your use of the variables inside the function has to match the data arriving. It sounds as if it doesn't....
Best Wishes |
|
|
|