Forum: Mikrocontroller und Digitale Elektronik L104 Multible Public Definitions bei Keil


von Tom (Gast)


Lesenswert?

Hallo zusammen,

ich kann mir zwar denken an was es liegt doch weis ich nicht wie ich
diesen Fehler vermeiden kann daher versuchen ich mal zu beschreiben wie
das Programm aufgebaut ist.

Ich habe das main Programm und in diesem "#include <Projekt1.h>"
include ich das Headerfile Projekt1.h.
Nun stehen jedoch verschiedene Funktionen die ich in in einer
Bibliothek Projekt1.LIB.In verschiedenen Funktionen diese Projekt1.LIB
ist auch das Projeht1.h includet.Wenn ich nun eine Funktion von der
Bibliothek im main Programm aufrufe hagelt er Fehlermeldungen.
Ich denke weil ich die dieses Projekt1.h sowohl in der Bibliothek
aufrufe und auch im main.Ich habe belesen das es wohl mit #ifndef
funktioniert und habe auch schon probiert verschiedene Variationen
jedoch ohne Erfolg.
Sorry Anfänger aber vielleicht hilft mir trotzdem jemand auf die
Sprünge.

Tom

von Peter Dannegger (Gast)


Lesenswert?

Rück mal Deinen Bildschirm etwas näher ran, ich kann die Fehlermeldung
nicht lesen.


Peter

von Peter Dannegger (Gast)


Lesenswert?

P.S.

Ich meinte natürlich die komplette Fehlermeldung.

Da muß nämlich noch mehr stehen.


Peter

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

@Peter,

hier kommt der Bildschirm.
Alle SYMBOL: Name sind in der Projekt.H definiert.
Diese ist sowohl I2CBUS.LIB und im main Programm #includet.
Ich denke hier liegt der Fehler bzw. das Problem.
Auf alle Fälle Danke für die Schnelle Rückmeldung.

Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß "C_ARRAY_STAENDE_LADEN" eine Variable ist, die in
der Headerdatei nicht nur deklariert, sondern auch definiert ist?

Das ist ein Fehler.
In die Headerdatei davor das Wörtchen "extern" schreiben und die
Definition (und Initialisierung) der Variablen in ein C-Sourcefile
verlagern.

von Tom (Gast)


Lesenswert?

Hallo,

C_Array_Staende_Laden ist eine Funktion die im Headderfile mit extern
definiert ist

Tom

von Tom (Gast)


Lesenswert?

Hallo,

mir ist gerade etwas aufgefallen.
Ich speichere die Array Stande von 5 Arrays in 5 Integerwerte.
Wenn ich einen neuen Datensatz in eine Array speichere speichere ich
diesen auch im RTC per I2C zwischen damit ich bei einem Stromausfall
den Arraystand aus dem RTC wieder auslesen kann damit ich da
weitermache wo ich vor dem stromausfall war.Das speichern der Stände
mache ich einzel mit einer Funktion void Funktion (unsigned int).Das
funktioniert auch.Wenn ich nun die Arraystände auslesen will mache ich
das auch mit einer Funktion void Funktion (void) ich lese die
Arraystände in der Funktion einzel mit Pointer aus und versuche sie
dann direkt in den entsprechenden Arrraystand zu überschreiben mit dem
eingelesenen Wert.Eventuell liegt es daran!?!?!?!?

Tom

von Peter Dannegger (Gast)


Lesenswert?

Es muß irgendwo ne doppelte Definition auftreten von "S2000W1_Z" usw.
und eine davon ist in der Bibliothek.

Ist denn diese Bibliothek schonmal mit anderen Programmen getestet
worden, ob sie überhaupt funktioniert ?


Wenn Du den Quelltext hast, würde ich keine Bibliothek verwenden,
sondern diesen. Es ist sonst manchmal schwer, irgendwelche
Seiteneffekte in Zusammenhang mit diesen Black-Boxes zu finden.

Außerdem sind Bibliothken ja schon vorkompiliert und damit an ein
bestimmtes Memorymodell bzw. Bankingschema gebunden. Deshalb gibt es ja
von den Standardbibliotheken soviel verschiedene.


Peter

von Tom (Gast)


Lesenswert?

@Peter,
die Definition S2000W1_z ist in der Projekt.h definiert und diese ist
einmal in meinem C Programmfile includet und einmal auch in der
Bibliothek da ich dort auch auf die S2001W1_z zugreift.
Aber wie kann ich erreichen, dass die Projekt.h nur einmal definiert
wird. Geht das nicht mit #ifndef ... .Das ich irgentwie schreiben wenn
die Projekt.h schon einmal includet ist braucht sie nicht mehr includet
werden oder so ähnlich.

Gruß

Tom

von Peter Dannegger (Gast)


Lesenswert?

h-File:

extern int blabla;


Und in nur ein einziges c-File !!!

int blabla;


"einmal in meinem C Programmfile includet und einmal auch in der
Bibliothek"

???

Eine Bibliothek kann nichts mehr includen, da sie ja bereits compiliert
ist.


Peter

von Tom (Gast)


Lesenswert?

@Peter,

h-File

extern int .....;

Im C-File

#include <h-File>

Um die Bibliothek zu cmpilieren muss ich in der Funktion auch ein

#include <h-File> einfügen da diese Funktion  auf Variablen des h-Files
zugreift.

Ich kann dann die Bibliothek erzeugen ohne Fehler.
Wenn ich nun diese Funktion in meinen C-File aufrufe habe ich doch das
H-File doppelt und daraus kommt der Fehler.
Wenn ich die Funktion direkt in meine C Programm einfüge und diese aus
der Bibliothek nehme meckert er nicht.
Daher hat es etwas damit zu tun, dass das H-File einmen in der
Bibliothek und im C-File includet ist.

Gruß

Tom

von Peter Dannegger (Gast)


Lesenswert?

"Ich kann dann die Bibliothek erzeugen ohne Fehler."

Das ist noch lange kein Beweis, daß sie auch funktioniert.

Wenn Du die Sourcen hast, warum willst Du dann erst eine Bibliothek
erzeugen ?

Das ist doch nur zusätzlich Arbeit und bringt nichts.

Ich hab noch nie Bibliotheken gemacht, kann also nicht sagen, was es
dabei zu beachten gilt.


"Wenn ich nun diese Funktion in meinen C-File aufrufe habe ich doch
das H-File doppelt und daraus kommt der Fehler."

???

Ein h-File macht Funktionen und Variablen nur bekannt, damit der
Compiler weiß, wie er sie benutzen muß.
Es kann nichts doppelt aufgerufen werden, weil in h-Files gar nichts
aufgerufen wird.

Wenn Du ein File, welches Speicher belegt oder Code erzeugt, als h-File
bezeichnest, dann ist das falsch !
Und dann muß gemeckert werden, sobald dieses falsche h-File mehrfach
verwendet wird.


Peter

von Tom (Gast)


Lesenswert?

Wenn ich in einem Projekt zwei C-Files einfüge und in jedem das gleich
H-File include. Ich schreibe und lese Arrays im C-File 1.
Im C-File 1 versuche ich dann auf Arrays oder Variablen die ich im
C-File 1 auch verwende zuzugreifen dann ist der Fehler der gleiche.
Ich denke ich habe einen kleinen Fehler irgentwo indem ich auf mache
Varialblen , Array doppelt zugreife und in Jedem C-File das gleiche
H-File includiere.
Ich denke wir kommen auf diesem Weg nicht weiter.
Oder was schlägst Du vor.
Ich denke es ist ein Verständigungsproblem meinerseits.

Tom

von Peter D. (peda)


Lesenswert?

Häng doch mal das h-File hier an.


Peter

von T. Stütz (Gast)


Lesenswert?

Ich denke mal er linked sowohl die C-Source seiner Library ALS AUCH die
Library selber => nimmt mal die Library raus.

Gruss

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.