Forum: Mikrocontroller und Digitale Elektronik Anfänger Probleme


von floh (Gast)


Lesenswert?

Hallo wie oben geschrieben fange ich grad an zu Programmieren.
folgender code geht leider nicht richtig müsste nicht bei der Variable 
erg das ergebnis von 25 rauskommen? Die Variable bleibt nämlich 0. Für 
euch sicherlich einfach zu lösen.
1
#include <avr\io.h>
2
int zahl1 = 12,zahl2 = 13,ergebnis = 0,erg = 0 ;
3
4
5
int rechne()
6
{
7
  ergebnis = zahl1 + zahl2;     
8
  return (erg);
9
}
10
 
11
12
13
int main()
14
 {
15
  while(1)
16
  {
17
  rechne();
18
  erg;
19
  }
20
 return 0;
21
}

von hdd (Gast)


Lesenswert?

In der Funktion rechne() gibtst du mit return erg immer 0 zurück, weil 
du erg dort keinen neuen Wert zuweist.
In der Main verwendest du den von rechne() zurück gegebenen Wert auch 
gar nicht.
Und was du mit erg; bezwecken willst verstehe ich nicht.

Du kannst entweder in rechne() direkt der Variablen erg etwas zuweisen, 
also erg = zahl1 + zahl2;
Oder so wie du es vermutlich willst, in der Main den Rückgabewert von 
rechne() nach erg schreiben, also erg = rechne();
Wenn du ergebnis ganz weglassen willst, kannst du in rechne() auch nur 
return (zahl1 + zahl2); schreiben.

von floh (Gast)


Lesenswert?

Danke für die Antwort

Das mit dem "erg = rechne();" hört sich ja ganz gut an aber wie muss 
dann
die Funktion aussehen ich verstehe da mit dem Rückgabewert irgendwie 
nicht.

von hdd (Gast)


Lesenswert?

Nach dem return steht immer die Variable, die deine Funktion an den 
Aufrufer zurück gibt.
Dieser Rückgabewert muss von dem Typ sein, der auch in der Deklaration 
am Anfang steht, das ist das int bei "int rechne()".

Mit "erg = rechne();" wird automatisch die Funktion rechne() aufgerufen, 
diese gibt dann mit return... etwas zurück und das wird direkt in die 
Variable erg geschrieben.

In deiner Funktion schreibst du neben das return einfach die Variable 
oder den Rechenausdruck, den du in der aufrufenden Funktion (das ist 
hier die Main) weiter verarbeiten willst.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

So:
1
#include <avr\io.h>
2
int zahl1 = 12, zahl2 = 13;
3
4
int rechne()
5
{
6
  int ergebnis_nur_in_dieser_funktion;
7
  ergebnis_nur_in_dieser_funktion = zahl1 + zahl2;     
8
  return ergebnis_nur_in_dieser_funktion;
9
}
10
11
int main() {
12
int ergebnis;
13
  while(1) {
14
    ergebnis = rechne();
15
  }
16
  return 0;
17
}

Oder so:
1
#include <avr\io.h>
2
int zahl1 = 12, zahl2 = 13, ergebnis = 0 ;
3
4
void rechne()
5
{
6
  ergebnis = zahl1 + zahl2;     
7
}
8
9
int main() {
10
  while(1) {
11
    rechne();
12
  }
13
  return 0;
14
}

Oder so:
1
#include <avr\io.h>
2
3
int rechne(int z1, int z2)
4
{
5
int erg;
6
  erg = z1 + z2;     
7
  return erg;
8
}
9
10
int main() {
11
int zahl1 = 12, zahl2 = 13, ergebnis;
12
  while(1) {
13
    ergebnis = rechne(zahle1,zahl2);
14
  }
15
  return 0;
16
}

Oder eine der vielen anderen denkbaren Kombinationen...

von floh (Gast)


Lesenswert?

Klappt wunderbar aber ganz so klappt es noch nicht.

Wenn ich das ganze debugge springt er nicht in die while Schleife hinein
und die Variable erg bleibt null. kommentier ich aller diengs die while 
schleife mit den zugehörigen geschweiften klammern aus erscheint das 
ergebnis in der Vriablen erg aber das programm bricht ja am Ende ab da 
ja keine while Schleife mehr vorhanden ist. Ich verzweifle hie so 
langsam.
 hier noch einmal der fehlerbehaftete Code wo er nicht in die while 
Schleife springt.
1
#include <avr\io.h>
2
3
4
5
6
int zahl1 = 12,zahl2 = 13,ergebnis = 0,erg = 0 ;
7
8
9
10
int rechne()
11
  {
12
  return(zahl1 + zahl2);
13
  }
14
 
15
16
int main()
17
{
18
  while(1)
19
  {
20
  erg = rechne();
21
  }
22
 return 0;
23
}

von Thomas E. (thomase)


Lesenswert?

Dein Programm ist vollkommen richtig. Nicht sonderlich elegant, eher 
grausam, aber wie schon gesagt: Es ist richtig und funktioniert.

Es hat nur einen Nachteil: Es ist vollkommen sinnlos.

Der Code weist in einer Schleife einer Variablen "erg" irgendeinen Wert 
zu. Weiter nichts. Das wiederholt sich dann solange, bis man den Strom 
abstellt.

Was würde sich also ändern, wenn der Controller in dieser Schleife 
NICHTS machen würde? Es würde sich gar nichts ändern.

Und genau das weiß der Compiler auch.
Deshalb optimiert er den Code soweit, daß er optimal schnell und mit 
wenig Speicher genau das macht was er soll: Nämlich NICHTS.

Stell' mal in Project >> Configuration Options die Optimization von Os 
auf O0.

Dann optimiert der Compiler nichts weg und du kannst das so debuggen.

mfg.

von floh (Gast)


Lesenswert?

Vielen Dank jetzt klappt es es lag wirklich an der Optimierung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

floh schrieb:
> Vielen Dank jetzt klappt es es lag wirklich an der Optimierung.
Wobei es hier anzumerken gilt, dass die Optimierung solche versteckten 
(und üblicherweise eigentlich ungewollten) Programmkonstrukte nur 
aufdeckt. Es ist nicht so, dass die Optimierung Programme fehlerhaft 
macht. Wenn sich Programme mit Optimierung "fehlerhaft" verhalten, dann 
ist idR. eine falsche Codierung die Ursache!

Ein Programm muß mit und ohne Optimierung laufen. Mit Optimierung kann 
es kleiner und/oder schneller sein. Es darf aber niemals anders sein!

von Thomas E. (thomase)


Lesenswert?

Lothar Miller schrieb:
> Ein Programm muß mit und ohne Optimierung laufen. Mit Optimierung kann
>
> es kleiner und/oder schneller sein. Es darf aber niemals anders sein!

Das ist natürlich richtig.

Das ist alles kein Fehler sondern liegt am Code, der zwar fehlerfrei 
compiliert aber vollkommen unsinnig ist.

So wird rechne() auch mit Optimierung ausgeführt:

>int zahl1 = 12,zahl2 = 13,ergebnis = 0;
>
>volatile int erg = 0 ;
>
>int rechne()
>  {
>    return(zahl1 + zahl2);
>  }
>
>int main()
>{
>  while(1)
>  {
>    erg = rechne();
>  }
> return 0;
>}


Räumt man mal ein wenig auf:

>volatile int erg = 0;

>int rechne(int zahl1, int zahl2)
>{
>   return(zahl1 + zahl2);
>}

>int main()
>{
>  while(1)
>  {
>    erg = rechne(12, 13);
>  }
>}

wird einfach nur 25 in "erg" geschrieben.

Man muß schon ein wenig wissen, wie der Compiler tickt. Deshalb sind 
solche Testprogrämmchen im Grunde für'n A...


mfg.

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.