Forum: Mikrocontroller und Digitale Elektronik ultoa TCP/IP Stack error mplab PIC32 compiler v2.02


von D. B. (hamma)


Lesenswert?

Hallo zusammen,
ich wollte eine Demo CAN to Ethernet Bridge vom pic32 Starter kit 
probieren.
Leider kommt es beim kompilieren zu diesem Fehler:

In file included from ..\Microchip\Include/TCPIP Stack/TCPIP.h:284:0,
                 from MainDemo.c:94:
..\Microchip\Include/TCPIP Stack/Helpers.h:66:8: error: conflicting 
types for 'ultoa'
c:\program files\microchip\mplab c32 
suite\bin\../lib/gcc/pic32mx/4.5.1/../../../../pic32mx/include/stdlib.h: 
96:15:  note: previous declaration of 'ultoa' was here

 die verschiedenen Stellen wo ultoa autaucht:
helpers.h
1
#if !defined(__18CXX) || defined(HI_TECH_C)
2
    char *strupr(char* s);
3
   
4
    #if defined(HI_TECH_C)
5
        // HI-TECH PICC-18 PRO 9.63 seems to already have a ultoa() library
6
        // function, but the parameter list is different!
7
        #define ultoa(val,buf)    ultoa((buf),(val),10)
8
    #else
9
        void ultoa(DWORD Value, BYTE* Buffer);
10
    #endif
11
#endif

in helpers.c
1
#if !defined(__18CXX) && !defined(HI_TECH_C)
2
void ultoa(DWORD Value, BYTE* Buffer)
3
{
4
    BYTE i;
5
    DWORD Digit;
6
    DWORD Divisor;
7
    BOOL Printed = FALSE;
8
9
    if(Value)
10
    {
11
        for(i = 0, Divisor = 1000000000; i < 10; i++)
12
        {
13
            Digit = Value/Divisor;
14
            if(Digit || Printed)
15
            {
16
                *Buffer++ = '0' + Digit;
17
                Value -= Digit*Divisor;
18
                Printed = TRUE;
19
            }
20
            Divisor /= 10;
21
        }
22
    }
23
    else
24
    {
25
        *Buffer++ = '0';
26
    }
27
28
    *Buffer = '\0';
29
}
30
#endif
stdlib.h
1
#if !defined (_DEFINED_ULTOA)
2
extern char *    ultoa(char * buf, unsigned long val, int base);
3
#undef _STDLIB_ULTOA
4
#define _STDLIB_ULTOA
5
#ifdef __C32_VERSION__
6
#define _C32_ULTOA
7
#endif
8
#endif

Bin für jede Hilfe denkbar:-)

Viele Grüße,
Hamma

von Karl H. (kbuchegg)


Lesenswert?

Autsch.
Da waren die Spezialisten am Werk :-)


Also.
Wie du wahrscheinlich schon mitbekommen hast, gibt es natürlich eine 
C-Standard-Funktion die ultoa heißt.
An der gibt es nichts zu rütteln, die ist bereits vorhanden.

Extrem dämlich ist es nun, sich selbst eine Funktion gleichen Namens, 
allerdings mit anderer Parameterliste zu machen. Dafür sollte einem mit 
dem nassen Fetzen eine über die Rübe gezogen werden.

Aber hilft nichts. Du hast das nicht verbockt und irgendwie musst du da 
jetzt rauskommen.

Der Ansatz, das ganze über compilerspezifische #define zu lösen, ist 
schon mal ein Fuss in der Tür. Im Grunde musst du dem Code nur noch 
beibringen, dass er die ganze Sache hier regeln kann, wie beim HI_TECH_C 
Compiler. Der gcc (den hast du doch?) bringt schon ein ultoa mit, so 
dass derselbe 'Fix' greift.
_GNUC_  sollte vom Compiler schon vordefiniert sein, so dass man die 
Umgehung an diesem #define aufhängen kann.

Also die helpers.h abändern
1
#if !defined(__18CXX) || defined(HI_TECH_C) || defined(__GNUC__)
2
    char *strupr(char* s);
3
   
4
    #if defined(HI_TECH_C) || defined(__GNUC__)
5
        // HI-TECH PICC-18 PRO 9.63 seems to already have a ultoa() library
6
        // function, but the parameter list is different!
7
        #define ultoa(val,buf)    ultoa((buf),(val),10)
8
    #else
9
        void ultoa(DWORD Value, BYTE* Buffer);
10
    #endif
11
#endif

die helpers.c abändern in
1
#if !defined(__18CXX) && !defined(HI_TECH_C) && !defined(__GNUC__)
2
void ultoa(DWORD Value, BYTE* Buffer)
3
{
4
    BYTE i;
5
    DWORD Digit;
6
    DWORD Divisor;
7
    BOOL Printed = FALSE;
8
9
    if(Value)
10
    {
11
      ....


Es ist zwar ein grauslicher Hack, denn eigentlich sollte die hier 
benutzte Funktion in erster Linie gar NICHT ultoa heißen, aber um die 
Demo zu komplilieren sollte es erst mal reichen.

von D. B. (hamma)


Lesenswert?

Vielen Dank, es funktionniert!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.