Funktion mit mehreren Rückgabewerten?
-
Huhu,
ich übe mich gerade an ein paar Klausuren... eine Aufgabe bringt mich etwas aus dem Konzept:
Es gibt eine Funktion, die eine geöffnete Datei zum Lesen übergeben bekommt. Bei dieser sollen dann alle Großbuchstaben in Kleinbuchstaben verwandelt werden.
Dann sollen... und da liegt mein Problem,
1. die Anzahl der umgewandelten Buchstaben
2. die Anzahl der Ziffern,
3. die Anzahl der Buchstaben
zurückgegeben werden. Wie kann ich mehrere Werte zurückgeben?Meine eine Idee ist, die drei Werte in einem Array auf dem Heap zu allokieren und anschließend die Adresse des Arrays zurückzugeben. Das beißt sich allerdings mit der Aufgabenstellung, da die Funktion keinen Zeiger zurückgeben soll.
Meine zweite Idee wäre es, nur die Anzahl der umgewandelten Buchstaben zurückzugeben. Die Anzahl der Ziffern und die der Buchstaben soll in die Datei geschrieben werden. Wenn man die drei Werte am Bildschirm ausgeben wollte, müsste man dann extra in der Datei nachsehen. Aber irgendwie kommt mir das auch nicht gerade elegant gelöst vor.
Verstehe ich die Aufgabe etwas falsch oder wie könnte man da vorgehen?
Hier ist die Aufgabe:
a) Implementieren Sie eine Funktion copy_File, die eine übergebene Datei fein in eine
übergebene Datei faus kopiert. Dabei werden Großbuchstaben in Kleinbuchstaben
umgewandelt. De Anzahl der umgewandelten Buchstaben wird über einen Parameter
anz_converted zurückgegeben.
Zusätzlich zählt die Funktion die Buchstaben und die Ziffern in der Eingabedatei und gibt
deren Anzahl als Rückgabewert zurück.
(Hinweis: Verwenden Sie zum Umwandeln in Kleinbuchstaben die Funktion
int tolower(char c))int copy_File(
b)Geben Sie eine main()-Funktion an, in der Sie einen String von der Standardeingabe
einlesen und diesen anschließend gespiegelt wieder ausgeben.Greez
Haimi
-
Aufgabenstellung schrieb:
De Anzahl der umgewandelten Buchstaben wird über einen Parameter
anz_converted zurückgegebenInterprediere ich mit Call by Reference oder Call by Pointer:
void callByReference(int &a) { a = 5; } void callByPointer(int *a) { *a = 8; } int main() { int result; callByReference(result); callByPointer(&result); }
Aufgabenstellung schrieb:
Zusätzlich zählt die Funktion die Buchstaben und die Ziffern in der Eingabedatei und gibt
deren Anzahl als Rückgabewert zurückInterprediere ich so, das für beide Dinge nur ein Zähler existiert.
"jsfgnsjd34534fas" > gibt also 16 zurueck.
-
wie wärs mit
int copy_File(FILE *fp, int *anz_converted);
Gruss
-
Steht indirekt schon in der Aufgabenstellung.
Dabei werden Großbuchstaben in Kleinbuchstaben
umgewandelt. De Anzahl der umgewandelten Buchstaben wird über einen Parameter
anz_converted zurückgegeben.
Zusätzlich zählt die Funktion die Buchstaben und die Ziffern in der Eingabedatei und gibt
deren Anzahl als Rückgabewert zurück.Letzteres ist also der "eigentliche" Rückgabewert. anz_converted soll ein Parameter der Funktion sein, das muss ein Zeiger sein. Gerne spricht man von sowas als "out parameter", also kein wirklicher Parameter (der in die Funktion eingeht) sondern nur eine Art Hilfsparameter.
int copy_File (FILE *fein, FILE *faus, int *anz_converted) { /* mach was */ *anz_converted = deine_berechnete_anzahl_der_umgewandelten_zeichen; return alle_zeichen_gezaehlt; }
Klar?
Ansonsten kann man "mehrere Rückgabewerte" auch in ein Strukt packen und das zurückgeben, das entpsricht aber nicht der Aufgabenstellung und ist auch eher unüblich.
-
Haimi schrieb:
Es gibt eine Funktion, die eine geöffnete Datei zum Lesen übergeben bekommt. Bei dieser sollen dann alle Großbuchstaben in Kleinbuchstaben verwandelt werden.
Dann sollen... und da liegt mein Problem,
1. die Anzahl der umgewandelten Buchstaben
2. die Anzahl der Ziffern,
3. die Anzahl der Buchstaben
zurückgegeben werden. Wie kann ich mehrere Werte zurückgeben?Na, ganz einfach, Du übergibst die Rückmeldungen als pointer bzw. Referenzen. Also
int function(FILE *analyzefile, int *wandelbuc, int* ziff, int *buc);
Aufrufen ganz einfach mit Referenzen auf lokale Vars:
int w, z, b; FILE *a; // file öffnen usw. ... function(a, &w, &z, &b);
function muß vor Ende natürlich so Zuweisungen beinhalten wie *wandelbuc = Wandelbuchstaben usw.
Alles klar?
-
BasicMan01 schrieb:
void callByReference(int &a)
Ist kein ANSI C.
-
und warum nicht einfach ein struct zurück geben
das wär zu schwer oder
hey! da braucht man nicht mal malloc()
-
Tim schrieb:
Ansonsten kann man "mehrere Rückgabewerte" auch in ein Strukt packen und das zurückgeben, das entpsricht aber nicht der Aufgabenstellung und ist auch eher unüblich.
uups überlesen sry
-
Wutz schrieb:
BasicMan01 schrieb:
void callByReference(int &a)
Ist kein ANSI C.
ups ... gut zu wissen. Wieder ein Grund mehr für mich, C sein zu lassen
-
BasicMan01 schrieb:
Wutz schrieb:
BasicMan01 schrieb:
void callByReference(int &a)
Ist kein ANSI C.
ups ... gut zu wissen. Wieder ein Grund mehr für mich, C sein zu lassen
husch weg mit dir :p du weißt ja nicht was gut ist
-
imho ist callbyreference = callbypointer. das andere wäre callbyvalue...
-
Huhu,
vielen Dank für die vielen Inspirationen
Ich habe es zunächst einmal über die Variante versucht, der Funktion die Adressen von anzahl_zahlen und anzahl_buchstaben zu übergeben und nur anzahl_converted über return zurückzugeben...
Das Programm hat aber noch irgendwo einen Fehler... in der Ausgabedatei steht der String mit kleinen Buchstaben, das funktioniert.
Anzahl_converted wird auch richtig ausgegeben.Aber ich scheine etwas bei den anderen beiden als Funktionsparametern falsch gemacht zu haben... das Ergebnis ist immer 0, der Wert, mit dem ich die Variablen in Main initialisiert habe... wo hängt es da... gedanklich dachte ich jetzt, da in der Funktion der Wert direkt in der Adresse von main geändert wird, es würde funktionieren...
hier mal der Code:
//kl_ss_04_a2 #include <stdio.h> #include <stdlib.h> int copy_File(FILE *fein, FILE *faus, int *anz_chars, int *anz_numbers) { char c; int anz_converted = 0; while ( (c = fgetc(fein)) != EOF) { //Großbuchstabe? if ( (c >= 'A') && (c <= 'Z') ) { c = c + 'a' - 'A'; fputc(c, faus); anz_converted++; *anz_chars++; } //Kleinbuchstabe? else if ( (c >= 'a') && (c <= 'z') ) { fputc(c, faus); *anz_chars++; } //Zahl? else if ( (c >= 0) && (c <= 9) ) { fputc(c, faus); *anz_numbers++; } //Alle anderen Zeichen else fputc(c, faus); } //Anzahl umgewandelter Buchstaben zurückgeben return anz_converted; } int main (void) { int anz_converted = 0; int anz_chars = 0; int anz_numbers = 0; //Dateien öffnen + auf Fehler prüfen FILE *fin; FILE *fout; fin = fopen("ein.txt", "r"); if (NULL == fin) exit(-1); fout = fopen("aus.txt", "w"); if (NULL == fout) exit(-1); anz_converted = copy_File(fin, fout, &anz_chars, &anz_numbers); //Ergebnis ausgeben printf("Anzahl umgewandelter Buchstaben:\t%d\n", anz_converted); printf("Anzahl der Buchstaben gesamt:\t%d\n", anz_chars); printf("Anzahl der Zahlen:\t%d\n", anz_numbers); //Dateien schließen fclose(fin); fclose(fout); getchar(); return 0; }
Als nächstes probiere ich dann noch die Version, ein struct zurückzugeben... das ist nämlich auch schön gelöst
Greez
Haimi
-
Haimi schrieb:
*anz_chars++;
Und, hast du getestet?
Die Vorrangregeln der C-Operatoren hast du nicht beachtet, es sollte heissen:(*anz_chars)++;
-
ahh... vielen Dank
Jetzt funktioniert alles... ein kleiner Fehler war noch zusätzlich drin, bei der Abfrage ob es Zahlen sind, müssen die Zahlen in Anführungszeichen gesetzt werden...
-
http://www.cplusplus.com/reference/clibrary/cctype/
versuchs doch mal damit dann klappts auch mit dem nachbar :p
-
das ist ja ein Ding... ich wusste gar nicht das es schon so tolle Funktionen in C gibt
hat auch noch nie jemand von was erwähnt wo ich es lerne ^^
Ich habe gerade angefangen das Programm auf eine Rückgabe einer Struktur umzuwandeln... kanns sein, dass die Aufgabenstellung damit auch verfälscht getroffen wäre?
Ich habe mir diese Struktur angelegt:
typedef struct
{
int anz_chars = 0;
int anz_numbers = 0;
int anz_converted = 0;
} counter_t;die Funktion copyFile ist aber vom Typ int... und wenn ich eine Struktur zurückgebe, müsste ich sie ja auf den Typ counter_t umschreiben... oder?
-
Ja.
Und wo definierst du die struct-Variable, welche du direkt oder als Zeiger zurückgibst? Du musst sicherstellen, dass der Speicherbereich deines Rückgabewertes im aufrufenden Kontext gültig ist.
-
jein also du sollst scheinbar beides können rückgabe via parameter und via return
De Anzahl der umgewandelten Buchstaben wird über einen Parameter
anz_converted zurückgegeben.rückgabe via parameter
Zusätzlich zählt die Funktion die Buchstaben und die Ziffern in der Eingabedatei und gibt
deren Anzahl als Rückgabewert zurück.rückgabe via return
int copy_File(
und zum finale bin ich voll planlos
-
Wutz schrieb:
Ja.
Und wo definierst du die struct-Variable, welche du direkt oder als Zeiger zurückgibst? Du musst sicherstellen, dass der Speicherbereich deines Rückgabewertes im aufrufenden Kontext gültig ist.
einfach in der function als lokale variable anlegen und dann durchs return raus