Log in

View Full Version : ERROR


amateurrobotguy
26-02-2005, 14:27
I define like this

void Default_Routine(void)
{
long reduction;
double para;
long nodecimalpara;
long reduction2;
double para2;
long nodecimalpara2;

and get this:

D:\Robot\MyFiles\user_routines.c:239:Error [1105] symbol 'redeuction' has not been defined
D:\Robot\MyFiles\user_routines.c:246:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:247:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:252:Error [1105] symbol 'redeuction2' has not been defined
D:\Robot\MyFiles\user_routines.c:259:Error [1139] integer types required for bitwise XOR operator
D:\Robot\MyFiles\user_routines.c:260:Warning [2058] call of function without prototype

Alex1072
26-02-2005, 14:29
There's nothing that I can see in your code that should be causing those errors. It would help if you posted the rest of the function.

EDIT: After looking at it again, it looks like you spelled reduction differently from how you declared it:

D:\Robot\MyFiles\user_routines.c:239:Error [1105] symbol 'redeuction' has not been defined

The symbol 'redeuction' has not been defined, only 'reduction' has been.

Also, for this error:
D:\Robot\MyFiles\user_routines.c:259:Error [1139] integer types required for bitwise XOR operator

the 'a^b' in C/C++/java is not actually a to the power of b. It's the XOR operator.

if you have two binary integers: a = 1011, b= 1101, a^b would be: 0110. XOR compares each binay digit of a with the corresponding digit of b. If the digits are different, a 1 is placed as the corresponding digit of the result, if they are the same, a 0 is placed.

If you need to do something like a^2, you should just do a*a. If you need actual exponentials then you have to use math.h or write your own function. If you use the c math library, pow(a, b) = a to the bth power.

EDIT #2: fixed the name of the power function

amateurrobotguy
26-02-2005, 14:36
Ok, I will post my function...but where you see ???? it means the number has been editied out for secrecy purposes. BTW with the spelling fixed I still get :
D:\Robot\MyFiles\user_routines.c:242:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:243:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:255:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:256:Error [1105] symbol 'nodecimalparatwo' has not been defined
D:\Robot\MyFiles\user_routines.c:256:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:256:Error [1101] lvalue required
D:\Robot\MyFiles\user_routines.c:257:Error [1105] symbol 'nodecimalparatwo' has not been defined

#include "ifi_aliases.h"
#include "ifi_default.h"
#include "ifi_utilities.h"
#include "user_routines.h"
#include "printf_lib.h"
#include "user_Serialdrv.h"
#include <math.h>

...
void Default_Routine(void)
{
long reduction, nodecimalpara, reductiontwo, nodecomal, paratwo;
double para, para2;

/*---------- Analog Inputs (Joysticks) to PWM Outputs-----------------------
*--------------------------------------------------------------------------
* This maps the joystick axes to specific PWM outputs.
*/
reduction=p1_y-?;
if (reduction>=0)
{
}
else
{
reduction=reduction*-1;
}
para=((pow(reduction, ?)/?)+?);
nodecimalpara=ceil(para);
pwm01 = nodecimalpara;


reductiontwo=p2_y-?;
if (reductiontwo<=0)
{
reductiontwo=reductiontwo*-1;
}
else
{
}
paratwo=((pow(reductiontwo, ?/?)+?);
nodecimalparatwo=ceil(paratwo);
pwm02 = nodecimalparatwo;

Alex1072
26-02-2005, 14:55
D:\Robot\MyFiles\user_routines.c:242:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:243:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:255:Error [1139] integer types required for bitwise XOR operator
D:\Robot\MyFiles\user_routines.c:256:Error [1105] symbol 'nodecimalparatwo' has not been defined
D:\Robot\MyFiles\user_routines.c:256:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:256:Error [1101] lvalue required
D:\Robot\MyFiles\user_routines.c:257:Error [1105] symbol 'nodecimalparatwo' has not been defined

If you look at the numbers after the name of the file: 243, 243, 255, 256, etc. The compiler tells you on which line the error is happening. Since I don't know the exact line numbers i'm not sure if this is the actual cause of the errors, but:

nodecimalparatwo is not defined, you should look at the variable declaration at the top of your function and make sure you don't use any variables that you do not declare.

The 'call of function without declaration' errors are happening because of the pow and ceil functions. These functions are provided in math.h, and are the correct names (http://www.opengroup.org/onlinepubs/007908799/xsh/math.h.html), but in order to use them you have to let the compiler know that you're going to be using the math.h library. In order to do that you have to put this line at the top of your file next to the other similar ones:
#include <math.h>

This will tell the compiler about all the functions that are in the math.h library so that it knows that they exist. The #include command tells the compiler to process the file "math.h" as if it were pasted into the begining of your file. The math.h file has all the declarations that the default c math library needs in order to work, including declarations of the pow and ceil functions you are trying to use.

amateurrobotguy
26-02-2005, 15:01
Ok, I fixed my definitions, but I am still getting the w/o prototype error. I did put the math.h here: It gives me the errors, then compiles further, but gives me build failed.

/************************************************** *****************************
* FILE NAME: user_routines.c <FRC VERSION>
*
* DESCRIPTION:
* This file contains the default mappings of inputs
* (like switches, joysticks, and buttons) to outputs on the RC.
*
* USAGE:
* You can either modify this file to fit your needs, or remove it from your
* project and replace it with a modified copy.
*
************************************************** *****************************/

#include "ifi_aliases.h"
#include "ifi_default.h"
#include "ifi_utilities.h"
#include "user_routines.h"
#include "printf_lib.h"
#include "user_Serialdrv.h"
#include <math.h>

amateurrobotguy
26-02-2005, 15:14
I think my math.h file might be bad. See the attachment with it. It doesn't have anything in it.

Alex1072
26-02-2005, 15:18
I've never actually used math.h in MPLAB, so I can't really say much. My math.h file is exactly the same though. For ceiling you could easilly write your own function; power is harder if you want it to support non-integer exponents. Anyone else have any suggestions? Is there a way to use math.h in mplab?

amateurrobotguy
26-02-2005, 15:19
Anyone have a good copy of math.h with all the math functions?

Kevin Sevcik
26-02-2005, 16:23
math.h is just a header file. header files typically don't contain any code, they just have compiler directives in case that library needs other includes, etc. The actual code will be in a math.c file in a libraries folder or something. I'm afraid I can't tell you for certain because I'm not at a computer with the compiler at the moment. At any rate, either you're missing math.c or it's corrupted, or someone's fiddled with compiler settings and you aren't pointing the compiler to the proper library folder anymore.

EDIT:
From a brief perusal, I note that the include folder should be c:\mcc18\lib

amateurrobotguy
26-02-2005, 17:08
First, if the include isn't set to the /h section, it will error with no adc.h found.
Can anyone explain the procedure for getting ceil() and pow() to work. I don't mind if its a header or a c file or manually program it in.

amateurrobotguy
26-02-2005, 17:26
I have made some progress. I got rid of all the error right down to the last lines:
MPLINK 3.40, Linker
Copyright (c) 2003 Microchip Technology Inc.
Error - could not find definition of symbol 'ceil' in file 'D:\Robot\MyFiles\user_routines.o'.
Errors : 1

All i did was this:

/************************************************** *****************************
* FILE NAME: user_routines.c <FRC VERSION>
*
* DESCRIPTION:
* This file contains the default mappings of inputs
* (like switches, joysticks, and buttons) to outputs on the RC.
*
* USAGE:
* You can either modify this file to fit your needs, or remove it from your
* project and replace it with a modified copy.
*
************************************************** *****************************/

#include "ifi_aliases.h"
#include "ifi_default.h"
#include "ifi_utilities.h"
#include "user_routines.h"
#include "printf_lib.h"
#include "user_Serialdrv.h"
#include <math.h>

extern unsigned char aBreakerWasTripped;

/*** DEFINE USER VARIABLES AND INITIALIZE tHEM HERE ***/

/* EXAMPLES: (see MPLAB C18 User's Guide, p.9 for all types)
unsigned char wheel_revolutions = 0; (can vary from 0 to 255)
unsigned int delay_count = 7; (can vary from 0 to 65,535)
int angle_deviation = 142; (can vary from -32,768 to 32,767)
unsigned long very_big_counter = 0; (can vary from 0 to 4,294,967,295)
*/
double ceil(double x);
double pow(double x, double y);

See two last lines. Am I going down the right path? If so, what is causing the error then?

Kevin Sevcik
26-02-2005, 17:36
the new error is because ceil and pow aren't really defined as anything, I'm sure.

and my mistake, it's been a while since I've really programmed. I meant the library path should be set to c:\mcc18\lib and look in that folder and make sure there's a math.c file and it has the proper functions.

Alex1072
26-02-2005, 17:36
I have made some progress. I got rid of all the error right down to the last lines:
MPLINK 3.40, Linker
Copyright (c) 2003 Microchip Technology Inc.
Error - could not find definition of symbol 'ceil' in file 'D:\Robot\MyFiles\user_routines.o'.
Errors : 1

All i did was this:

/************************************************** *****************************
* FILE NAME: user_routines.c <FRC VERSION>
*
* DESCRIPTION:
* This file contains the default mappings of inputs
* (like switches, joysticks, and buttons) to outputs on the RC.
*
* USAGE:
* You can either modify this file to fit your needs, or remove it from your
* project and replace it with a modified copy.
*
************************************************** *****************************/

#include "ifi_aliases.h"
#include "ifi_default.h"
#include "ifi_utilities.h"
#include "user_routines.h"
#include "printf_lib.h"
#include "user_Serialdrv.h"
#include <math.h>

extern unsigned char aBreakerWasTripped;

/*** DEFINE USER VARIABLES AND INITIALIZE tHEM HERE ***/

/* EXAMPLES: (see MPLAB C18 User's Guide, p.9 for all types)
unsigned char wheel_revolutions = 0; (can vary from 0 to 255)
unsigned int delay_count = 7; (can vary from 0 to 65,535)
int angle_deviation = 142; (can vary from -32,768 to 32,767)
unsigned long very_big_counter = 0; (can vary from 0 to 4,294,967,295)
*/
double ceil(double x);
double pow(double x, double y);

See two last lines. Am I going down the right path? If so, what is causing the error then?


Those two lines that you added are exactly what would have been in math.h. Unfortunatly you also need the actual code of the functions. The way libraries usually work in c is that you have a .h file that tells the compiler all the functions and variables defined in the library, and you have a .o file which contains the compiled code. The way a compiler works is that it takes code and then terns each file into a .o file. The .o file contains "object code". The oject code is an intermediary step between the source code and the actual .hex file. The linker then combines all the .o files into one .hex file. The error that you're getting now is because the compiler does sees all the definitions and compiles the user_routines file assuming that the ceil and pow functions exist. When the linker tries to link the object files though, it doesn't find the actual code for the ceil and pow functions. In order for this to work you have to make it so that MPLAB uses math.o as part of the project and links it in along with your code. Alternativly, you can find the source code to math.o, which would be math.c, and compile it as part of your project. Then the compiler would first compile math.c into a new math.o, and then the linker coud use that to create the .hex file.

amateurrobotguy
26-02-2005, 17:42
What do I need to put in math.c to get my 2 functions to work?

amateurrobotguy
26-02-2005, 19:31
I think I made a tiny bit of progress in finding a math.c Only problem is, I get this error.

Make: The target "D:\Robot\MyFiles\main.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_SerialDrv.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines_fast.o" is up to date.
Make: The target "D:\Robot\MyFiles\printf_lib.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_utilities.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_startup.o" is up to date.
Make: The target "D:\Robot\MyFiles\math.o" is out of date.
Executing: "D:\Robot\mcc18\bin\mcc18.exe" -p=18F8520 "math.c" -fo="math.o" /i"D:\Robot\mcc18\h" -D_FRC_BOARD -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
D:\Robot\MyFiles\math.c:65:Error [1302] old style function declarations not supported
Halting build on first failure as requested.
BUILD FAILED: Sat Feb 26 16:30:19 2005

ace123
26-02-2005, 21:11
First of all, I would HIGHLY recommend writing and using your own functions.

Are you using floating point powers (6^2.5) or only integers(6^3).

If you are using integer powers then it would be very easy to write your own function:long powl(long y, int x) {
long result=1;
int i;
for (i=0;i<x;++i) {
result*=y;
}
return result;
}
(make sure to call a different name like powl instead of pow to avoid conflicts.)

That is much faster and better than using a function with floating point numbers (doubles), which are bad to use on these microprocessors and which one has little reason to use.

------------------------
Now, to answer your question about the hard way to do this:
The "old style" functions are when you do:double pow(y,x)
double y, x;
{
...
}The way to fix it is to change math.c:double pow(double y,double x)
{
...
}

Do the same thing with ceil at line 71:double ceil(double x)
{
...
}

amateurrobotguy
26-02-2005, 23:24
Unfortunately, I have to use floating point ^??. If I don't, my accuracy goes WAY WAY down. Even with 4 decimal place accuracy I am still .5 off from my target.
Ok, I figured the cause of the error(unposted .h problem) was the same thing with the .h file. I just got rid of the file because the .c should do everything that the .h would. Here is the new error:

Make: The target "D:\Robot\MyFiles\main.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_SerialDrv.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines.o" is out of date.
Executing: "D:\Robot\mcc18\bin\mcc18.exe" -p=18F8520 "user_routines.c" -fo="user_routines.o" /i"D:\Robot\mcc18\h" -D_FRC_BOARD -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Make: The target "D:\Robot\MyFiles\user_routines_fast.o" is up to date.
Make: The target "D:\Robot\MyFiles\printf_lib.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_utilities.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_startup.o" is up to date.
Make: The target "D:\Robot\MyFiles\MATH.o" is out of date.
Executing: "D:\Robot\mcc18\bin\mcc18.exe" -p=18F8520 "MATH.C" -fo="MATH.o" /i"D:\Robot\mcc18\h" -D_FRC_BOARD -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
90: I_PSTINCFRAM
90: I_IND32RAM16
90: I_MEMBERRAM16
90: I_INDXRAM16
90: I_IND16RAM16
90: I_IDSTK(zp)
D:\Robot\MyFiles\MATH.C:126:Fatal [100] -internal- unable to reduce tree:
Halting build on first failure as requested.
BUILD FAILED: Sat Feb 26 20:22:05 2005

Alex1072
26-02-2005, 23:35
I think I made a tiny bit of progress in finding a math.c Only problem is, I get this error.

Make: The target "D:\Robot\MyFiles\main.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_SerialDrv.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines_fast.o" is up to date.
Make: The target "D:\Robot\MyFiles\printf_lib.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_utilities.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_startup.o" is up to date.
Make: The target "D:\Robot\MyFiles\math.o" is out of date.
Executing: "D:\Robot\mcc18\bin\mcc18.exe" -p=18F8520 "math.c" -fo="math.o" /i"D:\Robot\mcc18\h" -D_FRC_BOARD -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
D:\Robot\MyFiles\math.c:65:Error [1302] old style function declarations not supported
Halting build on first failure as requested.
BUILD FAILED: Sat Feb 26 16:30:19 2005



The error is on line 65 ("return(zp->d);"), so I would guess the mplab compiler doesn't support return(a). Try changing the return statement to "return zp->d;"


As is implied above though, using this function may not be a good idea. The pow function is not intended for small imbedded microprocessors and relies heavilly on floating point operations. It is designed for a full size computer. Running this function on the robot controller will slow it down a lot. You can try it and see if anything weird happens, but I would try and find another way to solve the problem, if possible. When you try it, watch out for weird behavior of the robot, that is a good indication that you are putting too many operations into the 26ms loop.

amateurrobotguy
26-02-2005, 23:56
I don't think that that is my problem. When I follow your suggestion at the end of the two functions I get this error:. (See my latest post) The line error is the last line of math.c. In the previous and this error, Line 126 is the problem

Make: The target "D:\Robot\MyFiles\main.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_SerialDrv.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines.o" is up to date.
Make: The target "D:\Robot\MyFiles\user_routines_fast.o" is up to date.
Make: The target "D:\Robot\MyFiles\printf_lib.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_utilities.o" is up to date.
Make: The target "D:\Robot\MyFiles\ifi_startup.o" is up to date.
Make: The target "D:\Robot\MyFiles\MATH.o" is out of date.
Executing: "D:\Robot\mcc18\bin\mcc18.exe" -p=18F8520 "MATH.C" -fo="MATH.o" /i"D:\Robot\mcc18\h" -D_FRC_BOARD -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
D:\Robot\MyFiles\MATH.C:126:Warning [2054] suspicious pointer conversion
Assertion failed: 0, file trn18.c, line 2783

abnormal program termination
Halting build on first failure as requested.
BUILD FAILED: Sat Feb 26 20:54:17 2005

amateurrobotguy
27-02-2005, 14:27
Hasn't anyone used ceil() or floor or pow()? I just need a math.c with the definitions for C18 compiler or a header or something.

Adam Richards
27-02-2005, 15:55
I define like this

void Default_Routine(void)
{
long reduction;
double para;
long nodecimalpara;
long reduction2;
double para2;
long nodecimalpara2;

and get this:

D:\Robot\MyFiles\user_routines.c:239:Error [1105] symbol 'redeuction' has not been defined
D:\Robot\MyFiles\user_routines.c:246:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:247:Warning [2058] call of function without prototype
D:\Robot\MyFiles\user_routines.c:252:Error [1105] symbol 'redeuction2' has not been defined
D:\Robot\MyFiles\user_routines.c:259:Error [1139] integer types required for bitwise XOR operator
D:\Robot\MyFiles\user_routines.c:260:Warning [2058] call of function without prototype

Are you sure you're closing the function?

amateurrobotguy
28-02-2005, 17:20
I have the definitive response from C18 tech support:

I found the functions that you refer to however they are C30 math function found in the math.h for C30 dsPICŪ Language Tools Libraries

The files you inquire about are defined in the dsPICŪ Language Tools Libraries
http://ww1.microchip.com/downloads/en/DeviceDoc/51456b.pdf

see page 332 double ceil(double x);
see page 355 double pow(double x, double y);

The functions you can use in the C18 library under math.h
MPLABŪ C18 C COMPILER LIBRARIES
http://ww1.microchip.com/downloads/en/DeviceDoc/C18_Lib_51297d.pdf

see page 162 float ceil ( float x);
see page 165 float pow( float x, float y);

Unfortunately you cannot use the functions you refer to with C18. They are used with C30.


Basically FIRST stiffed us on the compiler...Pity...I could have made a kick-*** function if I had math access.

Alex1072
28-02-2005, 17:28
You could probably still write your own from scratch if you research how the normal computer math library (open source) does it and optimize only to do the operations you need. Also, you might want to consider using a look up table. Searching for look up tables on CD should give you quite a bit of results.