Anfängerfehler?
-
Hallo,
Ich hab mir nach erfolglosen 2 Semestern Grundlagen Informatik über C & C++ vor 3 Jahren jetzt mal wieder gedacht etwas in der Richtung zu versuchen. Hab mir Literatur besorgt und jetzt halt bissl probiert. Hab jetzt ein Problem.Wenn ich in einer Funktion einen Wert ändern will, muss ich ihn als Referenz übergeben. Soweit klar. Hab das auch in meinem Programm für die Funktion 'Dateilesen' gemacht, nur ändert sich der Wert leider nicht. Kann mir jemand sagen, wo das Problem liegt, ich rätsele hier schon seit ner Weile rum. Globale Variablen will ich nicht einführen...
Achso, wie kann man in einem Array alle Werte beim Init. auf einen gleichen Wert setzen, ohne jeden einzelnen angeben zu müssen? Sieht bei mir bissl doof aus.
#include <stdio.h> #include <stdlib.h> float Wahrscheinlichkeiten(float *, float *, float); float Dateilesen(FILE *, float *, float *); float Wahrscheinlichkeiten(float *Anzahl, float *Wahrsch, float Nummern) { int index; for (index = 0 ; index <= 255 ; index++) { if (Anzahl[index] != 0) Wahrsch[index] = (Anzahl[index] / Nummern); } return *Wahrsch; } float Dateilesen(FILE *Datei, float *Num, float *Anzahl) { char Asci; while((Asci = getc(Datei)) != EOF) { printf("%c",Asci); *Num++; Anzahl[Asci]++; } return *Anzahl; } int main(int argc, char *argv[]) { float Nummern = 0; float Anzahl[256] = {[1]=0}; float Wahrsch[256] = {[1]=0}; char Dateiname[50]; int index; FILE *Datei; /* Dateinamen entgegennehmen */ printf("Dateinamen eingeben: "); scanf("%s",Dateiname); puts("\n"); /* Prüfen ob Datei vorhanden und öffnen */ if((Datei = fopen(Dateiname, "r")) == NULL) { printf("Datei %s konnte nicht geoeffnet werden!\n", Dateiname); system("PAUSE"); return 1; } *Anzahl = Dateilesen(Datei, &Nummern, Anzahl); printf("\nAnzahl der Zeichen: %f\n", Nummern); /* Haeufigkeiten ausgeben */ printf("Haeufigkeiten:\n"); for (index = 0 ; index <= 255 ; index++) { printf("index: %i %f\t", index , Anzahl[index]); } *Wahrsch = Wahrscheinlichkeiten(Anzahl, Wahrsch, Nummern); /* Wahrscheinlichkeiten ausgeben */ printf("\n\nWahrscheinlichkeiten:\n"); for (index = 0 ; index <= 255 ; index++) { printf("index: %i %f\t", index , Wahrsch[index]); } fclose(Datei); system("PAUSE"); return 0; }
Danke schonmal....
-
In C kannst du nur Zeiger übergeben (was du auch machst). Da gibts keine Referenzen (in C++ allerdings schon).
Welcher Parameter wird bei welcher Funktion nicht geändert?
Das Initialisieren eines Arrays mit dem Initialwert 0 ist recht einfach:
... int Zahlen[100] = { 0 }; //alles mit 0 initialisieren ...
Das funktioniert aber nur bei 0!
system("PAUSE") benutzt man nicht! Wenn du dem Benutzer sagen willst, dass er eine beliebige Taste drücken soll und du dann eine Taste von der Tastatur einlesen willst, dann mach das auch und missbrauche dazu nicht system() mit Systembefehlen. Systembefehle haben eigentlich generell nichts in einem Programm zu suchen. Dafür gibts Batchdateien. Die kannst du vollpflastern mit Systembefehlen. Hintergrund ist auch, dass du das Programm mit Systembefehlen nur in bestimmten Systemen ausführen kannst, weil es den Systembefehl wo anders nicht gibt!
-
xGCFx schrieb:
float Anzahl[256] = {[1]=0};
compiled das überhaupt?
machst du so:memset (Anzahl, 0, sizeof(float)*256);
-
Ja, das mit dem
system("pause")
weiss ich, hat aber die dev-ide so als Grundgerüst reingeschrieben, wollte das aber in Zukunft noch ändern.
Also ich zähle in der Funktion 'Dateilesen' unter anderem die Zeichen in der Datei, indem ich die Variable Nummern inkrementiere, das erledige ich über den Pointer, damit sie dann auch im Hauptprogramm geändert ist. Nur funzt das leider nicht, sie bleibt bei 0, wie ich sie am Anfang von Main initialisiert habe.
memset (Anzahl, 0, sizeof(float)*256);
hab ich in meiner C Referenz auch gesehen, nur stand da keine Erklärung zu, deshalb hab ich es erstmal nicht benutzt, wenn ich nicht weiss, was das überhaupt macht.
float Anzahl[256] = {[1]=0};
ist laut meinem Buch C99 und heisst, dass Anzahl[1] = 0 und der Rest automatisch 0 gesetzt wird. Anders wusste ich mir nicht zu helfen. Compiliert wurde es anstandslos...
-
Ich hab den Fehler gefunden.
*Num++;
ist falsch, muss
(*Num)++;
heissen.
Weil unäre Operatoren von rechts nach links zusammengefasst werden... Nach Suchen im K/R Buch gefunden.