Forum: PC-Programmierung Parameterübergabe in Zusammenhang mit Unterprogrammen


von JR123 (Gast)


Lesenswert?

Hallo zusammen,

ich bin ein Neuling in der C-Programmierung und lerne die Sprache 
momentan in der Schule anhand des myAVR Boards mit dem Atmega 8.

Ich soll folgende Aufgabe mit Prameterübergabe in Zusammenhang mit einem 
Unterprogramm realisieren.

kein Taster: gelbe LED an
Taster1: grüne und gelbe LED an
Taster2: rote und gelbe LED an
Taster1+2: rote und grüne LED an; gelbe LED aus

Ich habe mir schon mehrere Beiträge durchgelesen und Videos angeschaut, 
aber verstehe es so noch nicht so richtig.
Die Beispiele waren meistens anhand einer Addition erklärt, was ich aber 
nicht auf meine Aufgabe umsetzen kann.

Mein erster Schritt ist folgender:

Ich lege mein Unterprogramm an:

char LEDschalten (char z)

Was ich nun nicht verstehe ist, wie ich die Funktion der Taster und die 
Ausgabe an die LEDs zuweisen soll und was genau muss ich in meinem main 
aufrufen?
Wäre euch sehr verbunden wenn mir jemand erklären könnte wie das zu 
realisieren ist (gerne auch an meinem genannten Beispiel)
Danke im Voraus

Mit freundlichen Grüßen
Johannes

von imonbln (Gast)


Lesenswert?

JR123 schrieb:
> Ich lege mein Unterprogramm an:
>
> char LEDschalten (char z)

Ich würde das so machen.

Ein Hauptprogramm schreiben das die beiden Taster in einer Schleife 
einließt, erst den Taster 1 dann denn Taster 2. Wenn du diese 
Informationen hast kannst du die vier Bedinugen prüfen, welche du 
genannt hast und dann ein oder mehrmals dein Unterprogramm, dass die LED 
einschaltet oder Ausschaltet mit den geeigneten Parameter ein oder 
mehrfach aufruft.

Deine Aufgabe ist es sich zu überlegen was das Unterprogramm mit den 
Parametern macht, je nachdem könnten das Verschiedene Dinge sein. Du 
konntest zum Beispiel eine Zahl von 0-3 übergeben und je nach Zahl den 
dazu passenden zustand einnehmen oder dein Unterprogramm hat zwei 
Parameter, der erste ist der Pin an dem die LED hängt und der zweite 
sagt ob die an oder aus geschaltet werden muss. Da ist deiner Phantasie 
keine Grenze gesetzt (außer der Lehrer hat was vorgeben). vielleicht 
schriebst du auch ein zweites Unterprogramm welches die Taster als 
Parameter übergeben bekommt und da raus einen Zustand generiert (Zahl 
0-3).

von JR123 (Gast)


Lesenswert?

Laut Lehrer soll alles in einem Unterprogramm gelöst werden.
Trotzdem danke für die Antwort.

von Theor (Gast)


Lesenswert?

JR123 schrieb:
> Hallo zusammen,
>
> ich bin ein Neuling in der C-Programmierung und lerne die Sprache
> momentan in der Schule anhand des myAVR Boards mit dem Atmega 8.
>
> Ich soll folgende Aufgabe mit Prameterübergabe in Zusammenhang mit einem
> Unterprogramm realisieren.
>
> kein Taster: gelbe LED an
> Taster1: grüne und gelbe LED an
> Taster2: rote und gelbe LED an
> Taster1+2: rote und grüne LED an; gelbe LED aus
>
> [...]

Zunächst kannst Du Dir überlegen, was geschehen soll.
Mach Dir eine Liste von Punkten, die das Programm tun soll - zunächst 
mal ohne bestimmte Reihenfolge.

Z.B.
1. LED ein- bzw. ausschalten.

2. Den Zusammenhang zwischen Tastenkombinationen und LED-Kombinationen 
beschreiben. - Super. Da hast Du oben schon einen Text. Aber noch keinen 
Code. Kommen wir noch dazu.

3. Tastenkombination einlesen. Hm. Da hast Du wohl noch keine Idee. Hast 
Du aber vermutlich schon mal gemacht. Vielleicht guckst Du mal Deine 
Notizen und früheren Programme an.

4. Noch was? Naja. Irgendwie musst Du dafür sorgen, dass diese drei 
Sachen immer wieder geschehen.

OK. Jetzt weißt Du grob, was passieren soll. Die Reihenfolge kann so 
noch nicht richtig sein. Das ist klar.
Das ist so, weil Du die LEDs nicht schalten kannst ohne vorher die 
Tasten eingelesen zu haben und daraus die LED-Kombination zu ermitteln. 
Richtig?


Gucken wir mal ob wir die Reihenfolge irgendwie hinkriegen.

a) (3.) Tastenkombination einlesen. - Klar, sonst können wir gar nichts 
sinnvolles machen.
b) (2.) Den Zusammenhang zwischen Tastenkombinationen und 
LED-Kombinationen beschreiben.
c) (1.) LED ein- bzw. ausschalten.
d) (4.) Bei 1. neu beginnen.

Sieht schon mal sinnvoll aus, oder?


Na dann.

Jetzt muss man wissen, wie den die Tastenkombinationen im Prozessor 
dargestellt, man sagt "repräsentiert", sind. Allgemein weißt Du das 
sicher schon. Das sind irgendwelche Zahlen wie 0x31 oder 0b00110001 oder 
49 oder so. Kennst Du die unterschiedlichen Zahlendarstellungen und wie 
man sie ineinander umrechnet?

Mal gucken ... Wenn Du den Port liest, an dem die Taster angeschlossen 
sind; welche Zahlenkombination bekommst Du dann?

Das kannst im Moment nur Du wissen oder Dein Lehrer. Denn welche Zahlen 
da kommen, hängt davon ab, wie und wo Deine Taster angeschlossen sind.

Wenn ein Taster an Bit 0 eines Ports angeschlossen ist, dann verändert 
sich eben dieses Bit 0 und kein anderes.
Wenn ein zusätzlicher Taster an Bit 1 des selben Ports angeschlossen 
ist, können sich beide Bits verändern, je nachdem welche Taster gedrückt 
sind.

Welche Kombinationen sind das?


Jedenfalls steht im Programm dann irgendwas wie:
1
   ... = PORTD;
oder
1
   ... = PORTC;
oder ähnlich je nachdem wo Deine Taster angeschlossen sind. Richtig?
Es könnte auch:
1
   ... = PORTD;
2
   ... = PORTC;
Wenn die Taster an unterschiedlichen Ports angeschlossen sind. OK?

Nun, versuche erstmal herauszubekommen, wie und wo die Taster 
angeschlossen sind. Falls Du das auch selbst festlegen sollst, dann tue 
das und beschreibe es hier.

Vielleicht gibt Dir ja die obige Beschreibung schon mal einen Anschub 
und eine Idee, wie es weitergeht. Dann schreib auch das.

Dann lese ich hier wieder und je nachdem, schreibe ich weiter. Oder 
jemand anders.

von Theor (Gast)


Lesenswert?

Hmm. Wenn ich mir so angucke, was Du geschrieben hast:

"Die Beispiele waren meistens anhand einer Addition erklärt, was ich 
aber
nicht auf meine Aufgabe umsetzen kann.Die Beispiele waren meistens 
anhand einer Addition erklärt, was ich aber
nicht auf meine Aufgabe umsetzen kann."

und was ich geantwortet habe, dann besteht die Möglichkeit, dass ich Dir 
nichts Neues gesagt habe.


Um mal direkt zu antworten, Folgendes:

Wenn Du im Programm "a = b + c" schreibst, dann gibt es eine Festlegung 
was das Plus-Zeichen bewirkt.

Du stehst nun vor dem Problem, dass in Deinem Fall, kein fertiger 
Operator existiert, der die möglichen Tastenkombinationen in 
Kombinationen von leuchtend und dunklen LEDs umsetzt. Richtig?

OK. Du hast schon gelernt, wenn ich Dich richtig verstehe, dass Du die 
Addition auch als Funktion hinschreiben kannst. Etwa:
1
int Addiere (int a, int b) {
2
   int tmp;
3
   tmp = a + b;
4
   return tmp;

So. Du kannst jede Verknüpfung zweier Werte, die Du als Ausdruck 
hinschreiben kannst ("tmp = a + b" nennt man einen Ausdruck) auch als 
Funktion schreiben, die diesen Ausdruck enthält. Klar?

Nun ist die Frage, was in Deinem Fall dieser Ausdruck ist?

Das ist aber nicht die einzige Lösung des Problems.

Du kannst in C auch Deine obige Beschreibung des Zusammenhanges 
hinschreiben, ohne eine "Formel" anzugeben. Etwa so:
1
   if (<kein Taster gedrückt>) <gelb an> <rot aus> <grün aus>
2
   else if (<Taster 1 gedrückt>) <gelb an> <rot aus> <grün an>
3
   else if (<Taster 2 gedrückt>) <gelb an> <rot an> <grün aus>
4
   else <gelb aus> <rot an> <grün an>

Klar, was ich meine?

Es gibt noch eine andere Möglichkeit. Nämlich dass Du "einfachere" 
Operatoren als '+' und '-' und '*' etc. verwendest. Nämlich UND '&' , 
und Oder '|' und Nicht '~'. Kennst Du die? Weißt Du was sie machen?


Aber das im Detail am Beispiel zu beschreiben halte ich für sinnvoller, 
wenn Du schreibst, wo und wie die Taster und die LEDs angeschlossen 
sind.

von JR123 (Gast)


Lesenswert?

Super, ich danke dir für die ausführliche Beschreibung und Erklärung.
Die Anschlüsse der Taster und LEDs kann ich frei wählen, ich habe mich 
für folgendes entschieden:

PB.0 Taster 1
PB.1 gelbe LED
PB.2 grüne LED
PB.3 Taster 2
PB.4 rote LED

"3. Tastenkombination einlesen. Hm. Da hast Du wohl noch keine Idee. 
Hast
Du aber vermutlich schon mal gemacht. Vielleicht guckst Du mal Deine
Notizen und früheren Programme an."

Leider habe ich keine früheren Programme oder Notizen.
Die Idee des Lehrers ist, die Einführung in C in sieben verschiedenen 
Gruppen zu realisieren die alle ein anderes Thema bearbeiten und dieses 
dann der Klasse beibringen (Ich habe nun Unterprogramme und 
Interruptsteuerung, habe soweit alles fertig bis auf das Thema mit der 
Parameterübergabe).
Ich habe ein Skript in dem ein Beispiel über die Parameterübergabe kurz 
aufgegriffen wird, was mir aber auch nicht wirklich hilft.

Habe jetzt mal folgendes Unterprogramm geschrieben
(wenn man das überhaupt so schreiben kann)

gr=grün
ge=gelb
r=rot

Nun fehlt mir die Idee wie ich deklariere wann z=gr/ge/r ist?
Durch return möchte ich wieder zurück zur Aufrufstelle, bzw. wie du 
erwähnt hast "wieder bei 1 beginnen"
1
char LEDschalten (char z)
2
{
3
  char LEDschalten;
4
    if (z=gr)
5
      {
6
        LEDschalten=gr; // grüne LED einschalten
7
      }
8
    else
9
      {
10
        LEDschalten=ge; // gelbe LED einschalten
11
      }
12
    return(LEDschalten);
13
    
14
      if (z=r)
15
      {
16
        LEDschalten=r; // rote LED einschalten
17
      }
18
      else
19
      {
20
        LEDschalten=ge; // gelbe LED einschalten
21
      }
22
      return(LEDschalten);
23
      
24
        if (z=ge)
25
        {
26
          LEDschalten=ge; // gelbe LED einschalten
27
        }
28
        else
29
        {
30
          LEDschalten=ge; // gelbe LED einschalten
31
        }
32
        return(LEDschalten);
33
}

von Theor (Gast)


Lesenswert?

JR123 schrieb:
> Super, ich danke dir für die ausführliche Beschreibung und Erklärung.

Gerne.

> Die Anschlüsse der Taster und LEDs kann ich frei wählen, ich habe mich
> für folgendes entschieden:
>
> PB.0 Taster 1
> PB.1 gelbe LED
> PB.2 grüne LED
> PB.3 Taster 2
> PB.4 rote LED

Hm. Wenn Du sie frei wählen kannst, dann würde ich Dir zu einer anderen 
Aufteilung raten. Ich vermute allerdings, dass die Erklärung dafür im 
Moment noch etwas zu weit führt. (Das vereinfacht das lesen der Taster 
und setzen der LEDs) Wenn Du einverstanden bist, würde ich vorschlagen:

PA.0 Taster 1
PA.1 Taster 2

PB.0 gelbe LED
PB.1 grüne LED
PB.2 rote LED

Der Unterschied ist, dass die Taster und die LEDs an unterschiedlichen 
Ports angeschlossen sind.

Ein weiteres Detail ist, wie genau Du die Taster und LEDs anschliesst. 
Sind  Dir "Pull-Up-Widerstände" ein Begriff? Weisst Du das Du 
Vorwiderstände für LEDs benötigst?

>
> "3. Tastenkombination einlesen. Hm. Da hast Du wohl noch keine Idee.
> Hast
> Du aber vermutlich schon mal gemacht. Vielleicht guckst Du mal Deine
> Notizen und früheren Programme an."
>
> Leider habe ich keine früheren Programme oder Notizen.
> Die Idee des Lehrers ist, die Einführung in C in sieben verschiedenen
> Gruppen zu realisieren die alle ein anderes Thema bearbeiten und dieses
> dann der Klasse beibringen (Ich habe nun Unterprogramme und
> Interruptsteuerung, habe soweit alles fertig bis auf das Thema mit der
> Parameterübergabe).
> Ich habe ein Skript in dem ein Beispiel über die Parameterübergabe kurz
> aufgegriffen wird, was mir aber auch nicht wirklich hilft.

Vielleicht sollten wir das zuerst aufgreifen.
Es wäre hilfreich, wenn Du erklären könntest, was genau Dir an der 
Parameterübergabe nicht klar ist.

Hast Du meinen vorherigen Beitrag schon gelesen? Besonders diese Stelle:

>> OK. Du hast schon gelernt, wenn ich Dich richtig verstehe, dass Du
>> die Addition auch als Funktion hinschreiben kannst. Etwa:
1
int Addiere (int a, int b) {
2
   int tmp;
3
   tmp = a + b;
4
   return tmp;
5
]/c]
6
7
>> So. Du kannst jede Verknüpfung zweier Werte, die Du als Ausdruck 
8
>> hinschreiben kannst ("tmp = a + b" nennt man einen Ausdruck) auch als 
9
>> Funktion schreiben, die diesen Ausdruck enthält. Klar?
10
11
> Habe jetzt mal folgendes Unterprogramm geschrieben
12
> (wenn man das überhaupt so schreiben kann)
13
> [...]
14
15
Ich fürchte das geht so nicht. Tut mir leid.
16
17
Ein Funktionsname kann nicht als Variablenname verwendet werden.
18
Du denkst vermutlich, dass die "Beschreibung" einer Funktion auch zur Folge hat, dass eine gleichnamige Variable existiert. Das ist nicht richtig.
19
20
[c]
21
char LEDschalten (char z)
22
{
23
   char LEDschalten;          /* Das ergibt einen Fehler vom Compiler weil der Name schon für eine Funktion verwendet wurde. */
24
   ...

Eine richtige Variante wäre diese:
1
char LEDschalten (char z)
2
{
3
   char tmp;
4
   if (z=gr)
5
   {
6
      tmp = gr; // grüne LED einschalten
7
   }
8
   else
9
   {
10
      tmp = ge; // gelbe LED einschalten
11
   }
12
   return (tmp);
13
   ...

von Theor (Gast)


Lesenswert?

Was Du Dir mal anschauen solltest sind die Vergleichsoperatoren "==", 
"!=", "<", ">", "<=" und ">=".

Hast Du ein C-Buch? Falls nein, kannst Du das hier verwenden: 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Über Operatoren: 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/006_c_operatoren_001.htm#mjab3693b096d581607801a36ce88905fc

Dort gibt es auch ein Kapitel über Funktionen. 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/009_c_funktionen_004.htm#mjdf9a752645c46e2afe9989858d1fe010

Ich fürchte, Du wirst erst einmal Einiges lesen müssen.

So. Ich habe jetzt zu tun, schaue aber morgen Abend wieder rein, denke 
ich.

von JR123 (Gast)


Lesenswert?

Theor schrieb:
> Vielleicht sollten wir das zuerst aufgreifen.
> Es wäre hilfreich, wenn Du erklären könntest, was genau Dir an der
> Parameterübergabe nicht klar ist.
>
> Hast Du meinen vorherigen Beitrag schon gelesen? Besonders diese Stelle:
>
>>> OK. Du hast schon gelernt, wenn ich Dich richtig verstehe, dass Du
>>> die Addition auch als Funktion hinschreiben kannst. Etwa:
> int Addiere (int a, int b) {
>    int tmp;
>    tmp = a + b;
>    return tmp;
> ]/c]

Korrekt, ich lege 2 Variablen fest und schreibe dann in der Funktion 
dass diese addiert werden sollen. So wie ich das verstanden haben werden 
die Variablen dann in der main definiert - ist das richtig?
Zum Beispiel
int a = 5
Int b = 10
als nächstes lege ich dann für die Rechnung fest:
summe = Addiere (a,b)

Mir ist jetzt nicht klar wie ich sage, dass "ge" meine gelbe LED ist.
Muss ich dazu in der main schreiben
ge = PORTB |= (1<<1) ?
Und wie ich die Taster einbinden soll ist mir irgendwie auch noch 
schleierhaft.
Wahrscheinlich ist das komplette Thema richtig einfach, stehe jedoch auf 
dem Schlauch und suche irgendwie nach dem berühmten "AHA-Effekt"

Theor schrieb:
>>> So. Du kannst jede Verknüpfung zweier Werte, die Du als Ausdruck
>>> hinschreiben kannst ("tmp = a + b" nennt man einen Ausdruck) auch als
>>> Funktion schreiben, die diesen Ausdruck enthält. Klar?

Die Funktion wäre dann hier einfach "tmp" oder wie ist das zu verstehen?

Theor schrieb:
> Ein Funktionsname kann nicht als Variablenname verwendet werden.
> Du denkst vermutlich, dass die "Beschreibung" einer Funktion auch zur
> Folge hat, dass eine gleichnamige Variable existiert. Das ist nicht
> richtig.

Danke dafür, genau das habe ich nämlich gedacht

von JR123 (Gast)


Lesenswert?

Ich danke dir für die Bücher, werde mich dort mal einlesen.

von Theor (Gast)


Lesenswert?

JR123 schrieb:
> Theor schrieb:
>> Vielleicht sollten wir das zuerst aufgreifen.
>> Es wäre hilfreich, wenn Du erklären könntest, was genau Dir an der
>> Parameterübergabe nicht klar ist.
>>
>> Hast Du meinen vorherigen Beitrag schon gelesen? Besonders diese Stelle:
>>
>>>> OK. Du hast schon gelernt, wenn ich Dich richtig verstehe, dass Du
>>>> die Addition auch als Funktion hinschreiben kannst. Etwa:
>> int Addiere (int a, int b) {
>>    int tmp;
>>    tmp = a + b;
>>    return tmp;
>> ]/c]
>
> Korrekt, ich lege 2 Variablen fest ...

Das ist zwar umgangssprachlich richtig aber zu ungenau wenn man 
programmieren will.

Du sagst vielmehr dem Compiler, dass eine Funktion namens "Addiere" zwei 
Parameter hat. Die beiden Parameter heissen "a" und "b". a hat den 
Datentypen "int" und b hat den Datentypen "int". Ein Datentyp legt fest, 
welchen Wertebereich eine Variable hat. Bei int ist das (im allgemeinen, 
nicht grundsätzlich) -32765 bis +32675 in dezimal.

Weiter sagst Du dem Compiler, dass es eine Variable (diesmal eine 
Variable, kein Parameter!) namens "tmp" gibt. Die hat auch den Typ int.

Dann sagst Du ihm, dass der Code, den er erzeugen soll (also das was der 
Prozessor ausführt) zunächst den Inhalt, den momentanen Wert, des 
Parameters a nehmen soll, dazu den Inhalt von b addieren und das 
Ergebnis der Variablen tmp zuweisen soll (egal was vorher drinstand).

Zuletzt sagst Du dem Compiler er soll Code erzeugen, der den Inhalt von 
tmp als Ergebnis dieser Funktion, den Funktionswert behandelt.


> ... und schreibe dann in der Funktion
> dass diese addiert werden sollen.

Richtig.

Was wichtig ist, ist, dass Du in C nur drei verschiedene Dinge sagen 
kannst. Nämlich:
1. Eine Variable hat diesen oder jenen Wertebereich (int, char, ...) und
2. Tue dies "+" oder jenes "=" und
3. dass Du Konstanten beschreibst. Das geht mit const. Oder Textersatz; 
dem "#define")

Funktionen in C sind in gewisser_ Weise in _einiger Hinsicht ähnlich 
wie Funktionen in der Mathematik.

Wenn Du in Mathe liest, a = b^2 + c, dann ist das in der Mathematik eine 
Aussage darüber, wie a, b und c zueineinander stehen. "a ist genau so 
groß wie die Summe aus dem Quadrat von b und c". Man kann das nach c 
umstellen (Algebar), erhält c = b^2 - a und die Aussage "c ist genauso 
groß (also gleich wie) die Differenz von dem Quadrat von b und a.

Aber das hat noch eine zweite Sichtweise in der Mathematik.

Wenn Du in Mathe liest, a = b^2 + c, dann interpretierst Du das, als die 
Anweisung, zunächst den Wert von b zu nehmen (wir sagen auch den Wert 
für "b einsetzen", dann diesen Wert zu quadrieren, dann den Wert von c 
zu nehmen und zu dem Quadrat zu addieren und das ist das Ergebnis. Am 
Ende steht in einer Arbeit "a = <irgendeine Zahl".

Genau so macht das auch der Prozessor. Er versteht das als "Anweisung" 
etwas zu tun. Nicht als eine Aussage über Beziehungen.

In einem C-Programm drückt man mit dem "="-Operator eine "Zuweisung" 
aus. "Weise zu" ist eine Anweisung.

Prinzipiell ist das mit dem + genauso. Was "geschieht" ist, dass was 
addiert wird.

(Wenn man über Sätze der Sprache C redet, gibt es da noch 
Unterscheidungen, zwischen = und + aber das führt hier zu weit, denke 
ich).


> So wie ich das verstanden haben werden
> die Variablen dann in der main definiert - ist das richtig?
> Zum Beispiel
> int a = 5
> Int b = 10

Richtig. Du hast sogar das korrekte Wort gewählt! Prima! Das ist eine 
"Definition".

> als nächstes lege ich dann für die Rechnung fest:
> summe = Addiere (a,b)

Nein. Das ist keine Festlegung (also die Beschreibung einer Beziehung) 
sondern eine Anweisung etwas zu tun.

>
> Mir ist jetzt nicht klar wie ich sage, dass "ge" meine gelbe LED ist.
> Muss ich dazu in der main schreiben
> ge = PORTB |= (1<<1) ?

Nein. So geht das nicht.
Du willst vermutlich ausdrücken: Die gelbe LED ist an Pin 0 von PortB 
angeschlossen.

Denke daran: Du kannst entweder einen Datentyp festlegen und eine 
Variable benennen, Du kannst eine Konstante festlegen und benennen oder 
Du kannst eine Anweisung geben, was zu tun ist.

Das genau auseinander zu puzzeln, ist ohne funktionierendes Beispiel 
kompliziert und würde Begriffe erfordern die Du wohl noch nicht kennst 
und die ich in langen Sätzen umschreiben müsste. Lass uns das 
aufschieben, bis Du mehr gelesen hast.


> Und wie ich die Taster einbinden soll ist mir irgendwie auch noch
> schleierhaft.
> Wahrscheinlich ist das komplette Thema richtig einfach, stehe jedoch auf
> dem Schlauch und suche irgendwie nach dem berühmten "AHA-Effekt"

Nein. Es ist leider tatsächlich nicht einfach. Aber man kann es in 
einfache Teile zergliedern und anschliessend wieder zusammenfügen. :-)

> Theor schrieb:
>>>> So. Du kannst jede Verknüpfung zweier Werte, die Du als Ausdruck
>>>> hinschreiben kannst ("tmp = a + b" nennt man einen Ausdruck) auch als
>>>> Funktion schreiben, die diesen Ausdruck enthält. Klar?
>
> Die Funktion wäre dann hier einfach "tmp" oder wie ist das zu verstehen?

Nein. tmp ist eine Variable.

Stelle Dir vor, Du schreibst:
1
main () {
2
   int x;
3
   int a = 4;
4
   int b = 7;
5
6
   x = addiere(a, b);

In dem Moment, in dem die CPU die Funktion aufruft, ist das so als wenn 
da stünde:
1
main () {
2
   int x;
3
   int a = 4;
4
   int b = 7;
5
6
   addiere (4, 7);

Zu dem Zeitpunkt, wenn die Funktion addiere beendet worden ist, so als 
wenn das stünde:

1
main () {
2
   int x;
3
   int a = 4;
4
   int b = 7;
5
6
   x = 11;

Klar?


> Theor schrieb:
>> Ein Funktionsname kann nicht als Variablenname verwendet werden.
>> Du denkst vermutlich, dass die "Beschreibung" einer Funktion auch zur
>> Folge hat, dass eine gleichnamige Variable existiert. Das ist nicht
>> richtig.
>
> Danke dafür, genau das habe ich nämlich gedacht

Bitteschön. Gerne. Nett, dass Du Dich bedankst.


So. Ich muss jetzt aber wirklich ... Bis bald und gute Nacht.

von JR123 (Gast)


Lesenswert?

Ich danke dir schon mal dafür, dass Du dir die ganze Zeit für mich 
nimmst und es möglichst ausführlich und, für einen Anfänger, 
verständlich erklärst!

Theor schrieb:
> Was wichtig ist, ist, dass Du in C nur drei verschiedene Dinge sagen
> kannst. Nämlich:
> 1. Eine Variable hat diesen oder jenen Wertebereich (int, char, ...) und
> 2. Tue dies "+" oder jenes "=" und
> 3. dass Du Konstanten beschreibst. Das geht mit const. Oder Textersatz;
> dem "#define")

Das sind 3 Punkte die ich mir super merken kann.
Ich habe jetzt mal meine Variablen (gr,ge und r) per #define den LEDs 
zugewiesen - ist das die richtige Lösung?

z.B
1
#define gr PORTB |= (1<<2) // grüne LED 
2
...
So definiere ich doch eigentlich ganz klar wofür gr steht.
Wenn dann z=gr müsste doch die grüne LED leuchten?
(Ich weise also meinem z die Definition von "gr" zu)?

Theor schrieb:
> Stelle Dir vor, Du schreibst:
> main () {
>    int x;
>    int a = 4;
>    int b = 7;
>
>    x = addiere(a, b);
>
> In dem Moment, in dem die CPU die Funktion aufruft, ist das so als wenn
> da stünde:
> main () {
>    int x;
>    int a = 4;
>    int b = 7;
>
>    addiere (4, 7);
>
> Zu dem Zeitpunkt, wenn die Funktion addiere beendet worden ist, so als
> wenn das stünde:
>
> main () {
>    int x;
>    int a = 4;
>    int b = 7;
>
>    x = 11;
>
> Klar?

Soweit verständlich und nachvollziehbar, sollte also verstanden sein.

Durch deinen restlichen Text arbeite ich mich nochmal morgen Mittag 
durch, mir wird es langsam auch schon zu spät.

Gute Nacht und bis dann!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

JR123 schrieb:
> Ich habe jetzt mal meine Variablen (gr,ge und r) per #define den LEDs
> zugewiesen - ist das die richtige Lösung?

Nein. Das ist Murks.

#defines sind reiner Textersatz und sollten nicht verwendet werden, wenn 
man nicht ganz genau versteht, was sie machen.

> #define gr PORTB |= (1<<2) // grüne LED
> ...
>
> So definiere ich doch eigentlich ganz klar wofür gr steht.
> Wenn dann z=gr müsste doch die grüne LED leuchten?

z = gr

wird durch den Präprozessor zu

z = PORTB |= (1<<2)

Das ist recht sicher nicht das, was Du erreichen willst.

von JR123 (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> z = gr
>
> wird durch den Präprozessor zu
>
> z = PORTB |= (1<<2)
>
> Das ist recht sicher nicht das, was Du erreichen willst.

okay das klingt plausibel .. Das ist wirklich nicht das was ich möchte.
Werde mich morgen weiter durch die Bücher stöbern um den korrekten Weg 
zu finden.

Danke und lg

von JR123 (Gast)


Lesenswert?

Mein Unterprogramm sieht jetzt so aus
1
void LEDschalten (int gr, int ge, int r)
2
{
3
  if ((gr=1))  
4
  {
5
    PORTB |= (1<<2); // grüne LED an
6
  }
7
  else
8
  {
9
    PORTB &= ~(1<<2); // grüne LED aus
10
  }
11
...

In der main rufe ich dann auf:
1
LEDschalten (1,0,0);
Um die grüne LED einzuschalten, allerdings leuchten immer LEDs - wo kann 
der Fehler liegen?

MfG
Johannes

von Rolf M. (rmagnus)


Lesenswert?

JR123 schrieb:
> void LEDschalten (int gr, int ge, int r)
> {
>   if ((gr=1))
>   {
>     PORTB |= (1<<2); // grüne LED an
>   }
>   else
>   {
>     PORTB &= ~(1<<2); // grüne LED aus
>   }
> ...
>
> In der main rufe ich dann auf:
> LEDschalten (1,0,0);
> Um die grüne LED einzuschalten, allerdings leuchten immer LEDs - wo kann
> der Fehler liegen?

Du weist gr 1 zu und prüft dann ab, ob es nicht 0 ist. Das gilt 
natürlich immer, also wird immer der if-Zweig ausgeführt.
Tipp: Wie macht man in C einen Vergleich?

von JR123 (Gast)


Lesenswert?

Rolf M. schrieb:
> Tipp: Wie macht man in C einen Vergleich?

Ach Gott, ich danke dir :D
Natürlich muss ich hier "==" verwenden.. mit "=" weise ich ja zu.

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.