Problem with printf()

I’m getting the weirdest syntax error ever. My code is as follows (This is in the user_routines.c file)


void Process_Data_From_Master_uP(void)
{
printf("lkjhjasfdkjhashddsfkjlkasdhfdlkjkljsadhfklkjasjdhf");

// for debugging
static int counter = 0;

When I remove the printf statement, the program compiles but the printf’s that are farther down don’t get printed. With the printf() statement in, the compiler returns a syntax error on the following line:
static int counter = 0;

The error returned is:


C:\2008_code_svn\08_bot_working\user_routines.c:199:Error: syntax error
Halting build on first failure as requested.
BUILD FAILED: Mon Jan 28 18:17:43 2008

I can’t find anything wrong with this line or any above it. I don’t know why I’m getting a syntax error. Any help would be much appreciated.

In ANSI C, you have to declare all variables before executing any other code in a block. I can’t be certain if this is your problem, but try moving the “static int counter = 0;” line above the printf and see if it compiles.

If that is indeed the problem, I would have hoped that C18 would have given a better error message. Sadly, C18 seems to do a poor job with errors in general from what I have seen.

The problem is that you are declaring a variable after you’ve begun to give commands. C doesn’t like this, but isn’t very informative when it spits up ‘syntax error.’ (At least I’m pretty sure.) Anyway, I don’t know why the printfs further on aren’t printing, but try using your printf after the counter is declared.

Thanks for all of your help, but I’m still having trouble getting this working. I’ve moved the printf statement to below all the variable declarations. The code compiles fine with no errors or warnings, but the printf still doesn’t work.

Our software mentor should be showing up in a few hours, so hopefully he’ll be able to help if I can’t get it working by then, but I’d like to solve this as soon as possible because it’s holding up the testing of our robot.

Here is the code as it looks now. I’m pretty sure there isn’t anything wrong with it, but I can’t explain the fact that it doesn’t work. I’d like to post more relevant sections, but I’m getting 0 errors and 0 warnings.


void Process_Data_From_Master_uP(void)
{

// for debugging
static int counter = 0;

	unsigned char byte_count;
	unsigned char data;
	unsigned char j;

printf("akjsdfusdhafkjsa");

	Getdata(&rxdata);

Make sure that you have included stdio.h at the begining of the program like so

#include <stdio.h>

If that doesn’t work then try adding

-mL -nw=2066 -D_FRC_BOARD

to the build options menu MPLabC18 tab, then click use alternate settings and add that to the end so it looks like this:

-Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- -mL -nw=2066 -D_FRC_BOARD

Hopefully this will help you with your problem.

There is some weirdness with Microchip’s implementation of the stdio library that necessitates the use of the return and new line characters at the end of a string. Try this:

printf("akjsdfusdhafkjsa
");

-Kevin

That seems curious, Kevin. We’ve done printf’s without "
" at all, and it still works.

I’m not sure if printf() always needs to see
, but I’ve experienced this problem in the past with the 2.4 compiler (I’m not sure about 3.1). I just threw up my hands and always use
in my code.

-Kevin

I’ve had some odd problems with printf myself, though I’ve never had a problem with
.

When I used a printf with about seven %d’s, something that should have shown up as a 1 or 0 was printing about 150.
It wasn’t until I tried using separate printf’s for each value that I found that it had either swapped or skipped some of the values and was printing an input from the joystick where it should have been printing a digital input.

I’d like to thank everyone again for their help.

Here’s how we solved it:
There was a lot of code not working in addition to the printf(). However, I discovered some printf()s that were actually working, in a different section of the code.
It turns out that we had to have the operator interface plugged in for that code to work. We scratched our heads for awhile about this and came to the conclusion (one of us finally remembered) that without a connection to the OI, the watchdog processor must set all PWMs & Relays to 127 & 0, respectively.

Upon further investigation and testing, we think that with no connection to the OI, the process_data_from_master_up() function never gets called from main.c
However, once a connection with the OI has been established and then lost, the RC keeps printing whatever it should have been printing before the connection to the OI was lost.

The reason we took so long to hook the OI up was that we were under the assumption that we had had this code working and printing before without an OI connection in the past. We now believe that perhaps we did have a connection to the OI at the time we were testing, but simply didn’t remember that we hooked it up.

This thread has still yielded some good advice. I was not aware that putting commands before all vars were declared was incorrect, and I now have a couple things to try when my printf()s stop working in the future.

Again, thank you everyone for your help.

This is a symptom of not matching the format information with the size of the variable to be printed. %d wants an int. If you instead give it a char, it will also grab the next byte of data to go with it, and everything will be misaligned from that point on. It’s a good idea to get in the habit of always explicitly casting your %d-printed variables as (int).