mikrocontroller.net

Forum: Compiler & IDEs Fehler bei mehrfachem Funktionsaufruf


Autor: Jens R. (jeronnimo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich verzweifel grad an einem einfachen Codeschnipsel (Anhang)!

Problem: Wenn ich die Funktion "F_Verzoegerung(x,y)" nur ein mal aufrufe 
funktioniert das Programm wie erwartet, d.h. es wird die korrekte 
Verzögerungszeit ermittelt.

Rufe ich die Funktion F_Verzoegerung(x,y) jedoch ein zweites mal auf, 
(Freigabe_2=F_Verzoegerung(Sekundentakt,10);) kommt es zur ungewollten 
Verkürzung der Verzögerungszeit des 1. Aufrufes und dies obwohl alle 
Variablen als static deklariert sind.

Kann mich jemand auf den Weg der Erleuchtung führen, Besten Dank!

Grüße je

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast da eine lokale Variable

First_Run

die Du abfragst, ohne zuvor einen Wert zuzuweisen?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde sagen es liegt daran das du der Variable Sekundentakt vor dem 
Eintritt in die while Schleife keinen Wert zuweist, in der wihile 
Schleife machst du das jedoch. Das musst du ändern denke ich

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja fast wie ein Kapierschutz (kein Schreibfehler!!) wenn eine 
Variable "First_Run" heißt, in Wahrheit aber das Gegenteil meint. Also 
eher sowas wie "Second_Run_And_Each_Run_After" ;-)

Zudem wird "Freigabe" nie zurückgesetzt. Genausowenig wie das ominöse 
"First_Run". Solltest du nach Ablauf deiner Zeit 
"Einschalt_Verzoegerung" nicht diese beiden Werte auch neu 
initialisieren?

Autor: Jens R. (jeronnimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hinweise, dies ist es aber alles nicht, das Programm 
verhält sich so als ob die Funktion beim 2. Aufruf auf die gleichen 
lokalen Variablen wie beim 1. Aufruf zugreift (sollten baer beide mit 
einem getrennten Set an lokalen Variablen arbeiten) - kann so was an 
Compilereinstellungen liegen???

Gruß je

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens R. wrote:
> das Programm
> verhält sich so als ob die Funktion beim 2. Aufruf auf die gleichen
> lokalen Variablen wie beim 1. Aufruf zugreift

Natürlich tut sie das, du hast die Variablen ja schließlich als static 
deklariert. Vielleicht solltest du noch mal nachlesen, was static für 
lokale Variablen bedeutet.

Autor: Jens R. (jeronnimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Stefan,

static
Die Variable ist im Block gültig bzw. im Quell-Modul (also in der 
C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines 
Blockes angelegt wurde. Statische Variablen werden nicht in Registern 
oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, 
in dem auch die globalen Variablen liegen; Konstanten evtl. auch im 
Flash. Eine lokale Variable, die als static angelegt wird, "überlebt" 
also das Verlassen des Blocks und hat beim neuerlichen Betreten des 
Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte 
lokale statische Variablen beziehen sich auf unterschiedliche 
Speicherstellen, genau wie bei lokalen Variablen auch.

bin schon seit 2 Tagen am "Suchen" - als was müssen die Variable dann 
deklariert werden, ihr Inhalt soll für erhalten bleiben bis zum nächsten 
Schleifendurchlauf, der 2. Aufruf der Funktion in der gleichen Schleife 
soll aber mit anderen Werten arbeiten?

eine Idee?

lg je

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fasse die Variablen zu einer Struktur zusammen, erzeuge dann ein Array 
mit der nötigen Anzahl dieser "Variablen-Sets" und gebe der Funktion per 
Parameter (Zeiger oder Index) die Info, mit welchem "Set" sie arbeiten 
soll.

Autor: Jens R. (jeronnimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Stefan, Suche damit beendet, hatte static wohl dann doch falsch 
interpretiert...

Gruß je

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.