mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was stimmt an diesem Code nicht


Autor: bjk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute,

im folgenden Code soll für Produkt in main 0.5 rauskommen in der
unterfunktion Div kommt für produkt 0.5 aber im main ist dann produkt
eine Zahl viel viel kleiner als null 1,8E-307
#include <stdio.h>

double Div(double reg1, double reg2)
{
  double produkt;
  /* calculate ymlQuotient_ldu32 and handle division by zero */
  if (reg2 != 0)
    {
     produkt=reg1/(double)reg2;
    }
  return produkt;  
}

main()
   {
    double produkt;
  
    double reg11=1.0;
    double reg22=2.0;


    // Invertieren das ganze
    produkt = Div(reg11,reg22);
    printf("\n");
    scanf("%ld");

   }
kann mir einer sagen wo ich den Fehler mache?

gruss
bjk

: Bearbeitet durch Moderator
Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm,
also ich hätt ein paar anmerkungen.
1)wozu machst du in deiner DIV Funktion einen Typecased aus double?
2)wo gibst du das Ergebniss aus? weil printf("\n") macht dirja nur
einen Zeilenvorschub.

Möglicher Fehler wäre vielleicht, dasdubeider Ausgabe vom Ergebniss mit
printf den falschen Formatstring angegeben hast. Leider stehst davon
nix in deinem Quellcode ;-(

Sonst fällt mir im Moment auch nix auf, das falsch sein könnt.

Autor: bjk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
stimmt das war ein Fehler von mir in Div ein cast zu machen und zum 2
ten ich habe keine Ausgabe ich sehe mir den Wert von Produkt beim
debuging an, beim debugging ist in der unterfunktion Div alles in
Ordnung nur im main kommt für Produkt ein anderer Wert raus und das
kann ich mir nicht erklären

#include <stdio.h>
//#include <Makrofile.h>
double Div(double reg1, double reg2)
{
  double produkt;
  /* calculate ymlQuotient_ldu32 and handle division by zero */
  return produkt = reg1/reg2;


}

main()
   {
    double produkt;

    double reg11=1.0;
    double reg22=2.0;

    // Invertieren das ganze
    produkt = Div(reg11,reg22); // Nach dem ausführen kommt ein ganz
    printf("\n");               // anderer Wert für produkt, wieso??

    scanf("%ld");

   }

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, mir fällt noch mehr auf...

Div() ist gefährlich, da es schnell mit der Standardfunktion div()
verwechselt werden kann (die zwar auch dividiert, aber auf komplett
andere Weise).

Mir fällt dabei sofort Steinbach's Guideline for Systems Programmers
ein: ``Never test for an error condition you don't know how to
handle.''  Div() macht zwar peinliche Vorkehrungen, um nicht durch 0
zu dividieren, gibt aber im Falle einer versuchten Division durch 0
random garbage zurück.

`produkt' heißt im gängigen Sprachgebrauch eher `quotient'. ;-)

Das scanf() bekommt keinen Zeiger übergeben, wird also seine
gescannten Werte irgendwo in den Speicher schreiben...

Falls der Code nur durch den Debugger gegangen ist, mithin der Wert
der Variable main()::produkt keine Verwendung mehr hatte (der Code
also wirklich exakt so aussah, wie abgebildet), wird der Compiler die
Zuweisung wohl wegoptimiert haben.

Schließlich und letztlich fällt die main()-Funktion ,,unten durch'',
ohne einen Wert zurückzugeben.  Das ist eine Warnung.

Autor: bjk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Falls der Code nur durch den Debugger gegangen ist, mithin der Wert
der Variable main()::produkt keine Verwendung mehr hatte (der Code
also wirklich exakt so aussah, wie abgebildet), wird der Compiler die
Zuweisung wohl wegoptimiert haben.

genau das ist eingetreten Danke, die sachen mit quotient und produkt
habe ich extra so gemacht und die unterfunktion hiess ursprünglich auch
anders ich weiss schon das Div() nicht gerade optimal gewählt worden
ist von mir :-)...das programm sollte auch nichts ausgeben das ist nur
ein Teil von eine sehr langen code hier war das nur zur testzwecken so
hingeschrieben :-)

gruss

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man möge mich korrigieren wenn ich mich irre:

du gibst ein double zurück, schau mal im Listing, ob er die wirklich
kopiert, weil nachdem du die funktion verlässt, wird die variable
produkt, die du in Div verwendest zerstört, da sie ja am Stack liegt.

Ich denke, der Compiler sollte den return wert wegkopieren, aber
überprüf es noch mal.

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.