Forum: Mikrocontroller und Digitale Elektronik C++ Rückgabewert stimmt nicht


von Malvin (Gast)


Lesenswert?

Hallo Zusammen,

kann mir jemand sagen warum der Rückgabewert der Funktion nicht stimmt? 
Was mache ich hier falsch?
1
#include "stdafx.h"
2
#include "stdlib.h"
3
#include "stdio.h"
4
#include "locale.h"
5
6
7
void eingabeMesswerte(int &anz, double &wert);
8
double ermittleMittelwert(int anz,int mW[]);
9
10
int _tmain(int argc, _TCHAR* argv[])
11
{
12
  int anzahl=0;
13
  int value[100];
14
  double wert;
15
  double mittelWert;
16
17
18
  char c = 'j';
19
  setlocale(LC_ALL,"German");
20
  
21
22
  do
23
  {
24
    system("cls");
25
    printf("Wenn Sie Messwerte eingeben möchten 'a' \n\n");
26
    printf("Wenn Sie Mittelwert erfahren möchten 'b' \n\n");
27
    printf("Wenn Sie das Programm beenden möchten 'n' \n\n");
28
    scanf("%c",&c);
29
30
    
31
  
32
    switch(c)
33
    {
34
      
35
    case('a'):
36
      {
37
        system("cls");
38
        printf("Bitte die Anzahl der Messwerte angeben: ");
39
        scanf("%i",&anzahl);
40
  
41
        eingabeMesswerte(anzahl,wert);
42
        
43
      }
44
    break;
45
46
    case('b'):
47
        
48
        mittelWert=ermittleMittelwert(anzahl,value);
49
        printf("\n\n\tMittelwert: %.2lf\n\n",mittelWert);
50
        system("pause");
51
        
52
    break;
53
54
    case('n'):
55
        return 0;
56
    break;
57
    }
58
    
59
  }
60
  
61
  while(c='j');
62
    
63
}
64
65
void eingabeMesswerte(int &anz, double &wert)
66
{
67
68
  int anzMw[100];
69
  int i;
70
  double messW = 0;
71
72
  for(i=0;i<100;i++)
73
  {
74
    anzMw[i]=i;
75
  }
76
  if(anz > 100)
77
  {
78
    printf("Sie können nur maximal 100 Messwerte aufnehmen.");
79
  }
80
81
  else
82
  {
83
    for(i=0;i<anz;i++)
84
    {
85
      printf("Geben Sie bitte den %i. Messwert ein: ",i+1);
86
      scanf("%lf",&messW);
87
      anzMw[i]=messW;
88
89
    }
90
91
    ermittleMittelwert(anz,anzMw);
92
93
  }
94
95
}
96
97
double ermittleMittelwert(int anz,int mW[])
98
{
99
  int i;
100
  
101
  double gesamt=0;
102
  double mittelWert;
103
104
  for(i=0;i<anz;i++)
105
  {
106
    gesamt = mW[i]+gesamt;
107
  }
108
109
  mittelWert=(gesamt/anz);
110
  return mittelWert;
111
  //printf("Der Mittelwert beträgt %.2lf\n\n", mittelWert);
112
113
}
Danke

Gruß
Malvin

von Peter II (Gast)


Lesenswert?

Malvin schrieb:
> kann mir jemand sagen warum der Rückgabewert der Funktion nicht stimmt?

was kommt bei welchen eingaben raus und was erwartest du?

von Sebastian V. (sebi_s)


Lesenswert?

Ich nehme mal an du meinst du die ermittleMittelwert Funktion. Die sieht 
an sich richtig aus. Irgendwie geht es aber mit deinen Variablen ein 
wenig drunter und drüber. Daher kommt wohl nicht das raus was du 
erwartest. Was z.B. soll int value[100] in deiner main Funktion sein? 
Das wird nur von ermittleMittelwert benutzt aber nirgendwo gefüllt. Dann 
gibt ermittleMittelwert natürlich nur quatsch aus. Es gibt aber auch 
noch einen zweiten Aufruf von ermittleMittelwert in deiner 
eingabeMesswerte Funktion. Dort füllst du int anzMw[100] mit double 
Werten die dann natürlich zu int konvertiert werden. Kommt daher 
eventuell was anderes als erwartet raus?

von rm-rf (Gast)


Lesenswert?

Malvin schrieb:
> kann mir jemand sagen warum der Rückgabewert der Funktion nicht stimmt?

Die Funktion "eingabeMesswerte(int &anz, double &wert)" sieht nach C++ 
aus. Jedenfalls speichert sie die eingegebenen Werte in einer lokalen 
Variable, die geht bei Beendigung der Funktion verloren.

Der Parameter "wert" wird nicht verwendet - vermutlich soll auch 
"eingabeMesswerte" dort den Mittelwert retournieren?

von Malvin (Gast)


Lesenswert?

Peter II schrieb:
> was kommt bei welchen eingaben raus und was erwartest du?

ich will "mittelWert" aus der Funktion in Main raus geben.

von Mitlesa (Gast)


Lesenswert?

Malvin schrieb:
> ich will "mittelWert" aus der Funktion in Main raus geben.

Deklariere deine Variable so:
1
static double mittelWert;

sonst geht der Inhalt beim Rücksprung verloren.

von Malvin (Gast)


Lesenswert?

Sebastian V. O. schrieb:
> Dort füllst du int anzMw[100] mit double
> Werten die dann natürlich zu int konvertiert werden.

wie so werden die Werte zu int konvertiert? Hier wird doch nur der 
Messwert an der Speicherstelle gespeichert oder nicht?

Sebastian V. O. schrieb:
> Was z.B. soll int value[100] in deiner main Funktion sein?

Die Funktion "ermittleMittelwert(variable, array)", damit ich den in 
Main aufrufen kann habe ich hier eine leere Array geladen.

Kann das der Fehler sein?

von Peter II (Gast)


Lesenswert?

Mitlesa schrieb:
> Deklariere deine Variable so:
> static double mittelWert;
>
> sonst geht der Inhalt beim Rücksprung verloren.

nein, bitte nicht. Auch wenn das Programm damit eventuell funktioniert, 
ist diese Lösung nicht sinnvoll erweiterbar.

Der Ansatz vom Programm ist ja schon richtig, andere haben den Fehler ja 
schon gefunden, es wird einfach das falsche Array verwendet.

von Malvin (Gast)


Lesenswert?

Mitlesa schrieb:
> Deklariere deine Variable so:
> static double mittelWert;
>
> sonst geht der Inhalt beim Rücksprung verloren.

Hab die Variable als static definiert, trotzdem ist der Rückgabewert
undefiniert--> -858993460.00

von Peter II (Gast)


Lesenswert?

Malvin schrieb:
> Hab die Variable als static definiert, trotzdem ist der Rückgabewert
> undefiniert--> -858993460.00

lies dir die anderen Kommentare durch, du hast 2 Array und sie irgendwie 
vertauscht.

Gehe einfach schritt für Schritt im Debugger mal durch, und schau dir 
den Inhalt deiner Variablen an,

von casud (Gast)


Lesenswert?

while(c='j');

... ist wahrscheinlich auch nicht das was du willst.

von rm-rf (Gast)


Lesenswert?

Malvin schrieb:
> Hab die Variable als static definiert, trotzdem ist der Rückgabewert
> undefiniert--> -858993460.00

habs oben schon geschrieben, die eingegebenen messwerte sind weg sobald 
"eingabeMesswerte" zurückspringt.

von Malvin (Gast)


Lesenswert?

casud schrieb:
> while(c='j');

ist eigentlich gewollt. Der soll so lange durch laufen, bis die anfrage 
mit nein bewertet wird.

von Peter II (Gast)


Lesenswert?

Malvin schrieb:
> ist eigentlich gewollt. Der soll so lange durch laufen, bis die anfrage
> mit nein bewertet wird.

das steht dort aber nicht. Du solltest auch die Warnung vom Compiler 
beachten.

von Sebastian V. (sebi_s)


Lesenswert?

Malvin schrieb:
> Sebastian V. O. schrieb:
>> Dort füllst du int anzMw[100] mit double
>> Werten die dann natürlich zu int konvertiert werden.
>
> wie so werden die Werte zu int konvertiert? Hier wird doch nur der
> Messwert an der Speicherstelle gespeichert oder nicht?

Nochmal der relevante Code:
1
int anzMw[100];
2
double messW = 0;
3
...
4
for(i=0;i<anz;i++)
5
{
6
  printf("Geben Sie bitte den %i. Messwert ein: ",i+1);
7
  scanf("%lf",&messW);
8
  anzMw[i]=messW;
9
10
}

Du lässt den Benutzer hier eine Zahl eintippen und speicherst diese in 
messW. messW ist ein double also kann man auch Zahlen mit 
Nachkommastellen eingeben. Wenn du diese aber mit anzMw[i]=messW in 
einem Array aus ints speicherst werden die Nachkommastellen einfach 
verworfen. Wenn du die double Werte behalten willst musst du schon ein 
double anzMw[100] Array erstellen. Gleiches für die ermittleMittelwert 
Funktion die auch ein Array von ints erwartet.

von Malvin (Gast)


Lesenswert?

rm-rf schrieb:
> habs oben schon geschrieben, die eingegebenen messwerte sind weg sobald
> "eingabeMesswerte" zurückspringt.

Ja ist richtig, ich glaube es liegt daran dass ich hier 2 verschiedene 
Arrays verwende.

Ich probier es nochmal aus und gebe euch morgen bescheid.

DAnke euch allen.

Gruß
Malvin

von Sebastian V. (sebi_s)


Lesenswert?

Ich vermute du wolltest eher sowas programmieren:
1
void eingabeMesswerte(int anz, double *wert)
2
{
3
  double messW;
4
  for(int i=0; i<anz; i++)
5
  {
6
    printf("Geben Sie bitte den %i. Messwert ein: ", i+1);
7
    scanf("%lf", &messW);
8
    wert[i] = messW;
9
  }
10
}

Diese Funktion ließt so viele Messwerte ein wie anz angibt und speichert 
die Werte in dem zweiten Parameter wert. Achte hier auf die Art wie die 
Parameter übergeben werden. Der erste Parameter ist ein einfacher int, 
keine Referenz auf ein int wie in deinem Beispiel. Eine Referenz auf ein 
int macht nur dann Sinn wenn die Funktion den originalen Wert verändern 
soll. Der zweite Parameter ist ein Pointer und zeigt auf das erste 
Element von einem Array. Darüber kannst du dann das Array was irgendwo 
in der main Funktion steht mit Daten füllen.

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.