Wert einlesen klappt nicht in c?!?

  • Hi Leute hab in der Uni ne Aufgabe bekommen ein Puffer für Messwerte zu erstellen, die man selber eingibt immer der letzte raus und dann ein Mittelwert bilden.


    Ich hab das versucht zu programmieren nur gibt es ein Problem. Das Programm liest die Werte nicht ein.



    in meinem letzten Programm hat das ohne probleme funktioniert irgendwie steh ich auf dem schlauch.


    Hab schon rausgefunden das scanf immer nur die null zurückgibt
    der code im Hauptprogramm ist:

    Code
    N = einlesenPuffer("Bitte Groesse des Ringpuffers eingeben\n");


    kann mir vll. einer sagen was ich falsch mach, wo mein "denkfehler" liegt?


    thx eimer

    mfg eimer


    VDR1: Debian 2.6.24.2 e-Tobi | AMD Mobile 3000+ (~50W Idle) | K8MM3-V | 256MB | 500GB Samsung | TT2300 DVB-C | KabelBW | lautlos | FUSI Scenic 600

  • Der Fehler liegt in den Parametern von "scanf".


    man scanf


    liefert hier die Syntax. Der erste Parameter ist das zu lesende Format, der zweite (und weitere) ein Zeiger auf die Variable die den Wert aufnimmt. Sollen also Dezimalzahlen (Float) gelesen werden, muss es


    float temp;
    scanf("%f",&temp);


    lauten. Bei Ganzzahlen (Integer) muss es:


    int temp;
    scanf("%d",&temp);


    lauten.
    Auch muss für einlesenPuffer Platz für mehr als einen Wert geschaffen sein. Will man z.B. 100 Werte einlesen, dann muss es so aussehen:


    ASRock P67 Extreme6, Intel core i7-2600, 16GB DDR-3 RAM, Ubuntu 18.04, VDR 2.4.0, Digital Devices Max M4

    RaspberryPi 3, Kodi 18.1, PVR

  • Na, da fallen mit gleich mehrere Dinge auf:
    Zeile 1 und 2: Du willst in den Zeilen 5 und 8 ein double einlesen, deklarierst aber die Funktion einlesenPuffer() und die Variable temp als int.
    Zeile 5 und 8: du willst mit scanf() ein double einlesen, übergibst aber die Variable und nicht einen Pointer auf die Variable
    Zeile 8: while (scanf("%lf", temp < 1)) ergibt keinen Sinn, du meintest wohl eher: while (scanf("%lf", temp) < 1)


    Mein heißer Tipp für den Rest deines C-Kurses (und auch C++-Kurse):
    immer mit -Wall kompilieren, noch besser: -Wall -Werror. -Wall zeigt sämtliche Warnungen an und -Werror sorgt dafür, das Warnungen als Fehler betrachtet werden und die Kompilierung abbricht. Mit anderen Worten:
    mit diesen Optionen bekommt man erst dann eine ausführbare Datei, wenn der GCC nichts mehr zu meckern hat.
    Und bitte nie nach dem Motto arbeiten: pff, Warnungen sind mir egal, hauptsache, es funktioniert. Damit kannst du zwar in einigen Fällen durchkommen, schießt dir aber später damit ins Knie.

  • Ok, ich seh ein erst denken, dann Paste und Copy.
    Mit Pointern steh ich irgendwie auf Kriegsfuss.


    Das muss doch &temp heisen in Zeile 5 und 8. Oder?


    ALso bei mir wird nichts zum leufne gebracht wenn ich nicht alle Fehler beseitigt habe, das hat mir mein C-Prof schon eingebläut :) aber denn tipp mit -wall werd ich sicher beherzigen.


    thx. schonmal wenns noch mehr Probleme gibt weiss ich wo ich hin muss!

    mfg eimer


    VDR1: Debian 2.6.24.2 e-Tobi | AMD Mobile 3000+ (~50W Idle) | K8MM3-V | 256MB | 500GB Samsung | TT2300 DVB-C | KabelBW | lautlos | FUSI Scenic 600

  • Jupp, &temp, wie in Zeile 16.


    Pointer sind u.a. immer dann nötig, wenn eine Funktion eine übergebene Variable nicht nur lesen, sondern auch verändern soll, was ja bei scanf() der Fall ist.


    Ansonsten: -Wall, nicht -wall!

  • Fällt mir gerade auf:


    Zitat

    Original von gdoerrhoefer

    Code
    int* einlesenPuffer(char meldung[])
    {
       int puffer[100];
    ...
       return puffer;
    }


    Das wird meiner Meinung nach nicht funktionieren, da puffer[] eine lokale Variable ist und der Pointer auf das Array bei der Rückkehr der Funktion keine Gültigkeit mehr hat. Manchmal wird das klappen, aber irgendwann wird es mal eine Speicherzugriffsverletzung geben.


    Gruß,
    Juri

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!