View previous topic :: View next topic |
Author |
Message |
frierray
Joined: 11 Nov 2008 Posts: 29
|
Missing a very fundamental point |
Posted: Tue Nov 11, 2008 11:19 am |
|
|
I am new to C programming and am missing a very fundamental point. I do a lot of programming in assembler and use subroutines all the time. I can't find a way to go to a function (subroutines?), do something and then return.
void buff_data()
{
if (k==0x23) // test for end char
clear_pw(); // check the password entered ***
}
void clear_pw()
{
// my clear pw code would go here
// nothing need to be returned
}
I get a error 12 ,,, Undefinded Identfier -- clear_pw
Can any one give me some help on this. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Tue Nov 11, 2008 11:32 am |
|
|
In C the compiler starts at the top and works down trying to compile.
I think your problem is not showing a function prototype.
So it doesn't know about the functions that show up latter.
Code: |
//I am new to C programming and am missing a very fundamental point.
//I do a lot of programming in assembler and use subroutines all the
//time. I can't find a way to go to a function (subroutines?), do something
//and then return.
#define FIRM_MAJOR 'D'
#define FIRM_MINOR 02
#define HARD_MAJOR 2
#define HARD_MINOR '+'
//#include <18F4525.h>
//#include <18F2221.h>
#include <16F877.h>
#use delay(clock=10000000, restart_wdt)
#fuses hs,nowdt,noprotect,nolvp,put
#use rs232(baud=19200,xmit=PIN_B0,invert,stream=DEBUG) // stderr(same as debug)
#case
#zero_ram
int8 k=0;
//function prototypes
void buff_data(void); // <----------------------------------------
void clear_pw(void);// <----------------------------------------
//=== MAIN ===//
void main(void)
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
set_tris_a(0xFF);set_tris_e(0xFF);set_tris_c(0xFF);
set_tris_b(0xFF);set_tris_d(0xFF);port_b_pullups(TRUE);
fprintf(DEBUG,"Firm=%C_%03u.c\n\r",FIRM_MAJOR,FIRM_MINOR);
fprintf(DEBUG,"Hard=%u.%u\n\r",HARD_MAJOR,HARD_MINOR);
while(1)
{
buff_data();
clear_pw();
}
}
void buff_data(void)
{
if (k==0x23) // test for end char
clear_pw(); // check the password entered ***
}
void clear_pw()
{
// my clear pw code would go here
// nothing need to be returned
}
|
|
|
|
frierray
Joined: 11 Nov 2008 Posts: 29
|
|
Posted: Tue Nov 11, 2008 1:28 pm |
|
|
Thanks so much. that's a big help. I recoded it and it is working now. |
|
|
dbotkin
Joined: 08 Sep 2003 Posts: 197 Location: Omaha NE USA
|
|
Posted: Tue Nov 11, 2008 3:44 pm |
|
|
Or just write it all bass-ackwards. Put main() at the end, everything else above it in reverse order. You get used to it.
Code: |
void clear_pw()
{
}
void buff_data(void)
{
if (k==0x23) // test for end char
clear_pw(); // check the password entered ***
}
void main(void)
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
set_tris_a(0xFF);set_tris_e(0xFF);set_tris_c(0xFF);
set_tris_b(0xFF);set_tris_d(0xFF);port_b_pullups(TRUE);
fprintf(DEBUG,"Firm=%C_%03u.c\n\r",FIRM_MAJOR,FIRM_MINOR);
fprintf(DEBUG,"Hard=%u.%u\n\r",HARD_MAJOR,HARD_MINOR);
while(1)
{
buff_data();
clear_pw();
}
}
} |
|
|
|
Wayne_
Joined: 10 Oct 2007 Posts: 681
|
|
Posted: Wed Nov 12, 2008 3:08 am |
|
|
Or use header files.
Create a .h file and put your prototypes in that. Then include it in your c file.
#include "mycode.h"
This way if you use multiple c files you can include required headers in the c file. There are however issues with this, especially with CCS.
If you have the same .h file included in many .c files you may end up with a comipler error/warning of multiple declarations, you can get around this by using the following in the header file
#ifndef _MYHEADER
#define _MYHEADER 1
//prototypes and definitions go here
#endif
Also, the CCS compiler requires (well in my code anyway) that you inlude ALL the c files in the main build file...
#include "fred.c"
#include "bill.c"
// rest of code |
|
|
frierray
Joined: 11 Nov 2008 Posts: 29
|
|
Posted: Wed Nov 12, 2008 10:48 am |
|
|
Wayne_
I like your idea. Do the include files need to be in any special place?
Also, the CCS compiler requires (well in my code anyway) that you inlude ALL the c files in the main build file...
#include "fred.c"
#include "bill.c"
// rest of code
Again, thanks for all the help. |
|
|
Wayne_
Joined: 10 Oct 2007 Posts: 681
|
|
Posted: Wed Nov 12, 2008 11:07 am |
|
|
You would normally keep them in the same place as your .c files so the compiler can find them.
you normally have a .h file for each .c file all though this is not required.
You could put ALL the prototypes/defines in a single .h file if you wanted.
I tend to write code with multiple .c files and a .h file for each one.
But like I said, with CCS and my setup I have to manually include all the .c files in the main .c file. There is an option for using multiple compile files (.c) in CCS but I had trouble making it work the way I assumed it should, so I ended up doing it this way.
In each of your .c files you would normally include any .h files it requires, including the one for itself. |
|
|
|