www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfänger Probleme


Autor: floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include <avr\io.h>
int zahl1 = 12,zahl2 = 13,ergebnis = 0,erg = 0 ;


int rechne()
{
  ergebnis = zahl1 + zahl2;     
  return (erg);
}
 


int main()
 {
  while(1)
  {
  rechne();
  erg;
  }
 return 0;
}
 


Autor: hdd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hdd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht lesenswert
So:
#include <avr\io.h>
int zahl1 = 12, zahl2 = 13;

int rechne()
{
  int ergebnis_nur_in_dieser_funktion;
  ergebnis_nur_in_dieser_funktion = zahl1 + zahl2;     
  return ergebnis_nur_in_dieser_funktion;
}

int main() {
int ergebnis;
  while(1) {
    ergebnis = rechne();
  }
  return 0;
}

Oder so:
#include <avr\io.h>
int zahl1 = 12, zahl2 = 13, ergebnis = 0 ;

void rechne()
{
  ergebnis = zahl1 + zahl2;     
}

int main() {
  while(1) {
    rechne();
  }
  return 0;
}

Oder so:
#include <avr\io.h>

int rechne(int z1, int z2)
{
int erg;
  erg = z1 + z2;     
  return erg;
}

int main() {
int zahl1 = 12, zahl2 = 13, ergebnis;
  while(1) {
    ergebnis = rechne(zahle1,zahl2);
  }
  return 0;
}

Oder eine der vielen anderen denkbaren Kombinationen...

Autor: floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr\io.h>




int zahl1 = 12,zahl2 = 13,ergebnis = 0,erg = 0 ;



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

int main()
{
  while(1)
  {
  erg = rechne();
  }
 return 0;
}

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank jetzt klappt es es lag wirklich an der Optimierung.

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

Bewertung
0 lesenswert
nicht 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!

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.