Funktion fragt Eingabe nicht ab
-
Hallo

Ich bin noch ganz nue hier, hab mich aber angemeldet da ich im Moment quasi im Selbststudium C++ lerne.
Ich bin jetzt bei den Arrays/Funktionen. Ich wollte das ganze miteinander verknüpfen, aber so ganz ist mir das nicht gelungen.
Nachdem ich die Funktion eingebaut habe (Mein Ziel ist es, alle Schritte im Programm außerhalb der Main Funktion zu haben, also nur noch die Funmtionausaufrufe da stehen zu haben)
Mein Compiler ist visual C++, und bitte nicht wegen dem System("pause") schimpfen, ich weiß das dass eig. keine gute Lösung ist^^
// Array Übung 7.4.2010.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> int Zähler[19],i; using namespace std; int Eingabe() { for(i=1;i<20;i++) { cin>>Zähler[i]; } return i; } int _tmain(int argc, _TCHAR* argv[]) { if(i>19) Eingabe(); { cout<<"Jetzt werden Array einzeln ausgegeben" << endl; } for(i=1;i<20;i++) { cout<<"Das Array " << i << " enthaelt den Wert:" << Zähler[i] << endl; } system("pause"); return 0;}Er fragt jetzt nicht mehr die Eingabe der Werte für das Array Zähler[19] ab, aber eigentlich soll das so sein^^
Könnt ihr mir da helfen?
LG
-
Frage: welchen Wert hat i in der ersten Zeile der main?
-
0, da globale Variable, oder?
-
314159265358979 schrieb:
0, da globale Variable, oder?
100 Punkte für dich!

Limatex, ist dir jetzt klar, was schiefläuft?
-
Danke für die Antwort

ich hab gesehen was falsch war, ich hab meine Funktion aus schusseligkeit einfach falsch gesetzt o.o
Eigentlich muss es so aussehen:
int _tmain(int argc, _TCHAR* argv[]) { Eingabe(); if(i>19) { cout<<"Jetzt werden die Arrays angezeigt" << endl; }jetze gehts auch

-
Da läuft aber nicht nur das schief... Die Arrayindizes werden fröhlich überschritten.
Und das Programm ist ein Musterbeispiel für die Gefahren globaler Variablen.
-
Also mir wurde gesagt das ich bei solch einfachen Programmen ruhig auf globale variablen zurückgreifen soll, denn es ist einfacher

Ich mache ja ne Ausbildung zum Fachinformatiker Systemintegration, ich denke sehr tiefgreifend und rpofessionell werd ich damit nicht in berührung kommen, da reichen die globalen doch oder?
Meinst du etwa die Meldung die mir beim schließen des programms ausgegeben wird? Da konnt ich auch noch keine Lösung für finden, aber schlimm war es bis jetzt nicht^^
EDIT: Die Meldung kommt garnicht mehr^^
-
Das Array Zähler[19] hat 19 Elemente, also von Zähler[0]-Zähler[18]. Wenn du also auf Zähler[19] zugreifst (deine for-Schleife läuft bis einschließlich 19), verlässt du damit den gültigen Bereich.
Zum Thema Globale: wenn du versprichst, nie Programme über 20 Zeilen zu schreiben und nach der Ausbildung auch nie wieder zu programmieren, darfst du gerne Globale verwenden.

-
Aber es funktioniert doch auch so, oder? o.o
Was genau müsste ich dann denn jetzt ändern damit es nicht zu dieser Arrayindizes kommt? Meine Übung ist ansonsten fertig, so sieht es nun aus:
// Array Übung 7.4.2010.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> int Zähler[19],i,a; using namespace std; int Eingabe() { for(i=1;i<20;i++) { cin>>Zähler[i]; } return i; } int If() { if(i>19) { cout<<"Jetzt werden die Zaehler angezeigt" << endl; } return 0; } int Ausgabe() { for(i=1;i<20;i++) { cout<<"Der Zaehler " << i << " enthaelt den Wert:" << Zähler[i] << endl; } cout<<"Welchen Zaehler moechte sie sich ausgeben lassen?"; cin>>a; cout<<"Der Zaehler["<<a<<"]" " enthaelt den Wert: " << Zähler[a] << endl; return 0; } int _tmain(int argc, _TCHAR* argv[]) { Eingabe(); If(); Ausgabe(); system("pause"); return 0;}
-
Spendiere deinem Array doch einfach ein weiteres Element, dann passt es (also 20 statt 19).
-
matze meinte nur du überschreitest den Index von Array.
int Eingabe() { for(i=1;i<20;i++) // sollte for(i = 0;i<19;i++) heissen { cin>>Zähler[i]; } return i; }Deine Input For-Schleife geht von den Werten 1-20.
Aber du hattest dem Zähler gesagt, gib mir Platz für 19 Elemente.
Da wir bei dem Element 0 anfangen, kommen wir bis maximal 18 das heisst, jeder Wert darüber geht in den ungültigen Bereich(man kann dann fieses damit anstellen
)Also am besten speicherst du dir die Anzahl der Werte ab und haust ihn in die for, so solltest du nicht mehr in den ungüligen Bereich kommen , oder benutzt nen Vector falls erlaubt

Edit: Matze war schneller xD
-
demonking schrieb:
Deine Input For-Schleife geht von den Werten 1-20.
Von 1 bis 19 läuft sie...
-
Dankesehr

EDIT: Achja, wie ist das mit den returns? Muss da irgendwas rein, oder kann ich einfach überall return 0 lassen?
LG
-
warum willst du denn bei Eingabe einen Wert zurückgeben? Bei der main Funktion kannst du return 0 lassen. Wenn du etwas anderes zurückgibst, kann Windows das als Fehler identifizieren. 0 bedeutet kein Fehler (aber nur bei der main Methode).
greetz KN4CK3R
-
Limatex schrieb:
EDIT: Achja, wie ist das mit den returns? Muss da irgendwas rein, oder kann ich einfach überall return 0 lassen?
Das return 0 der main ist ok. Das return deiner Eingabe-Funktion ist aber unsinnig, denn dieses Ergebnis benutzt du sowieso nicht. Sinnvoll wäre es erst dann, wenn du es in einer Variable speicherst und weiterverwendest.
-
Ist das return 0 in der main nicht sogar nur optional?
-
314159265358979 schrieb:
Ist das return 0 in der main nicht sogar nur optional?
Ja!
-
314159265358979 schrieb:
Ist das return 0 in der main nicht sogar nur optional?
Ja. Return (egal welcher Wert) in main ist optional. Wenn das Ende der Funktion ohne return erreicht wird, wird 0 zurückgegeben.
-
Wen ich dir Returns in den anderen Funktionen aber rausnehme, gibt mir der Compiler einen Fehler aus. (Also halt 3 Stück, pro Funktion einer)
Oder meintet ihr das ich bei Eingabe() einfach return 0 anstatt return i schreiben soll? So hab ich das dann auch gemacht^^
ich lerne übrigens im Selbststudium weil unser Berufsschullehrer eine schnarchnase ist und kaum einer (Die die es nicht können, fast alle haben vorkentnisse) versteht es bzw. hört zu o.o
-
Limatex schrieb:
Wen ich dir Returns in den anderen Funktionen aber rausnehme, gibt mir der Compiler einen Fehler aus. (Also halt 3 Stück, pro Funktion einer)
Oder meintet ihr das ich bei Eingabe() einfach return 0 anstatt return i schreiben soll? So hab ich das dann auch gemacht^^
void Eingabe() { //... //nix return! ;) }