Forum: Mikrocontroller und Digitale Elektronik Array mit Funktion aufrufen mituVision2


von Tom (Gast)


Lesenswert?

Hallo Zusammen,

ich habe mal wieder ein Problem.
Ich habe ein Array in meinem Projekt angelegt und dieses beschrieben
und wieder ausgelesen ohne Probleme.
Nun wollte ich das auslesen über eine Funktion aufrufen und hebe diese
in eine Bibliotek eingebunden. Danach kommt folgender Fehler.
*** Error L105
    Public Refers to Ignored Segment
    Symbol: symbol-name
    Segment: segment-name
Wenn ich die *.lib erzeuge kommen keine Fehler alles OK.
Wenn ich die Funktion direkt unter main einfüge kommen auch keine
Fehler.
An was kann das liegen?

Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daran, daß Du den Quelltext nicht postest?

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Hier die errorliste

Gruß

Tom

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die Errorliste bei der erstellung der *.lib.
wenn ich die beiden Funktionen
c_Mittelwert_bestimmen_S2001ID_817a.obj",
"c_Mittelwert_bestimmen_S2001IuA_817a.obj"

einzeln linke kommt dieser Error nicht?!?!?

Gruß

Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was mag wohl
ERROR L104: MULTIPLE PUBLIC DEFINITIONS
bedeuten?

Ich habe den Verdacht, daß Du da bei der Libraryerzeugung bzw. Deiner
Projektverwaltung irgendwas grundlegendes falsch machst.

von Tom (Gast)


Lesenswert?

JA, aber was ?

ich habe alle Variablen und alle Arrays die ich mit dieser Funktion
aufrufe mit extern gekennzeichnet.
Es werden aber auch noch weitere Variablen angemeckert die ich nur in
main verwende.

Gruß

Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sieht so aus, als ob Du die Objektdatei zweimal zum Programm linkst
- einmal als reine Objektdatei, das zweite Mal verpackt in der
Library.

Oder hast Du gar ein #include "bla.c" irgendwo stehen?

von Tom (Gast)


Lesenswert?

Ich habe alle include dateien definitionen von Arrays,Variablen etc.In
eine Test1.h gepackt und dieses von main includet.
Nun habe ich eine Billiothek und alle Funktionen dieser sind in einem
Test2.h zusammengefasst.
In den Funktionen ist auch zum Teil die Test1.h includet da ich auf die
dort definierten Arrays zugreife.
Eventuell ist das das Problem das alles über kreuz geht.
Aber ich habe keine Ahnung wie ich es sonst lösen kann lass mich aber
auch gerne bekehren.

Gruß

Thomas

von Peter D. (peda)


Lesenswert?

Warum willst Du denn unbedingt Bibliotheken selber basteln ?

Ist das eine Kundenarbeit und Du willst die Sourcen nicht rausrücken ?

Na dann armer Kunde.

Wir haben auch mal Software fremdentwickeln lassen und dann gabs
massive Bugs und die Entwicklungsfirma gabs nicht mehr.
Da wir die Sourcen nicht hatten, mußten wir alles wegschmeißen und
nochmal ganz von Null anfangen.

Seitdem wird keine externe Arbeit ohne komplette und kommentierte
Sourcen inclusive aller Compilereinstellungen und Make-Files mehr
akzeptiert.


Peter

von Tom (Gast)


Lesenswert?

@Peter,

es ist keine Kundenarbeit ich mache gerade eine Technikerarbeit und
versuche im Programm eben die ganzen Funktionen über eine Bibliothek
aufzurufen.
Das hat bis jetzt auch ganz gut geklappt nur als ich diese Funktionen
die auf Arrays zugreifen in die Bibliothek einbinden wollte gab es
plötzlich diese Fehler.
Die Arrays sind im allgemeinen alle gleich aufgebaut nur
unterschiedlich groß daher sind auch alle Funktionen ziemlich
gleich.Wenn ich nur eine Funktion einbinde kommt kein Fehler beim
erstellen der Bibliothek erst bei der zweiten kommt der Fehler siehe
Error_lib, beide einzeln einbinden funktionieren.Ich habe nun die
Funktionen direkt in mein Programm eingefügt dort funktionieren sie
ohne Fehler.
Da ich Anfänger bin lasse ich mich gerne von einer Anderen
vorgehensweise überzeugen.

Gruß

Tom

von Tom (Gast)


Lesenswert?

Habe immer noch das Problem.
Kann mit jemand eventuell mal ein Beispielprojekt von uvision2
schicken, bei dem die Funktionen anderst als über eine Biblithek
eingebunden sind.
Habe diese Variante nun schon  mehrmals probiert aber immer nur Fehler
Fehler Fehler.

Danke

Tom

von Marillion (Gast)


Lesenswert?

Error L104
Multiple Public Definitions
Summary   *** Error L104
    Multiple Public Definitions
    Symbol: symbol-name
    Module: filename (module-name)


Description   The specified public symbol in the specified module is
defined in a previously processed file.

Copyright (c) Keil Software, Inc. and and Keil Elektronik GmbH. All
rights reserved.

von Tom (Gast)


Lesenswert?

Ja und was ist da falsch???
Das der Symbolname mehrmals definiert ist ist mir auch klar.
Leider kann ich keine Möglichkeit finden es nur einmal zu definieren.
Steht es 2x mit includet bringt es diesen Fehler Komentiere ich es in
einem File aus bringet es den Fehler Variablen nicht definiert.

UND JETZT !!!!!!!!!!!!!!!!!!!
Keil Home Page liefert nicht das geringste Beispiel wie in einem
solchen fall zu deklarieren ist.

TOM

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zitiere doch mal den Ausschnitt aus Deiner Headerdatei, in der Du dieses
Symbol deklarierst/definierst.

Wie man in diesem Fall vorzugehen hat, habe ich bereits am 15.9.
gepostet, aber das kann ich Dir anhand eines Beispiels auch gerne
nochmal zeigen.

Keil ist nicht dafür zuständig, die Grundlagen der C-Programmierung zu
dokumentieren.

von Peter Dannegger (Gast)


Lesenswert?

Es ist gar nicht schön, zwischen verschiedenen Threads umherzuspringen.

Bleibe bei einem Thread, dann kann man auch verfolgen, was bisher
gesagt wurde.

Ich hab jedenfalls keine Lust, alles nochmal zu sagen.


Peter

von TOM (Gast)


Lesenswert?

@ Rufus,

ich schicke sie Dir gerne mal per Mail zu nur hier möchte ich sie recht
ungern posten.
Schick mir Deine Adresse per Mail und ich schicke Dir File zu.

Gruß

Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein Ausschnitt mit der Deklaration exakt einer Variablen genügt. Daher
gibt's keine Email-Adresse; vielleicht stolpert ja auch mal wer
anderes über das Problem und kann aus diesem Thread sinngebendes
entnehmen.

von TOM (Gast)


Lesenswert?

OK!
Hier Deklaration eines Arrays

xdata int MS2001IuA0 [6][3];
xdata int S2001IuA [500][6];

unsigned char MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0,
              MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0;

              //Zeilenzähler für Zwischenspeicher Array
unsigned char S2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0,
              MS2000R_z=0,MS2000W1_z=0;

habe es auch mir extern probiert ohne erfolg.

Wie gesagt das Problem schein zu sein dass ich von main und von der
Libruaryfunktion auf diese Arrays etc. zugreife.
Hast Du eventuell ein Beispiel Projekt wie dieses Aufgebaut ist wenn
ich die Funktion direkt als *.c einfüge und nicht über LIB.
Habe schon einiges probiert doch leider ohne Erfolg.

@Peter,

sorry aber ich denke dies sind unterschiedliche Probleme und diese alle
in einem Thread zu besprechen macht das ganze etwas undurchsichtig.

TOM

von Peter D. (peda)


Lesenswert?

"sorry aber ich denke dies sind unterschiedliche Probleme"

Du irrst !

Dein Problem ist immer noch das gleiche, Du hast nicht zugehört
(gelesen), was in ein h-File gehört.

Das da oben sind Speicherallocationen und Zuweisungen, die eben nicht
reingehören sondern in nur eines der C-Files !


Das h-file muß mit "extern" und ohne Zuweisung sein:
1
extern xdata int MS2001IuA0 [6][3];
2
3
extern unsigned char S2001IuA5_z,
4
                  MS2001IuA6_z,
5
                  MS2001IuA7_z,
6
                  MS2000R_z,
7
                  MS2000W1_z;


Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter bestätigt meine Vermutungen.

Ausführlicher:

Was Du (Tom) da bislang machst, ist, daß Du in jedem Modul, das die
Headerdatei einbindet, neue globale Variablen MS2001uA0 etc. anlegst.
Somit sind diese mehrfach vorhanden, was zur von Dir beklagten
Linkermeldung führt.

Zwar kann man den gcc-linker dazu bewegen, solche mehrfach vorhandenen
globalen Variablen gleichen Namens zusammenzufassen und so diesen
Fehler zu kaschieren, das aber ist alles andere als standardkonformes
Verhalten (und wird von daher von mir mit gerümpfter Nase*
betrachtet).

Also:

In einer Headerdatei werden die von Dir verwendeten Variablen
deklariert (mit dem Schlüsselwort "extern"), und in exakt einem
C-Sourcefile werden die Variablen definiert_ und _initialisiert.

Das sollte entweder das Sourcefile sein, das funktional am meisten mit
diesen Variablen zu tun hat (so denn Dein Programm wenigstens so
strukturiert geschrieben ist, daß ein solcher Zusammenhang zu erkennen
ist) oder aber in einem eigenen Sourcefile, das Du vielleicht auch
sinnvoll globals.c oder ähnlich benennen solltest.

Die Headerdatei, in der diese Variablen deklariert und initialisiert
werden, sollte der übersichtlichkeit halber denselben Namen wie das
Sourcefile haben, in dem die Variablen definiert sind.


*) Sinnvoll ist meiner Ansicht nach ein orthogonales Verhalten; warum
Variablen anders behandeln als Funktionen? Funktionen gleichen Namens
in mehreren Modulen lassen sich -wie wohl jeder erkennen dürfte- eh'
nicht zusammenfassen. Also sollten solche Mauscheleien unterbleiben.

von Tom (Gast)


Lesenswert?

@ Peter und Rufus,

Danke erst mal für Eure schnelle Hilfestellung zu meinem Problem.

Ich möchte nun nochmal zusammenfassen ob ich alles verstanden habe.
Ich deklariere in meinem C-Sourcefile die Variablen wie folgt:

xdata int MS2001IuA0 [6][3];
xdata int S2001IuA [500][6];

unsigned char MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0,
              MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0;

              //Zeilenzähler für Zwischenspeicher Array
unsigned char S2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0,
              MS2000R_z=0,MS2000W1_z=0;

Nun erstelle ich ein H-File mit dem gleichen Name wie das C-File und
deklariere wie folgt:

extern xdata int MS2001IuA0 [6][3];
extern xdata int S2001IuA [500][6];

extern unsigned char MS2001ID_z=0,MS2001IuA0_z=0,MS2001IuA1_z=0,
              MS2001IuA2_z=0,MS2001IuA3_z=0,MS2001IuA4_z=0;

              //Zeilenzähler für Zwischenspeicher Array
extern unsigned char S2001IuA5_z=0,MS2001IuA6_z=0,MS2001IuA7_z=0,
              MS2000R_z=0,MS2000W1_z=0;

Habe ich dies nun hoffentlich richtig verstanden!!

Gruß

TOM

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Fast. Aber Du näherst Dich dem Ziel.

In der Headerdatei musst Du die Initialisierungen weglassen, also nur

  extern xdata int MS2001IuA0 [6][3];
  extern xdata int S2001IuA [500][6];

  extern unsigned char MS2001ID_z, MS2001IuA0_z, MS2001IuA1_z,
              MS2001IuA2_z, MS2001IuA3_z, MS2001IuA4_z;

etc. schreiben.

Das hat Peter übrigens schon gestern abend so geschrieben.

von Tom (Gast)


Lesenswert?

@ Rufus&Peter,

sorry, habe dieses Detail anscheinend in meiner Verzweiflung
übersehen.
Habe nun alles so geändert wie Ihr es geschrieben habt, habe nun auch
den Zusammenhang zwischen C-Source,Funktionen und H-File begriffen war
eben das erste Mal für mich.
In anderesn H-Files ist es ja grnauso hätte mir eigentlich auffallen
müssen doch vor lauten Bäumen habe ich anscheinend den Wald übersehen.
Aus alle Fälle funktioniert nun mein Programm ohne zu maulen.

DANKE nochmal für eure tatgräftige Unterstützung mich auf den richtigen
Weg zu führen finde ich super von Euch.

Nur noch eine vorläufig letzte Frage mit welchen Tool/Programm arbeitet
Peter da immer das mit der Syntaxhervorhebung?

Gruss

TOM

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist eine Funktion des Forums. Text, der von
"eckige-Klammer-auf C eckige-Klammer-zu" und "eckige-Klammer-auf / C
eckige-Klammer-zu" umgeben ist, wird so dargestellt.
1
also so zum Beispiel

Klicktest Du auf das oberhalb des Abschnittes zu sehende '?', dann
erhieltest Du auch eine entsprechende Hilfe.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

... funktioniert wohl nicht immer
1
// ich bin ein kommentar
2
3
/* ich bin auch einer */

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.