C LCD Zeitschaltuhr

In C ist alles 'call by value'.
Dann wirken sich in der sub Änderungen an der lokalen Variable value, welche nur eine Kopie der übergebenen ist, nicht auf die Quellvariable aus.

Ein "*" vor einem Variablennamen referenziert die Speicheradresse der Variable?
 
Dann wirken sich in der sub Änderungen an der lokalen Variable value, welche nur eine Kopie der übergebenen ist, nicht auf die Quellvariable aus.

Ein "*" vor einem Variablennamen referenziert die Speicheradresse der Variable?
Nein! Die Adresse einer Variablen bekommt man mit dem '&'-Operator, also z.B. &x

Mit 'int *x' (oder deutlicher '(int *)x' deklariere ich x als Pointer auf eine int-Variable (Adresse einer int-Variablen).
Mit '*x' beziehe ich mich auf den Inhalt auf den x zeigt (auf den Inhalt der Speicheradresse mit dem Wert x). Während x die Adresse selbst ist.

Beispiel:
Code:
void func(int *x)
{
  *x *=2;
}

int bla = 5;
func(&bla);
// Jetzt ist bla == 10
 
Das hat jetzt aber nichts mit meinem Problem zu tun oder ?
 
Lies Seite 2 noch mal durch.
Nicht überfliegen, lesen!
Da steht die Lösung drin. 2x sogar. Ein mal von "wer" und noch mal von mir...

great.gif
Ich mach mit...
 
Ich weiß jetzt ehrlich gesagt nicht, wo's bei Dir klemmt.

Eine Funktion liefert immer irgendwas zurück. Welcher Variablentyp, wird bei der Definition festgelegt, der konkrete Wert wird dann entweder mit Return xyz übergeben, bei anderen Sprachen kann auch eine, in der Funktion lokale Variable mit exakt dem Namen der Funktion verwendet werden (in Deinem Fall "IncrementBCD").
Alle Variablen, die in der Funktion definiert werden, existieren nur dort.
Da der Funktionsaufruf nach wer's Aussage immer called bei Value ist, wird beim Aufruf für jedes übermittelte Argument 'ne neue lokale Variable erzeugt, die den übergebenen Wert erhält - eine Kopie eben.
Manipulierst Du jetzt also was an der Kopie, der lokalen Variable, verändert das nicht die Quelle, das Original.
Beim Verlassen der Funktion "verschwindet die lokale Kopie", der Speicher kann für andere Sachen verwendet werden. Außerhalb der Funktion existiert die Kopie gar nicht.
Zugreifen kannst Du auf die Funktion (genauer: auf das Funktionsergebnis bei gegebenen Argumenten), indem Du die Funktion wie eine (readOnly)Variable (eben des definierten Typs) benutzt.
Also entweder bei einer direkten (typkompatiblen) Zuweisung wie (Pseudocode):
Zielvariable=Funktionsname(Argumente)
oder bei einem Vergleich
If Variable/Wert Vergleichsoperator Funktionsname(Argumente) ...

In beiden Fällen wird in dem Moment, wo das Programm die Zuweisung/den Vergleich erreicht erstmal die Funktion mit den entsprechenden Argumenten ausgeführt, und der Returnwert dann für die Zuweisung/den Vergleich verwendet.

Was willst Du denn nun eigentlich? Wenn die Funktion keinen Wert zurückliefern soll, sondern eine global definierte Variable verändern, brauchst Du keine Funktion, sondern eine Prozedur/Subroutine (wie immer das auch unter C heißt), die keinen Rückgabetup hat. Die zu ändernde globale Variable wird dann natürlich nicht mitübergeben (da sie ja bereits ausserhalb existiert), ggf muß sie aber so definiert werden, daß die sub da Zugriff drauf hat (volatile?).

Ob diese Vorgehensweise jetzt im Sinne einer Hochsprache wäre, kann ich nicht beurteilen - bei Objektorientierten Sprachen wiederspräche es der Grundidee der Kapselung.

Aber hier gehts ja auch um Mikrocontroller...
 
Nur zur Info bevor es wie mit den Pointern noch mehr zu Missverständnissen kommt:
Für ihn ist bei IncrementBCD eine globale Variable keine Lösung.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)