variable undeclared (first use in this function)
-
Hallo Liebe Community!
Ich bin ein Anfänger in Sachen C-Programmierung. Habe eine Aufgabe bekommen ein Programm zu schreiben, welches den Abschreibungsplan macht.
Habe alles soweit fertig bekommen, bis mir der Dozent sagt, dass man globale Variablen nicht benutzen darf, laut seinen Restriktionen.
Wenn meine Variablen nicht global definiere, dann funktioniert mein ganzes Programm nicht und die auch die Struktur.Hier der Code für das funktionierende Programm, allerdings mit globalen Variablen:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include "meine_hilfsfunktionen.h" void eingabe(void); void berechnung(double startwert, double n, double restwert); double startwert = 0; double restwert = 0; double n = 0; // Anzahl der Jahre /** Das Programm erstellt einen Abschreibungsplan bei geometrisch degressiver Abschreibung. * Der Benutzer muss den Startwert, den Restwert und die Anzahl der Jahre eingeben. * Durch die Definition dieser Parameter wird der Abschreibungsprozentsatz berechnet, * mithilfe dessen anschließend der Abschreibungsplan erzeugt werden kann. * * * @version 1.0 */ int main(void) { char programm_beenden = 'j'; do { eingabe(); system("clear"); berechnung(startwert, n, restwert); printf("%-59s", "User, möchtest du eine neue Berechnung durchführen? (j/n)"); scanf("%s", &programm_beenden); for (int k = 1; k <= 1000; k++) { if (programm_beenden == 'j') { programm_beenden = 'j'; } else if (programm_beenden == 'n') { programm_beenden = 'n'; } else { printf("%-50s" , "Bitte \"j\" für ja oder \"n\" für nein eingeben."); scanf("%s", &programm_beenden); } } } while (programm_beenden == 'j'); } /** Funktion zur Überprüfung auf Korrektheit der Benutzereingaben * */ void eingabe(void) { int check = 0; system("clear"); for (int i = 0; i <= 1001; i++) { printf("%-70s" , "Bitte Startwert angeben (eine Zahl zwischen 1.00 und 1000000000.00):"); check = scanf("%lf", &startwert); puffer_leeren(); if (check == 0) { puts("User, Falsche Eingabe!\nBitte eine Zahl eingeben.\n"); } else { if (startwert > 1000000000) { puts("User, Falsche Eingabe!\nStartwert muss kleiner als 1000000000.00 sein.\n"); } else if (startwert < 1) { puts("User, Falsche Eingabe!\nStartwert muss größer als 1.00 sein.\n"); } else { i = 1001; } } } system("clear"); for (int i = 0; i <= 1001; i++) { printf("%-64s" , "Bitte Anzahl der Jahre angeben (eine Zahl zwischen 1 und 100):"); check = scanf("%lf", &n); puffer_leeren(); if (check == 0) { puts("User, Falsche Eingabe!\nBitte eine Zahl eingeben.\n"); } else { if (n > 100) { puts("User, Falsche Eingabe!\nDie Anzahl der Jahre muss kleiner als 100 sein.\n"); } else if (n < 1) { puts("User, Falsche Eingabe!\nDie Anzahl der Jahre muss größer als 1 sein.\n"); } else { i = 1001; } } } system("clear"); for (int i = 0; i <= 1001; i++) { printf("%-49s%-13.2f%-s" , "Bitte Restwert angeben (eine Zahl zwischen 1 und", startwert, "):"); check = scanf("%lf", &restwert); puffer_leeren(); if (check == 0) { getchar(); puts("User, Falsche Eingabe!\nBitte eine Zahl eingeben.\n"); } else { if (restwert > startwert) { printf("User, Falsche Eingabe!\nDer Restwert muss kleiner als %.2lf sein.\n", startwert); } else if (restwert < 1) { puts("User, Falsche Eingabe!\nDer Restwert muss größer als 1.00 sein.\n"); } else { i = 1001; } } } } /** Berechnet den Abschreibungsprozentsatz und erstellt den Abschreibungsplan * * @param startwert Startwert * @param n Anzahl der Jahre * @param restwert Restwert */ void berechnung(double startwert, double n, double restwert) { system("clear"); double prozent = (100 * (1 - pow((restwert / startwert), (1/n)) )); // Abschreibungsprozentsatz double rest = 0; double abschreibung = 0; puts("\nAbschreibungsplan bei geometrisch degressiver Abschreibung\n"); printf("%-13s %-12.2f %-5s\n%-13s %-12.2f %-5s\n%-13s %-12.0f\n" , "Startwert:", startwert, "Euro", "Restwert:", restwert, "Euro", "Anzahl Jahre:", n); printf("\n%4s %14s %12s %12s\n\n", "Jahr", "Wert am Anfang", "Abschreibung", "Wert am Ende"); for (int i = 1; i <= n; i++) { abschreibung = (startwert * prozent) / 100; rest = startwert - abschreibung; printf("%4.0d %14.2f %12.2f %12.2f\n", i, startwert, abschreibung, rest); startwert = rest; } printf("\n\nBei einem Abschreibungsprozentsatz von %.2f%%.\n\n", prozent); }
Wenn ich jetzt die Variablen in der Main initialisieren möchte, dann schreibt er einen Fehler im Terminal, wenn er kompilieren möchte, hier ein Auszug:
scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o main_abschreibungsprozentsatz.o -c -std=c99 -pedantic -Wall -Wextra -Werror -I. main_abschreibungsprozentsatz.c main_abschreibungsprozentsatz.c: In function 'eingabe': main_abschreibungsprozentsatz.c:62:25: error: 'startwert' undeclared (first use in this function) main_abschreibungsprozentsatz.c:62:25: note: each undeclared identifier is reported only once for each function it appears in main_abschreibungsprozentsatz.c:88:26: error: 'n' undeclared (first use in this function) main_abschreibungsprozentsatz.c:114:26: error: 'restwert' undeclared (first use in this function) scons: *** [main_abschreibungsprozentsatz.o] Error 1 scons: building terminated because of errors.
Habt ihr eine Idee, wie ich das Problem mit den globalen Variablen lösen könnte? Danke im Voraus!
-
Da hast du dir was angewöhnt, das dir dein Dozent zurecht wieder austreiben möchte. Sei froh!
Gehen wir in Babyschritten vor:
1. Schreib eine Funktion, die einen int-Wert ausgibt, den man ihr übergibt. Schreib ein Testprogramm mit Beispielaufruf.
2. Schreib eine Funktion, der man einen int-Wert übergibt. Sie gibt den doppelten Wert zurück (return). Schreib ein Testprogramm mit Beispielaufruf.
3. Schreib eine Funktion, die den Wert einer int-Variablen verdoppelt (call by reference). Schreib ein Testprogramm mit Beispielaufruf.
-
So, hab die Beispielfunktionen gemacht.
Aber ich habe Probleme bei der call-by-references Funktion. Die Funktion gibt nicht die doppelte Zahl aus.
Hier mein Code:#include <stdio.h> int liefere_zahl(char* texteingabe); int liefere_doppeltezahl(char* texteingabe); void liefere_doppeltezahl_callby(int bla); int main(void) { int ausgabe = liefere_zahl("Bitte eine Zahl eingeben:"); printf("\nDie eingegbene Zahl ist: %d\n", ausgabe); int ausgabe_zwei = liefere_doppeltezahl("Bitte eine Zahl eingeben:"); printf("\nDie gelieferte Zahl ist: %d\n", ausgabe_zwei); puts("Gib Zahl ein:"); int eingabe = 0; scanf("%d", &eingabe); liefere_doppeltezahl_callby(eingabe); printf("Die doppelte Zahl ist: %d\n", eingabe); } int liefere_zahl(char* texteingabe) { int eingabe = 0; printf("%s", texteingabe); scanf("%d", &eingabe); return eingabe; } int liefere_doppeltezahl(char* texteingabe) { int eingabe = 0; printf("%s", texteingabe); scanf("%d", &eingabe); return eingabe * 2; } void liefere_doppeltezahl_callby(int bla) { bla = bla * 2; }
Was mache ich falsch? Danke im Voraus.
-
Überleg mal wann du die Aufgabe machst und wann du denn Wert verdoppelst.
Und was passiert mit diesem verdoppelten Wert.Die Funktionen entsprechen nicht der Aufgabe von SeppJ (Da steht nichts von Eingabe)
-
so, hab jetzt den Fehler entdeckt, hier der korrekte code:
#include <stdio.h> int liefere_zahl(char* texteingabe); int liefere_doppeltezahl(char* texteingabe); void liefere_doppeltezahl_callby(int* eingabe); int main(void) { int ausgabe = liefere_zahl("Bitte eine Zahl eingeben:"); printf("\nDie eingegbene Zahl ist: %d\n", ausgabe); int ausgabe_zwei = liefere_doppeltezahl("Bitte eine Zahl eingeben:"); printf("\nDie gelieferte Zahl ist: %d\n", ausgabe_zwei); puts("Gib Zahl ein:"); int eingabe = 0; scanf("%d", &eingabe); liefere_doppeltezahl_callby(&eingabe); printf("Die doppelte Zahl ist: %d\n", eingabe); } int liefere_zahl(char* texteingabe) { int eingabe = 0; printf("%s", texteingabe); scanf("%d", &eingabe); return eingabe; } int liefere_doppeltezahl(char* texteingabe) { int eingabe = 0; printf("%s", texteingabe); scanf("%d", &eingabe); return eingabe * 2; } void liefere_doppeltezahl_callby(int* eingabe) { *eingabe = *eingabe * 2; }
SeppJ und wie geht es jetzt weiter?
-
SeppJ schrieb:
Da hast du dir was angewöhnt, das dir dein Dozent zurecht wieder austreiben möchte. Sei froh!
Gehen wir in Babyschritten vor:
1. Schreib eine Funktion, die einen int-Wert ausgibt, den man ihr übergibt. Schreib ein Testprogramm mit Beispielaufruf.
2. Schreib eine Funktion, der man einen int-Wert übergibt. Sie gibt den doppelten Wert zurück (return). Schreib ein Testprogramm mit Beispielaufruf.
3. Schreib eine Funktion, die den Wert einer int-Variablen verdoppelt (call by reference). Schreib ein Testprogramm mit Beispielaufruf.Danke SeppJ, habs gecheckt und gelöst, so halbwegs, aber bei der Prüfung morgen hoffe ich wird er nicht so streng sein.
-
Versuch es mal wirklich genau so zu machen, wie ich gesagt habe. Ohne Eingabe in den Funktionen.
Wenn du das dann hast, dann hast du hoffentlich alles gelernt, was nötig ist, um dein Programm ohne globale Variablen zu schreiben.