Forum: Mikrocontroller und Digitale Elektronik PIC XC8 lib Funktions aufruf in eigenen Funktionen -> Error


von Teo D. (teoderix)


Lesenswert?

Hi,

hab da mal wieder, ein frustrierendes Anfänger Problem :(

Wenn ich Funktionen aus string.h in der Main benutze, funktioniert alles 
ohne Probleme.
Setze ich sie aber in einer eigenen Funktion ein, kommt es zu folgender 
Fehlermeldung:
user.c:23: warning: (361) function declared implicit int
C:\Program Files (x86)\Microchip\xc8\v1.32\sources\common\itoa.c:4: 
error: (1098) conflicting declarations for variable "_itoa" (user.c:23)

Die Warnung wird immer ausgegeben, egal was ich da für einen Type 
deklariere!
Die Erklärung zum Error, sagt mir in diesem Zusammenhang auch nichts.

(1098) conflicting declarations for variable "*" (*:*)  (Parser, Code 
Generator)
Differing type information has been detected in the declarations for a 
variable, or between a declaration and the definition of a variable, for 
example:
extern long int test;
int test; /* oops -- which is right? int or long int ? */

Hier der Code dazu:
1
#include <xc.h>         /* XC8 General Include File */
2
#include <stdint.h>         /* For uint8_t definition */
3
#include <stdbool.h>        /* For true/false definition */
4
#include <string.h>
5
6
#include "LCD_HD44780.h"
7
#include "user.h"
8
9
void Print_Zeit(int val);  // liegt in user.h
10
11
void Print_Zeit(int val) { // liegt in user.c, wird in main aufgerufen
12
    char PBuff[3];
13
    itoa(PBuff, val, 10);
14
    if (val < 10) {
15
        LCD_Print("0");
16
    }
17
    LCD_Print(PBuff);
18
}
Die Impementation von itoa:
1
char *
2
itoa(char * buf, int val, int base)
3
{
4
  char *  cp = buf;
5
6
  if(val < 0) {
7
    *buf++ = '-';
8
    val = -val;
9
  }
10
  utoa(buf, val, base);
11
  return cp;
12
}

Ich habe nicht den geringsten Schimmer, was da quer schlägt?

Ich danke schon mal für eure Mühen.

von Klaus W. (mfgkw)


Lesenswert?

Und ich habe nicht den geringsten Schimmer, was da jetzt eigentlich was 
ist.

Dein erster Quelltext ist welche Datei? user.c? Wieso steht dann ein 
Kommentar drin "liegt in user.h"?

Und wieso hast du einen eigenen Quelltext für itoa()? Und in welcher 
Datei ist der?

Spekulation (weil deine Fehlerbeschreibung eher mager ist):
Wahrscheinlich ist itoa() in einer deiner #includeten Headerdateien 
definiert, und halt etwas anders als von dir in deiner Version.

von Klaus W. (mfgkw)


Lesenswert?

PS:

1. Wo soll da eigentlich eine Zeile 23 sein?
Dein zitierter Quelltext hat doch etwa 18 Zeilen.

2. Hast du in deiner user.h (die du leider lieber für dich behältst) 
evtl. eine Zeile
1
extern char *itoa;
stehen?

von Teo D. (teoderix)


Lesenswert?

Sorry, dachte nicht das daß so missverständlich ist.

main.c
1
#include <xc.h>         /* XC8 General Include File */
2
#include <stdint.h>     /* For uint8_t definition */
3
#include <stdlib.h>
4
#include <stdbool.h>       /* For true/false definition */
5
6
#include "system.h"        /* System funct/params, like osc/peripheral config */
7
#include "user.h"
8
#include "drehgeber.h"
9
#include "LCD_HD44780.h"
10
11
void main(void) {
12
    ConfigureOscillator();
13
    InitApp();
14
    LCD_init();
15
16
    while (1) {
17
        if (sek_Tick) {
18
            Uhr();
19
            sek_Tick = 0;
20
        }
21
        if (lcd_Tick) { // LCD Aktualisieren
22
            Print_Zeit(sekunde);
23
        }
24
    }
25
}
user.h
1
volatile bit mS_Tick = 0, sek_Tick = 0, alarm = 0, lcd_Tick = 0, Start_Taste = 0;
2
volatile bit Start_Flag = 0;
3
volatile char sekunde = 0;
4
unsigned int minute = 0, stunde = 0, tag = 0, monat = 0, jahr = 0,val;
5
6
void Uhr(void);
7
void Print_Zeit(unsigned val);
8
9
void InitApp(void); /* I/O and Peripheral Initialization */
user.c
1
#include <xc.h>         /* XC8 General Include File */
2
#include <stdint.h>         /* For uint8_t definition */
3
#include <stdbool.h>        /* For true/false definition */
4
#include <string.h>
5
6
#include "LCD_HD44780.h"
7
#include "user.h"
8
9
void Print_Zeit(unsigned val) {
10
    char PBuff[3];
11
    utoa(PBuff, val, 10);  
12
    if (val < 10) {
13
        LCD_Print("0");
14
    }
15
    LCD_Print(PBuff);
16
 }
17
 
18
void InitApp(void) {
19
    PORTA = 0;
20
    PORTB = 0;
21
22
    TRISA = 0b11100;
23
    TRISB = 0b00000000;
24
    nRBPU = 0;
25
26
    GIE = 1;
27
    T0IE = 1;
28
  }
Bitte nicht dran stören, das hier jetzt "utoa" benutzt wird, ändert 
nichts an der Fehlermeldung! Das sich die Error Meldung auf die Zeile 
mit "utoa" bezieht sollte klar sein.
Hier nochmals die Meldungen:
user.c:20: warning: (361) function declared implicit int
C:\Program Files (x86)\Microchip\xc8\v1.32\include\stdlib.h:104: error: 
(1098) conflicting declarations for variable "_utoa" (user.c:20)

Gelöscht habe ich nur Kommentare, um den Text nicht unnötig auf zu 
blähen.

von K. S. (hagbart06)


Lesenswert?

Schau doch mal in der stdlib.h in Zeile 104. Wahrscheinlich wurde dort 
bereits utoa deklariert und die unterscheidet sich von deiner Funktion.

von g457 (Gast)


Lesenswert?

> user.c:20: warning: (361) function declared implicit int

Funktionsdeklaration (stdlib.h) fehlt.

von Teo D. (teoderix)


Lesenswert?

Ubs... hab wohl vergessen den Beitrag abzuschicken? Hier noch mal.

g457 schrieb:
> Funktionsdeklaration (stdlib.h) fehlt.

Danke das war's!

Ich ging davon aus, das wenn eine Include fehlt, kommt sowas wie "Kann 
xxx nicht finden..."
Mir fehlt halt noch der Überblick wie das in C organisiert ist :(
Sollte mir mal die wichtigen libs zu Gemüte führen. (sorry)


Danke nochmals an alle

MfG
Teo

von Klaus W. (mfgkw)


Lesenswert?

Und beim nächsten Mal bitte nicht irgendwas schicken, sondern die 
Originalquelltexte, zu denen auch die Meldungen gehören.
Hier ist wieder in user.c in Zeile 20 weit und breit kein utoa zu 
sehen...

von Teo D. (teoderix)


Lesenswert?

Klaus Wachtler schrieb:
> Und beim nächsten Mal bitte nicht irgendwas schicken, sondern die
> Originalquelltexte, zu denen auch die Meldungen gehören.
> Hier ist wieder in user.c in Zeile 20 weit und breit kein utoa zu
> sehen...

Erbsenzähler?

von Klaus W. (mfgkw)


Lesenswert?

Nein, Zeilenzähler :-)

Wenn mir jemand Quelltexte und Fehlermeldungen zeigt, die gar nicht 
zusammenpassen, dann ist das einfach Zeitverschwendung.

Wenn ein Frager seine Zeit verschwenden will, ist das seine Sache - ich 
habe keine Lust dazu.

von Teo D. (teoderix)


Lesenswert?

Klaus Wachtler schrieb:
> Wenn mir jemand Quelltexte und Fehlermeldungen zeigt, die gar nicht
> zusammenpassen, dann ist das einfach Zeitverschwendung.

Es gibt nur 1 utoa(itoa) im, recht kurzem Quelltext. Zeilen nummern 
existieren nicht, weil ich die nicht kopieren kann! Was den Hinweis 
"Fehler in Zeile xy" nicht sehr hilfreich macht!

Wenn Du den Zusammenhang nicht erkennen kannst, dann lass es bitte und 
mach mich hier nicht so schräg von der Seite an!

von Klaus W. (mfgkw)


Lesenswert?

Ich hatte dich nur um etwas gebeten für das nächste Mal, du brauchst 
dich aber auch nicht darum kümmern - jeder wie er will.
Du willst ja, daß man dir hilft.

EOT

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.