Funktion fragt Eingabe nicht ab


  • Mod

    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!


  • Mod

    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! ;)
    }
    


  • der Compiler gibt die Fehler (wobei das sicher nur Warnungen sind) aus, weil du die Funktion als int Func() definiert hast und die sollte dann auch einen int zurückgeben. Da du aber nichts zurückgeben möchtest, kannst du einfach void drauß machen.

    greetz KN4CK3R



  • Danke an euch beide, hat super geklappt 🙂

    Mensch, bei euch versteh ich es sofort mit dem return, in der Schule nicht >.>

    Könntet ihr mir nen Beispiel gebenw ann ich return nehmen müsste? Sorry, ihr sollt mir keinen C++ Grundkurs geben, aber wir sind grad so toll dabei und im Moment bin ich auch extrem motiviert^^ Wär deshalb echt nett wenn ich da noch nen Beispiel bekommen würde 🙂

    Dankeschön nochmal 🙂



  • int meinCin()
    {
        int temp;
        cin >> temp;
        return temp;
    }
    
    void Eingabe()
    {
        for(int i = 0; i < 20; i++)
        {
            Zähler[i] = meinCin();
        }
    }
    

    greetz KN4CK3R



  • KN4CK3R schrieb:

    int meinCin()
    {
        int temp;
        cin >> temp;
        return temp;
    }
    
    void Eingabe()
    {
        for(int i = 0; i < 20; i++)
        {
            Zähler[i] = meinCin();
        }
    }
    

    greetz KN4CK3R

    Wichtig für's Verständnis ist vielleicht auch die Anwendung einer solchen Funktion:

    int myVar=meinCin();  //die Rückgabe der Funktion wird der Variablen myVar zugewiesen.
    


  • Dankeschön! 🙂

    Reicht dann erstmal soweit^^


Anmelden zum Antworten