Andres
Andres

Reputation: 6200

C30 PIC Compiler won't compile (MPLAB-X IDE)

I am trying to compile a very simple program, I dont understand why it doesn't compile. Here is my program:

/* General includes */
#include <stdio.h>
#include <stdlib.h>
#include <libpic30.h>
#include <p33FJ128GP804.h>

#include "RunLengthAlgorithm.h"
//#include "RunLengthAlgorithm.c"

int main(void) {

    int n;
    char source[10001];
    char target[100];

    for(n = 0; n < 1000; ++n){
        source[n] = "A";
    }
    for(n = 1000; n < 2000; ++n){
        source[n] = "B";
    }
    for(n = 2000; n < 3000; ++n){
        source[n] = "C";
    }
    for(n = 3000; n < 4000; ++n){
        source[n] = "D";
    }
    for(n = 4000; n < 5000; ++n){
        source[n] = "E";
    }
    for(n = 5000; n < 6000; ++n){
        source[n] = "F";
    }
    for(n = 6000; n < 7000; ++n){
        source[n] = "G";
    }
    for(n = 7000; n < 8000; ++n){
        source[n] = "H";
    }
    for(n = 8000; n < 9000; ++n){
        source[n] = "I";
    }
    for(n = 9000; n < 10000; ++n){
        source[n] = "J";
    }
    source[10001] = '\0';

    RLEncode(&source, &target);

    while(1);
    return (EXIT_SUCCESS);

}

The .h and .c files are added to project.

#ifndef RUNLENGTHALGORITHM_H
#define RUNLENGTHALGORITHM_H

void RLEncode (char *source, char *target);

#endif

And the .c file:

#ifndef RUNLENGTHALGORITHM_C
#define RUNLENGTHALGORITHM_C
void RLEncode (char *source, char *target){
    int n, k = 0;
    for(n = 0; source[n] != '\0'; ++n){
        int length = 1;
        while(source[n+1] != '\0' && source[n] == source[n+1]){
            ++length; ++n;
        }
        target[k++] = length;
        target[k++] = source[n];
    }
    source[n] = '\0';
}

#endif

I am using MPLAB-X IDE whith C30 compiler and it gives me this error:

CLEAN SUCCESSFUL (total time: 1s)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `D:/Datos (Disco)/Electronica/Multi portatil/Run-Length Algorithm.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Run-Length_Algorithm.X.production.hex
make[2]: Entering directory `D:/Datos (Disco)/Electronica/Multi portatil/Run-Length Algorithm.X'
Main.c: In function 'main':
Main.c:24: warning: assignment makes integer from pointer without a cast
Main.c:27: warning: assignment makes integer from pointer without a cast
Main.c:30: warning: assignment makes integer from pointer without a cast
Main.c:33: warning: assignment makes integer from pointer without a cast
Main.c:36: warning: assignment makes integer from pointer without a cast
Main.c:39: warning: assignment makes integer from pointer without a cast
Main.c:42: warning: assignment makes integer from pointer without a cast
Main.c:45: warning: assignment makes integer from pointer without a cast
Main.c:48: warning: assignment makes integer from pointer without a cast
Main.c:51: warning: assignment makes integer from pointer without a cast
Main.c:55: warning: passing argument 1 of 'RLEncode' from incompatible pointer type
Main.c:55: warning: passing argument 2 of 'RLEncode' from incompatible pointer type
"C:\Program Files (x86)\Microchip\MPLAB C30\bin\pic30-gcc.exe" -g -omf=elf -x c -c -mcpu=33FJ128GP804 -MMD -MF build/default/production/Main.o.d -o **build/default/production/Main.o Main.c 
"C:\Program Files (x86)\Microchip\MPLAB C30\bin\pic30-gcc.exe" -g -omf=elf -x c -c -mcpu=33FJ128GP804 -MMD -MF build/default/production/RunLengthAlgorithm.o.d -o build/default/production/RunLengthAlgorithm.o RunLengthAlgorithm.c 
"C:\Program Files (x86)\Microchip\MPLAB C30\bin\pic30-gcc.exe"   -omf=elf -mcpu=33FJ128GP804  -o dist/default/production/Run-Length_Algorithm.X.production.elf build/default/production/Main.o build/default/production/RunLengthAlgorithm.o build/default/production/RunLengthAlgorithm.o        -Wl,--defsym=__MPLAB_BUILD=1,-Tp33FJ128GP804.gld
build/default/production/RunLengthAlgorithm.o(.text+0x0): In function `_RLEncode':
: multiple definition of `_RLEncode'
build/default/production/RunLengthAlgorithm.o(.text+0x0): first defined here
c:\program files (x86)\microchip\mplab c30\bin\bin\..\bin/pic30-elf-ld.exe: Link terminated due to previous error(s).**
make[2]: Leaving directory `D:/Datos (Disco)/Electronica/Multi portatil/Run-Length Algorithm.X'
make[1]: Leaving directory `D:/Datos (Disco)/Electronica/Multi portatil/Run-Length Algorithm.X'
**make[2]: *** [dist/default/production/Run-Length_Algorithm.X.production.hex] Error 255
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 8s)**

I don't understand why, if I put my function inside Main.c and I dont't include #include "RunLengthAlgorithm.h" it works but I cannot get it working including a file.

Upvotes: 0

Views: 7340

Answers (3)

user3722528
user3722528

Reputation: 1

This happens when you "#include _your_func.h" your function and then manually include the file containing functions using IDE> Projects>sourcefiles> Add existing item. its sufficient to do either one of those.

Upvotes: 0

Arun E V
Arun E V

Reputation: 1

I think the problem is related to the memory mapping. You should redefine the size of stack in .gld or .lkr files, according to the family of processor using. When you are declaring the variable source with very large memory location the stack is getting overflows.

Upvotes: 0

Andres
Andres

Reputation: 6200

Ok there is no problem whit the code. It seems to be a bug of MPLAB-X v1.10.

Solution: close MPLAB-X and open it again it will compile fine, if it doesn't work read on http://www.microchip.com/forums/m627705.aspx.

Upvotes: 0

Related Questions