Array mit Funktion aufrufen mituVision2

Gast #225999
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
Gast #226002
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
Angehängte Dateien:
Gast #226004
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
Gast #226006
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
#226007
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
Gast #226008
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
Gast #226009
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
Gast #226010
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.
Gast #226011
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
Gast #226013
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
Gast #226016
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
#226017
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
Persönliche Seite #226018
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.
Gast #226019
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
Persönliche Seite #226020
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.
Gast #226021
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren