Anfänger Deluxe - Felder Parameter Pointer
-
Hallo Profis,
ich hab erst vor zwei Wochen angefangen, mich mit C zu beschäftigen. Im Rahmen meiner Ausbildung muss ich ein sinnloses Programm schreiben. Es werden Zahlen in ein Feld eingelesen. Anschließend soll das Unterprogramm analysiere die Anzahl der Zahlen, die kleiner Null sind und die Summe aller Zahlen im Feld ermitteln und in die Speicheradresse schreiben. Mein Code sieht wie folgt aus:
/* Einsendeaufgabe 2 Verwendung von Feldern */ /*Einbindung des Standard In- und Outputs*/ #include <stdio.h> /*Identifikation des Unterprogramms analysiere*/ void analysiere (float werte[20], float * p_summe, float * p_anzahl); /*Globale Variablen-Deklaration*/ int Counter, anzahl; float werte[21], summe; /*Hauptprogramm main*/ void main ( void ) { Counter = 1; do { werte[Counter] = (Counter - 3) * (Counter - 5) * (Counter - 8); printf("Wert(index %2i): %2f.\n", Counter,werte[Counter]); Counter++; } while (Counter <= 20); /*Fuehre Analysefunktion aus. Das & Zeichen wird als Adresse von... gelesen.*/ analysiere(werte, & summe, & anzahl); /*Ausgabe der Analyseergebnisse*/ printf("Die Summe aller Zahlen lautet: %12.4f\n", summe); printf("Die Anzahl der Zahlen kleiner Null ist: %2i\n", anzahl); } void analysiere (float werte[20], float * p_summe, float * p_anzahl) { Counter = 1; summe = 0; anzahl = 0; /* Ausgabe der Uebergabe printf("Summe liegt bei Adresse: %d\n", p_summe); printf("Anzahl liegt bei Adresse: %d\n", p_anzahl); */ do { summe +=werte[Counter]; if (werte[Counter] < 0) { anzahl++; } Counter++; } while (Counter <= 20); *p_summe = summe; *p_anzahl = anzahl; }
Die Berechnung an sich funktioniert. Wenn ich mir die Werte der Variablen summe und anzahl im Unterprogramm ausgeben lasse, erhalte ich 12370 und 4, wie es sein sollte. Wenn ich jedoch die Werte nach dem Aufrufen des Unterprogramms analysiere wie oben beschrieben ausgeben lasse erhalte ich für Summe die erwarteten 12370, für anzahl jedoch 1082130432.
Wieso funktioniert die Übergabe von summe an *p_summe, aber nicht die Übergabe von anzahl an *p_anzahl.
Wäre für jeden Tipp dankbar, denn ich brühte jetzt doch schon 45 min. darüber.
Vielen Dank im Voraus, und frohe Weihnachten :xmas1:
CJens
-
Weil p_anzahl ein Zeiger auf float ist, anzahl aber ein int.
-
Beantworte mal die Fragen hinter den // !!
Und beachte die Compiler Warnungen
/* Einsendeaufgabe 2 Verwendung von Feldern */ /*Einbindung des Standard In- und Outputs*/ #include <stdio.h> /*Identifikation des Unterprogramms analysiere*/ void analysiere (float werte[20], float * p_summe, float * p_anzahl); /*Globale Variablen-Deklaration*/ int Counter, anzahl; float werte[21], summe; /*Hauptprogramm main*/ void main ( void ) { Counter = 1; // !! Welchen Typ hat Counter? Warum 1? Felder fangen bei Index 0 an! do { werte[Counter] = (Counter - 3) * (Counter - 5) * (Counter - 8); printf("Wert(index %2i): %2f.\n", Counter,werte[Counter]); Counter++; } while (Counter <= 20); /*Fuehre Analysefunktion aus. Das & Zeichen wird als Adresse von... gelesen.*/ analysiere(werte, & summe, & anzahl); // !! Compiler Warnung: Typ unterschiedlich Pointer auf Integer und Pointer auf float /*Ausgabe der Analyseergebnisse*/ printf("Die Summe aller Zahlen lautet: %12.4f\n", summe); printf("Die Anzahl der Zahlen kleiner Null ist: %2i\n", anzahl); / } void analysiere (float werte[20], float * p_summe, float * p_anzahl) // !!Warum ist p_anzahl ein float? { Counter = 1; // !! Typ? summe = 0; // !! Typ? anzahl = 0; // !! Typ? /* Ausgabe der Uebergabe printf("Summe liegt bei Adresse: %d\n", p_summe); printf("Anzahl liegt bei Adresse: %d\n", p_anzahl); */ do { summe +=werte[Counter]; if (werte[Counter] < 0) { anzahl++; } Counter++; } while (Counter <= 20); *p_summe = summe; *p_anzahl = anzahl; }
Du kannst auf float verzichten und gleich double nehmen.
Funktionen können auch werte mit return zurückgeben.
-
...mit int * p_anzahl funktioniert es wunderbar.
Vielen Dank für die Hilfe.
-
Du solltest auch noch die anderen Hinweise berücksichtigen.
-
Funktioniert prima? Naja, wenn du das Programm compilieren konntest, heisst das noch nicht dass auch alles prima ist. Adressen haben z.B. den printf-Formatspezifizierer "%p", dein "%d" ist doppelt falsch, da du float-Werte als Integer ausgibst.