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


von bjk (Gast)


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
1
#include <stdio.h>
2
3
double Div(double reg1, double reg2)
4
{
5
  double produkt;
6
  /* calculate ymlQuotient_ldu32 and handle division by zero */
7
  if (reg2 != 0)
8
    {
9
     produkt=reg1/(double)reg2;
10
    }
11
  return produkt;  
12
}
13
14
main()
15
   {
16
    double produkt;
17
  
18
    double reg11=1.0;
19
    double reg22=2.0;
20
21
22
    // Invertieren das ganze
23
    produkt = Div(reg11,reg22);
24
    printf("\n");
25
    scanf("%ld");
26
27
   }
kann mir einer sagen wo ich den Fehler mache?

gruss
bjk

: Bearbeitet durch User
von Joe (Gast)


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.

von bjk (Gast)


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");

   }

von Jörg Wunsch (Gast)


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.

von bjk (Gast)


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

von Fritz Ganter (Gast)


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.

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.