Hallo Forengemeinde, Habe ein Atmega32 Projekt, wo ich bis jetzt folgende Files habe: - ein Include-File wo ein Teil meiner Variablen deklariert sind. - ein Main-C File, wo meine Haupt-Anwendung steckt, mit ca. 500 Zeilen Code. - ein C-File, wo meine Service-Routinen stecken, mit ca. 400 Zeilen Code. In beiden C-Files ist die Include-Datei, und weitere eingebunden. In der Main-C steckt eine Timer/ISR Routine, die ich für das Display und andere Sachen, wie Sekunden-Timer, ect. benötige. Diverse Variablen, wie z.B. Chip_Timeout sind mit 'volatile' erstellt. Erst in der Main, dann verschoben in der Header mit dem Zusatz 'EXTERN' . Also sollte ich doch von ALLEN C-Files darauf zugreifen können. - EXTERN volatile int Chip_Timeout; Soweit funktioniert auch die Anwendung, inclusive Hardware. Nun zum Problem: Chip_Timeout funktioniert auch in der Main.c, da hier die ISR ist. Ich benötige aber diesen Chip_Timeout aber auch in dem C-File, wo mein 'Service' - Zeugs ist. Und da klappt es nicht. Es kommt kein Fehler beim Build. Anscheinend wird die Variable (Chip_Timeout) in der ISR ignoriert, oder was ??? Wie kann man diese Problem lösen, damit Chip_Timout in beiden C-Files funktioniert ?
:
Bearbeitet durch User
Thomas S. schrieb: > Wie kann man diese Problem lösen, damit Chip_Timout in beiden C-Files > funktioniert ? Mit einem nachvollziehbaren Codebeispiel. Sorry, die Prosa allein genügt bei sowas nicht. Falls du beispielsweise EXTERN wirklich so geschrieben hast - das gibt es in C nicht als Schlüsselwort …
Thomas S. schrieb: > dann verschoben in der Header mit dem Zusatz 'EXTERN' Damit hast du aus einer Definition eine Deklaration gemacht.
Jörg W. schrieb: > Falls du beispielsweise > EXTERN wirklich so geschrieben hast - das gibt es in C nicht als > Schlüsselwort … Habe ich so aus einem Beispiel, evtl. sogar vom Tutorial hier. Findes es aber gerade nicht. Von irgendwo, mit GCC her. Da war es so geschrieben. Wie würde es denn richtig sein?
Arduino F. schrieb: > Thomas S. schrieb: >> Wie würde es denn richtig sein? > extern Habs grad getestet. Schreibe ich es :extern - dann ist es zwar blau und wäre Schlüsselwort. Aber es kommen dann unzählige Fehler. EXTERN geschrieben ist es schwarz. Aber der Compiler meckert nicht, und es funktioniert.
Thomas S. schrieb: > Aber es kommen dann unzählige Fehler. Beheben! Thomas S. schrieb: > :extern extern und nicht :extern
:
Bearbeitet durch User
Arduino F. schrieb: > Thomas S. schrieb: >> Aber es kommen dann unzählige Fehler. > > Beheben! Wie anders beheben? in der Header-datei:
1 | extern volatile int Chip_Timeout; |
[c} Chip_Timeout = 0; [/c] dann kommt: Error 80 undefined reference to `Chip_Timeout' E:\....
:
Bearbeitet durch User
foobar.h:
1 | extern volatile int chip_timeout; |
foobar.c:
1 | volatile int chip_timeout; |
2 | |
3 | void main() |
4 | {
|
5 | chip_timeout = 0; |
6 | }
|
Thomas S. schrieb: > in der Header-datei: > extern volatile int Chip_Timeout; // Deklaration Richtig! Und in irgendeiner C Datei:
1 | volatile int Chip_Timeout = 0; // Definition und Initialisierung |
Arduino F. schrieb: > Richtig! > > Und in irgendeiner C Datei: Kann mir das bitte jemand näher erklären, warum es so funktioniert? Ich dachte, es wäre dann eine doppelte Deklaration, wo der Compiler meckert.
in der Header-Datei: extern volatile int Chip_Timeout; Das erklärt dem Compiler um welchen Datentyp es sich bei der Variable handelt. Und in irgendeiner C Datei: volatile int Chip_Timeout = 0; // Definition und Initialisierung Hier wird die Variable tatsächlich erzeugt und der Speicher dafür reserviert. Das darf natürlich nur genau 1 mal passieren. Der Linker sorgt dann dafür, das alle Referenzierungen der Variable auf den selben Speicher verweisen.
:
Bearbeitet durch User
Thomas S. schrieb: > Ich dachte, es wäre dann eine doppelte Deklaration, Du darfst und kannst so oft deklarieren wie du willst. Auch gerne 5000 mal nacheinander. Aber Definitionen, die darf es nur einmal geben. Tipp: Du brauchst ein C Grundlagenbuch Oder sofort C++
:
Bearbeitet durch User
Ich denke das habe ich hier raus: Link:Beitrag "Re: Globale Variablen, mehrere Dateien" Da ist es so beschrieben, wie ich es bislang hatte.
Thomas S. schrieb: > Da ist es so beschrieben, Was ohne Grundlagenwissen einfach nur Schwachfug ist. Nochmal, nimm dir ein C Buch zu Brust, oder besser sofort C++. Aus Foren lernt man so nichts, oder oft auch das falsche. Wie wie hier mal wieder gesehen haben. Und das nicht zum ersten mal.
Lies besser das: https://seriouscomputerist.atariverse.com/media/pdf/book/C%20Programming%20Language%20-%202nd%20Edition%20(OCR).pdf
Thomas S. schrieb: > Da ist es so beschrieben, wie ich es bislang hatte. Da steht aber auch noch folgende Zeile:
1 | #ifndef EXTERN
|
2 | #define EXTERN extern
|
3 | #endif
|
Bin lieber ein vernünftiges Buch. Gibt es auch kostenlose im Internet.
N. M. schrieb: > Bin lieber ein vernünftiges Buch. Du sprichst in Rätseln. > Gibt es auch kostenlose im Internet. Was kannst du empfehlen?
:
Bearbeitet durch User
Rainer W. schrieb: > N. M. schrieb: >> Bin lieber ein vernünftiges Buch. > > Du sprichst in Rätseln. Ja, Autovervollständigung ohne gegenlesen. Bin==Lies. Rainer W. schrieb: >> Gibt es auch kostenlose im Internet. > > Was kannst du empfehlen? Nö, schon lange keins mehr gelesen. Von dem her kann ich gerade keins persönlich empfehlen. Aber man bekommt definitv Skripte von FHs/Unis zum Thema. Und Bücher gab es auch schon immer kostenlose.
Thomas S. schrieb: > Aber der Compiler meckert nicht, und es funktioniert. Offenbar ja nicht, sonst hättest du den Thread nicht begonnen. Daher bat ich eingangs um ein nachvollziehbares Beispiel. Dieses sollte auf das Minimum zusammen gestrichen sein, mit dem man sieht, wie du das aufgebaut hast. (Ganz am Rande: wenn man sich die Arbeit macht, so ein Beispiel aus dem zusammen zu streichen, was man hat, versteht man häufig auch gleich sein Problem.)
Jörg W. schrieb: > wenn man sich die Arbeit macht, so ein > Beispiel aus dem zusammen zu streichen, was man hat, versteht man häufig > auch gleich sein Problem Sein Problem ist, dass er den Unterschied zwischen Deklaration und Definition nicht kennt und deshalb nicht berücksichtigt. Für mich war das seinerzeit beim Lernen anhand von K & R zunächst verwirrend, weil beide Begriffe in der Normalsprache ja ungefähr dasselbe meinen. Wenn ich definiere, was ein "Hund" ist, dann entsteht dadurch kein konkreter Hund. Ich sage damit lediglich, wie ein Hund aussähe, wenn einer da wäre. Nicht anders ist es, wenn ich vereinbare (deklariere), dass ich und andere ein Wesen mit bestimmten Eigenschaften (wenn denn ein solches Wesen da wäre) "Hund" nennen wollen. Wo ist da ein Unterschied? In C entsteht durch eine Definition aber etwas durchaus Greifbares, nämlich ein reservierter Speicherplatz der definierten Größe im fertigen Programm; bei einer Deklaration entsteht gar nichts.
:
Bearbeitet durch User
Rolf schrieb: > Sein Problem ist, dass er den Unterschied zwischen Deklaration und > Definition nicht kennt und deshalb nicht berücksichtigt. Zumal eine Definition ja in der Regel auch zugleich eine Deklaration ist. ;-) Sollte an sich trotzdem nicht zu dem beschriebenen Effekt führen: wenn sowohl Deklaration als auch Definition das "volatile" haben, dann müsste es funktionieren – und den Unterschied zwischen beiden hat er am Ende mit seinem Headerfile-Trick mit EXTERN unbewusst tatsächlich realisiert.
Thomas S. schrieb: > Erst in der Main, dann verschoben in der Header mit dem Zusatz 'EXTERN' Hier eine gute Erklärung: https://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source-files/1433387 Damit habe ich es auch hinbekommen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.