Forum: Compiler & IDEs if Problem in einer Funktion


von Gast (Gast)


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;

von Peter (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Gast (Gast)


Lesenswert?

wo soll ich die variable deklariert?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Johann L. (gjlayde) Benutzerseite


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.

von Gast (Gast)


Lesenswert?

danke sehr für die Erklärung es ist mir jetzt klar

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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".

von Gast (Gast)


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

von P. S. (Gast)


Lesenswert?

Zeigen.

von Gast (Gast)


Lesenswert?

hier ist das  Programm

von gast (Gast)


Angehängte Dateien:

Lesenswert?

sorry, habe ich nicht das dokument angehängt

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Mati (Gast)


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.

von gast (Gast)


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

von P. S. (Gast)


Lesenswert?

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

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.