Funktion mit mehreren Rückgabewerten?
-
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