mikrocontroller.net

Forum: Compiler & IDEs if Problem in einer Funktion


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich hoffe ihr wird nicht über meine Frage lachen.

ich definiere in header file  die Variable uint8_t  count;
in der main Funkion ich initialisiere count=2;

in der unter_routine ich  schreibe:

void Test_function(uint8_t zahl){

if( count == 4)
{
error();
}
 bla;
 bla bla;
count++;
}
 Die Funktion error wie nie aufgerufen obwohl count = 4;

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in der Funktion wird eine Kopie der Variable angelegt, es wird nicht die 
"echte" Variable reingereicht. Dafür mussst du eine Referenz oder ein 
Zeiger verwenden.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> in der Funktion wird eine Kopie der Variable angelegt, es wird
> nicht die "echte" Variable reingereicht. Dafür mussst du eine
> Referenz oder ein Zeiger verwenden.

Das trifft hier nicht zu. Der übergebene Parameter "zahl" wird gar nicht 
ausgewertet, sondern eine globale Variable "count".

Fragwürdig ist allerdings die Tatsache, daß "count" in einer Headerdatei 
definiert wird.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo soll ich die variable deklariert?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen werden nur dann in Headerdateien überhaupt erwähnt, wenn sie 
aus mehreren Quelltextdateien (*.c) heraus verwendet werden sollen.

So etwas nennt man globale Variable.

Diese werden in der Headerdatei deklariert (mit dem Schlüsselwort 
"extern") und in einer Quelltextdatei des Gesamtprojektes definiert.

Die Deklaration einer Variablen sagt dem Compiler, daß es irgendwo 
eine Variable des angegebenen Namens und Typs gibt.

Die Definition einer Variablen legt zusätzlich den Speicherort fest.

Bei Variablen, die nur innerhalb einer Quelltextdatei verwendet werden 
sollen, gehört die Definition in genau diese Quelltextdatei, eine 
Deklaration mit "extern" entfällt hier.

Um sicherzustellen, daß auf diese Variable nicht doch versehentlich aus 
anderen Quelltextdateien zugegriffen werden kann, kann so eine Variable 
als "static" definiert werden.

So etwas nennt man modulglobale Variable. Diese Variable ist weiterhin 
global, denn sie ist für alle Funktionen im gleichen Modul sichtbar.

Eine lokale Variable hingegen ist eine innerhalb einer Funktion 
definierte Variable, auf diese kann auch nur innerhalb der Funktion 
zugegriffen werden -- das hier auch zulässige Schlüsselwort "static" hat 
hier eine ganz andere Bedeutung, nämlich daß die Variable zwischen zwei 
Funktionsaufrufen ihren Wert behält.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:

> Diese werden in der Headerdatei deklariert (mit dem Schlüsselwort
> "extern") und in einer Quelltextdatei des Gesamtprojektes definiert.

Es sei denn, man ist geneigt, common Variablen zu verwenden.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke sehr für die Erklärung es ist mir jetzt klar

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:

> So etwas nennt man modulglobale Variable. Diese Variable ist weiterhin
> global, denn sie ist für alle Funktionen im gleichen Modul sichtbar.

Ich würde sie ehr modulintern nennen, um keine Verwechslung mit
globalen Variablen aufkommen zu lassen.  Im C-Standard heißen sie
Variablen mit "file scope".

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe gelesen und verändert aber die Funktion Error wird nicht 
aufgerufen.
count habe ich in der header file deklariet, weil es in der main 
definiert und in dem anderen Quelltestdatei benutzt.
Habe ich Zeiger definiert aber kriege ich nicht das Ergebnis.

Danke

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeigen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier ist das  Programm

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sorry, habe ich nicht das dokument angehängt

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
> sorry, habe ich nicht das dokument angehängt

Sorry, aber was soll das?  Willst du Hilfe haben, oder möchtest du
die C-Syntax-Erratefähigkeiten unseres Compilers testen?  Nicht nur,
dass kein Makefile beiliegt (man kann also deine Compileroptionen
nur raten), sondern es ist allesamt kompletter syntaktischer
Schwachsinn.
$ avr-gcc -S -mmcu=atmega8 main.c 
In file included from main.c:7:
init.h:1: error: expected identifier or '(' before ':' token
In file included from main.c:7:
init.h:5:38: warning: no newline at end of file
main.c:15:2: warning: no newline at end of file
$ avr-gcc -S -mmcu=atmega8 test.c 
In file included from test.c:7:
init.h:1: error: expected identifier or '(' before ':' token
In file included from test.c:7:
init.h:5:38: warning: no newline at end of file
test.c:13: error: redefinition of 'Test_function'
init.h:1: error: previous definition of 'Test_function' was here
test.c: In function 'Test_function':
test.c:19: error: 'bla' undeclared (first use in this function)
test.c:19: error: (Each undeclared identifier is reported only once
test.c:19: error: for each function it appears in.)
test.c:20: error: expected ';' before 'bla'
test.c: In function 'Error':
test.c:26: error: 'bla' undeclared (first use in this function)
test.c:27:2: warning: no newline at end of file

So wird dir keiner vernünftig helfen können.

Autor: Mati (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Variable 'count' ist in der Headerdatei 'init.h' als nicht extern 
definiert.
Die Headerdatei wird jedoch in beiden Quellcode-Dateien 'test.c' und 
'main.c' includiert. Das heisst;
 - es wird die Variable 'count' wird 2x angelegt.
 - Die Variable count aus 'test.c' wird nicht initialisiert. Sie hat 
also einen zuffäligen Anfangswert.
Lösung:
int der init.h
    extern uint8_t  count;
int der main.c
    uint8_t  count;

Jetzt arbeiten beide Quellcode-Dateien mit der gleichen Variable.

Gruß

Mati.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,
es tut mir leid, ich brauche nur Hilfe ich habe das Programm schnell 
gefasst, und auch in der init.h das {} vergessen, ich wollte nur ein 
Teil des Programms senden und nicht die ganze code. Die code ist nicht 
vollständig und wusste nicht, dass es compiliert wurde,und die Fehler 
herauszukriegen
Danke

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaufe dir ein C-Buch und mache deine Hausaufgaben. Komm wieder, wenn du 
Probleme hast, die nicht auf deiner Faulheit beruhen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.