Forum: Compiler & IDEs Globale Varriable


von Michael S. (mians)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem. Vielleicht kann mir jemand weiter helfen. Danke.

Ich benutze AVR Studio V4.19

Ich möchte in c Programmieren.

Ich benutzt eine ATMega8.

Ich möchte globale Variablen erzeugen.

Im Anhang sind die *.c und *.h Dateien

Nach meine Verständniss Deklariere ich die globalen Variablen in 
prototypes.h.

In prototypes.c Defeniere ich diese globalen Variablen.

In den anderen*.c Dateien habe ich mit #include <prototypes.h> diese 
Deklaration mit integriert.

Beim Übersetzen bekomme ich folgende Fehlermeldung:
rm -rf Varriable.o  Varriable.elf dep/* Varriable.hex Varriable.eep 
Varriable.lss Varriable.map
Build succeeded with 0 Warnings...
avr-gcc -I"C:\AVR_Studio\Varriable\header"  -mmcu=atmega8 -Wall 
-gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT Varriable.o -MF 
dep/Varriable.o.d  -c  ../Varriable.c
avr-gcc -I"C:\AVR_Studio\Varriable\header"  -mmcu=atmega8 -Wall 
-gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT Initialisierung.o -MF 
dep/Initialisierung.o.d  -c  ../Initialisierung.c
avr-gcc -I"C:\AVR_Studio\Varriable\header"  -mmcu=atmega8 -Wall 
-gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT ISR.o -MF dep/ISR.o.d  -c 
../ISR.c
avr-gcc -I"C:\AVR_Studio\Varriable\header"  -mmcu=atmega8 -Wall 
-gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT prototypes.o -MF 
dep/prototypes.o.d  -c  ../prototypes.c
../prototypes.c: In function 'var':
../prototypes.c:9:6: warning: unused variable 'a' [-Wunused-variable]
../prototypes.c:8:6: warning: unused variable 'BERE' [-Wunused-variable]
../prototypes.c:7:6: warning: unused variable 'DSEK' [-Wunused-variable]
avr-gcc -mmcu=atmega8 -Wl,-Map=Varriable.map Varriable.o 
Initialisierung.o ISR.o prototypes.o     -o Varriable.elf
Varriable.o: In function `main':
C:\AVR_Studio\Varriable\default/../Varriable.c:14: undefined reference 
to `BERE'
C:\AVR_Studio\Varriable\default/../Varriable.c:14: undefined reference 
to `BERE'
C:\AVR_Studio\Varriable\default/../Varriable.c:17: undefined reference 
to `a'
C:\AVR_Studio\Varriable\default/../Varriable.c:18: undefined reference 
to `BERE'
C:\AVR_Studio\Varriable\default/../Varriable.c:18: undefined reference 
to `BERE'
Initialisierung.o: In function `init':
C:\AVR_Studio\Varriable\default/../Initialisierung.c:6: undefined 
reference to `DSEK'
C:\AVR_Studio\Varriable\default/../Initialisierung.c:6: undefined 
reference to `DSEK'
C:\AVR_Studio\Varriable\default/../Initialisierung.c:7: undefined 
reference to `BERE'
C:\AVR_Studio\Varriable\default/../Initialisierung.c:7: undefined 
reference to `BERE'
C:\AVR_Studio\Varriable\default/../Initialisierung.c:8: undefined 
reference to `a'
C:\AVR_Studio\Varriable\default/../Initialisierung.c:8: undefined 
reference to `a'
ISR.o: In function `__vector_6':
C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to 
`DSEK'
C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to 
`DSEK'
C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to 
`DSEK'
C:\AVR_Studio\Varriable\default/../ISR.c:9: undefined reference to 
`DSEK'
C:\AVR_Studio\Varriable\default/../ISR.c:12: undefined reference to 
`BERE'
C:\AVR_Studio\Varriable\default/../ISR.c:12: undefined reference to 
`BERE'
C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a'
C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a'
C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a'
C:\AVR_Studio\Varriable\default/../ISR.c:14: undefined reference to `a'
C:\AVR_Studio\Varriable\default/../ISR.c:15: undefined reference to 
`DSEK'
C:\AVR_Studio\Varriable\default/../ISR.c:15: undefined reference to 
`DSEK'
collect2: ld returned 1 exit status
make: *** [Varriable.elf] Fehler 1
Build failed with 23 errors and 3 warnings...

Habe ich ein Problem in dem Programm, oder mit dem AVR Studio 
(Toolchain)???

: Verschoben durch Admin
von A. S. (Gast)


Lesenswert?

Du hast leider die paar Zeilen Header und C-File Code nicht angefügt.

Ich nehme jetzt als Beispiel die Variable DSEK und unterstelle int.

in prototypes.h:
1
extern int DSEK;

in der prototypes.c
1
int DSEK;

Ist das so bei Dir? Oder hast Du irgendwo >static< oder was andere mit 
beigemixed?

von Jim M. (turboj)


Lesenswert?

Schlimmer: Sie sind nur innerhalb einer Funktion "var()" und nicht 
global deklariert.

Bei "static" würde das IMHO in der Warning mit stehen.

: Bearbeitet durch User
von mians (Gast)


Lesenswert?

Ja das stimmt.
in der header Datei : extern int a;
und in der prototypes.c : int a;

von mians (Gast)


Lesenswert?

Ich hatte var(); auch vor die main() gesetzt. Aber da bekamm ich die 
selbe Fehlermeldung zu den Variablen in den einzelnen Funktionen.

von Michael S. (mians)


Angehängte Dateien:

Lesenswert?

Hallo,

in der Datei prototypes.h sind die Zeilen 4 - 6 mit den Varriablen.
Und die Datei prototypes.c habe ich vergessen mit hoch zu laden. 
Entschuldigung.

von Michael S. (mians)


Lesenswert?

Hallo,

folgende Fehlermeldung bekomme ich, wenn ich var(); vor die 
main-Schleife setze:

Build started 30.10.2016 at 01:09:29
avr-gcc -I"C:\AVR_Studio\Varriable\header"  -mmcu=atmega8 -Wall 
-gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT Varriable.o -MF 
dep/Varriable.o.d  -c  ../Varriable.c
../Varriable.c:4:1: warning: data definition has no type or storage 
class [enabled by default]
../Varriable.c:4:1: warning: type defaults to 'int' in declaration of 
'var' [enabled by default]
../Varriable.c:4:1: error: conflicting types for 'var'
C:\AVR_Studio\Varriable\header/prototypes.h:9:13: note: previous 
declaration of 'var' was here
make: *** [Varriable.o] Fehler 1
Build failed with 1 errors and 2 warnings...


Ich habe mehrere Sachen ausprobiert und bin langsam am verzweifeln.

In dem Buch "Softwareentwicklung in C für Mikroprozessoren und 
Mikrocontroller" von Jörg Wiegelmann klingt es so einfach und logisch. 
Deshalb habe ich bedenken, dass an den Einstellungen von AVR Studio 
etwas nicht stimmt.

von ProjektX (Gast)


Angehängte Dateien:

Lesenswert?

Mein Freund, ich weiß gar nicht wo ich anfangen soll...

Aber kritisieren können hier schon viel zu viele, fangen wir mit etwas 
Sinnvollem an:

1.) Du installierst dir die neueste Version von AVR Studio (7.0). Ist 
immer noch kostenlos erhältlich.
2.) Es gibt eine positive Nachricht: Das Konzept von .c und .h - Dateien 
hast du (beinah) verstanden. In der Praxis macht man es eher anders mit 
der Verwaltung und Verteilung von Variablen und includes, aber lassen 
wir das erstmal.
3.) Ich war so lieb und habe für dich das Ganze als Projekt in AVR 
Studio 7.0 aufgestellt und ohne Fehler für den ATmega8 kompilliert. 
Bittesehr, nun öffne dies und lies Punkt 4.

4.) Dein größter Fehler war: Lokale .h -Dateien  werden nicht
    #include <prototypes.h> geschrieben, sondern #include 
"prototypes.h".
Merkst du den Unterschied? Anführungszeichen für Daten, die im gleichen 
Ordner liegen, wie deine main.c (deine ehemalige Varriable.c) und <> - 
Tags für Bibliotheken in deinem AVR-Verzeichnis (also global).

Außerdem liegt bei mir die STD-Lib in #include <stdlib.h>

5.) Verwende Datentypen, an denen du ihre Speichergröße erkennst, also 
int8_t/uint8_t, int16_t/uint16_t anstatt int, long etc. Hat den Vorteil, 
dass du nicht durcheinanderkommst, wie zum Beispiel bei der 
Portzuweisung
PORTC = a. Portregister C hat nämlich 8 Bits, also ein Byte. Deine 
Variable a ist vom Datentyp int, also int16_t, was also 16 Bits oder 
zwei Bytes entspricht.

6.) Übe fleißig und programmiere viel. Verwende nicht nur eine Quelle 
(dein Buch da), sondern recherchiere fleißig. Mit etwas Geduld wird es.

von ProjektX (Gast)


Lesenswert?

P.S.: Achja, die "extern"-Bezeichner habe ich ebenfalls entfernt. 
Brauchst du hier nicht.

von ProjektX (Gast)


Lesenswert?

P.P.S.: du solltest auch eine Interruptfreigabe durch ein sei(); vor der 
while()-Schleife in der main.c einsetzen, andernfalls wird deine ISR 
nicht ausgeführt.
Noch viele andere Sachen, aber fange erstmal damit an ;)

von Rolf M. (rmagnus)


Lesenswert?

Michael S. schrieb:
> Hallo,
>
> folgende Fehlermeldung bekomme ich, wenn ich var(); vor die
> main-Schleife setze:

Du kannst Funktionen nicht außerhalb von anderen Funktionen aufrufen.
Und du kannst globale Variablen nicht in Funktionen definieren. Genau 
das macht sie nämlich zu lokalen Variablen.
Was du also machen musst, ist die Definition der Variablen aus der 
Funktion var() rausziehen.

von Michael S. (mians)


Lesenswert?

Hallo  ProjektX,

danke für deine Mühe.

Zu Punkt 1. Danke für den Tipp. Bin gerade dabei 7.0 zu installieren.

Zu Punkt 4. Ich wollte meine Headerdatein an einem gesammelten Ort 
ablegen und nicht in dem Projektordner. Aber vielen Dank für den Tipp. 
Jetzt verstehe ich, warum es bei mir nicht mit denn "xx" funktioniert 
hat, aber mit dem <xx>.

zu Punkt 5. Ich werde mir dass mit den richtigen Speichergrößen sofort 
angewöhnen. Danke

zu Punkt 6. Ich habe auch im Internet nachgelesen. Dort wird in der 
Headerdatei auch das "extern" mit genutzt.
Wenn ich bei mir in der Headerdatei das "extern" weg lasse, lässt sich 
das Projekt auch fehlerfrei compilieren. Aber beim Debuggen wirkt die 
Variable "BERE" nicht global.
In der ISR wird Register R24 auf 1 gesetzt. Am Ende der ISR springt das 
Programm wieder in die main(). Bei der Abfrage des Unterprogramms
(if (BERE ==1)) springt das Programm nie in das Unterprogramm. Und da 
glaube ich, fehlt das extern in der Headerdatei, um die Variable als 
global zu deklarieren. (Das war übrigens meine Ausgangssituation, warum 
ich das Buch und das Internet zu rate gezogen habe.)

Danke für deine Mühe

von ProjektX (Gast)


Lesenswert?

> Zu Punkt 1. Danke für den Tipp. Bin gerade dabei 7.0 zu installieren.

Ist für alle Beteiligten und vorallem dich selbst besser, glaub mir.

> Zu Punkt 4. Ich wollte meine Headerdatein an einem gesammelten Ort
ablegen und nicht in dem Projektordner. Aber vielen Dank für den Tipp.
Jetzt verstehe ich, warum es bei mir nicht mit denn "xx" funktioniert
hat, aber mit dem <xx>.

Wenn du in deinem Projekt Ordner mit includes hast, dann verwendest du 
eine sog. relative Pfadangabe, sowas wie
1
 #include "../unterordner/test.h"

Generell würde ich aber sagen, dass du für jedes deiner Projekte die 
benötigten .c und .h -Dateien mit zu den Projektdateien kopierst. Gibt 
einfach weniger Probleme. (Dann bist du mal an einem anderen Computer 
und hast nur die Projektdaten, jedoch nicht deine externen Bibliotheken 
zur Hand o.ä. Da gibt es aber die Option automatisch alle verwendeten 
Bibliotheken ins Projektverzeichnis zu kopieren)

Zum 6. Punkt: Da verweise ich auf den Beitrag von Rolf Magnus, der 
natürlich völlig Recht hat. Sprich, der Fehler beim Kompillieren kommt 
vorrangig davon, dass deine Variablen lokal in var() initialisiert 
werden. Und eben nicht global, was deine eigentliche Intention war.

von ProjektX (Gast)


Lesenswert?

Wenn du immer noch irgendwelche Gedankenfehler und darausfolgend auch 
Codefehler hast, dann poste doch mal den aktuellen Zustand deines 
Projektes.

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.