if Problem in einer Funktion

Gast #1062013
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;
Persönliche Seite #1062027
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.
Persönliche Seite #1062040
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.
Gast #1064297
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
Moderator Persönliche Seite #1065311
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.
1
$ avr-gcc -S -mmcu=atmega8 main.c 
2
In file included from main.c:7:
3
init.h:1: error: expected identifier or '(' before ':' token
4
In file included from main.c:7:
5
init.h:5:38: warning: no newline at end of file
6
main.c:15:2: warning: no newline at end of file
7
$ avr-gcc -S -mmcu=atmega8 test.c 
8
In file included from test.c:7:
9
init.h:1: error: expected identifier or '(' before ':' token
10
In file included from test.c:7:
11
init.h:5:38: warning: no newline at end of file
12
test.c:13: error: redefinition of 'Test_function'
13
init.h:1: error: previous definition of 'Test_function' was here
14
test.c: In function 'Test_function':
15
test.c:19: error: 'bla' undeclared (first use in this function)
16
test.c:19: error: (Each undeclared identifier is reported only once
17
test.c:19: error: for each function it appears in.)
18
test.c:20: error: expected ';' before 'bla'
19
test.c: In function 'Error':
20
test.c:26: error: 'bla' undeclared (first use in this function)
21
test.c:27:2: warning: no newline at end of file

So wird dir keiner vernünftig helfen können.
Gast #1065327
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.
Gast #1065366
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

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