Aufgabe zum Montag bitte Hilfe
-
"...die korrekte implizite Umwandlung..." braucht z.B. nicht zu funktionieren bei einer Implementierung von fseek als Makro.
Auf irgendwas Implizites zu vertrauen wenn man auch gleich was Eindeutiges explizit vorgeben kann ist auch nur Fehlerverschleierung und/oder bringt Portabilitätseinbußen mit sich, gerade für Lernende ungeeignet und aus Sicht von Lehrenden sogar schon fahrlässig.
-
fseek ist kein Makro, sonder eine Funktion (per Standard). Deine Argumentation ist albern. Sie wäre selbst dann albern, wenn fseek ein Makro sein dürfte, weil sich dieses Makro wie eine Funktion der Signatur int fseek(FILE*, long, int); verhalten müsste und bei deren Aufruf eine implizite Umwandlung stattfände. Ferner wird genau diese Umwandlung in einer Fußnote im Standard verwendet.
-
Versuche, die Aufgaben ein einzelne Funktionen zu separieren und von rein "technischen" Aktionen wie Dateioperationen zu trennen; in den Funktionen kannst du dich dann auf deine eigenen (fachlichen) Probleme konzentrieren:
void skaliereZeit(float fm[][5],int i) { float minzeit=fm[0][0]; /* erster Wert einer Zeile soll wohl die Zeit sein ...; => Zeitwert des 1. Datensatzes/Zeile */ float maxzeit=fm[i-1][0]; /* Arrays ist C beginnen immer bei 0 (und enden bei Größe-1); => Zeitwert des letzten Datensatzes/Zeile */ float bereich=(maxzeit-minzeit); int x; for(x=0;x<i;++x) ... } void skaliereGeschwindigkeiten(float fm[][5],int i) { } void normiereGeschwindigkeiten(float fm[][5],int i) { } void ausgabeIntegerMatrix(float fm[][5],int i,char *name) { FILE *f=fopen(name,"w"); int x,y; for(x=0;x<i;++x,fputc('\n',f)) /* hier die "Matrix"werte einzeln durchlaufen und als int-Wert in neue Datei schreiben */ for(y=0;y<5;++y) fprintf(f,"%d ",(int)fm[x][y]); fclose(f); } int main(void) { FILE *f; if( f=fopen("Candaten.dat","r") ) { int i=0; float *zeiger=0; while( (zeiger=realloc(zeiger,++i*sizeof*zeiger))!=0 && 1==fscanf(f,"%f",&zeiger[i-1]) ); /* alle durch Whitespaces getrennte float-Werte einlesen */ fclose(f); --i; /* i sind jetzt Anzahl der einlesenen float-Werte */ i/=5; /* i ist jetzt Anzahl der Zeilen */ skaliereZeit(zeiger,i); skaliereGeschwindigkeiten(zeiger,i); normiereGeschwindigkeiten(zeiger,i); ausgabeIntegerMatrix(zeiger,i,"CanDatenSkaliert.dat"); free(zeiger); } return 0; }
-
@Wutz
der totale schrott hat aber funktioniert
-
coolzero0001 schrieb:
@Wutz
der totale schrott hat aber funktioniertDas hat der Kapitän der Titanik auch gedacht, als sie aus dem Hafen fuhr.
-
SeppJ schrieb:
Wutz schrieb:
fseek(fp,0,SEEK_SET); /* <- Professorenschrott, muss portabel natürlich fseek(fp,0L,SEEK_SET) heißen, besser einfach rewind(fp) */
Na, die korrekte implizite Umwandlung von 0 nach 0L ist dir aber schon portabel garantiert.
wutz ich bedanke mich bei dir
Deine Hinweise helfen mir
Ich habe meine Zeit verloren, mit fseek(fp,0,SEEK_SET)
Ein Buchstabe spielt manschmal wichtige Rolle
-
Wutz schrieb:
Versuche, die Aufgaben ein einzelne Funktionen zu separieren und von rein "technischen" Aktionen wie Dateioperationen zu trennen; in den Funktionen kannst du dich dann auf deine eigenen (fachlichen) Probleme konzentrieren:
void skaliereZeit(float fm[][5],int i) { float minzeit=fm[0][0]; /* erster Wert einer Zeile soll wohl die Zeit sein ...; => Zeitwert des 1. Datensatzes/Zeile */ float maxzeit=fm[i-1][0]; /* Arrays ist C beginnen immer bei 0 (und enden bei Größe-1); => Zeitwert des letzten Datensatzes/Zeile */ float bereich=(maxzeit-minzeit); int x; for(x=0;x<i;++x) ... } void skaliereGeschwindigkeiten(float fm[][5],int i) { } void normiereGeschwindigkeiten(float fm[][5],int i) { } void ausgabeIntegerMatrix(float fm[][5],int i,char *name) { FILE *f=fopen(name,"w"); int x,y; for(x=0;x<i;++x,fputc('\n',f)) /* hier die "Matrix"werte einzeln durchlaufen und als int-Wert in neue Datei schreiben */ for(y=0;y<5;++y) fprintf(f,"%d ",(int)fm[x][y]); fclose(f); } int main(void) { FILE *f; if( f=fopen("Candaten.dat","r") ) { int i=0; float *zeiger=0; while( (zeiger=realloc(zeiger,++i*sizeof*zeiger))!=0 && 1==fscanf(f,"%f",&zeiger[i-1]) ); /* alle durch Whitespaces getrennte float-Werte einlesen */ fclose(f); --i; /* i sind jetzt Anzahl der einlesenen float-Werte */ i/=5; /* i ist jetzt Anzahl der Zeilen */ skaliereZeit(zeiger,i); skaliereGeschwindigkeiten(zeiger,i); normiereGeschwindigkeiten(zeiger,i); ausgabeIntegerMatrix(zeiger,i,"CanDatenSkaliert.dat"); free(zeiger); } return 0; }
Ich finde so besser und gut aussieht, aber ich darf in dieser Aufgabe nur in HauptProgramm Arbeiten
Aufjedenfall danke ich dir
-
#include <stdio.h> #include <stdlib.h> /* * */ int main(void) { long lines; int i,k,j; float t,Zeit_min,Zeit_max,Rad_min,Rad_max,Rad_differenz; float Zeit_Skalierungsfaktor,Rad_Skalierungsfaktor; char* zeile ; FILE* fp = fopen("Candaten.dat", "r"); if (fp == NULL) { printf("Daten kann nicht geoeffnet werden\n");//fehler meldung return(0); } else { for (lines=0;fgets(zeile,500,fp);++lines){} } fseek(fp,0l,SEEK_SET); float Daten[lines][5]; float Datenskaliert[lines][5]; for(i=0;i<lines;i++) for(j=0;j<5;j++) { fscanf(fp, "%f", &t); Daten[i][j]=t; Datenskaliert[i][j]=t; } Zeit_min=Daten[0][0]; Zeit_max=Daten[lines-1][0]; Zeit_Skalierungsfaktor=800/Zeit_max; Rad_max=Daten[0][1]; Rad_min=Daten[0][1]; float a[2]; for(i=0;i<lines;i++) for(j=1;j<5;j++) { if (Daten[i][j] < Rad_min) a[0] = Daten[i][j]; if (Daten[i][j] > Rad_max) a[1] = Daten[i][j]; } Rad_min=a[0]; Rad_max=a[1]; printf("%f\n%f\n",Rad_min,Rad_max); Rad_differenz= Rad_max- Rad_min; for(i=0;i<lines;i++) Datenskaliert [i][0] *= Zeit_Skalierungsfaktor; Rad_Skalierungsfaktor = 400 / Rad_max; for(i=0;i<(lines);i++) { for(j=1;j<5;j++) { Datenskaliert[i][j] = (Datenskaliert[i][j] * Rad_Skalierungsfaktor); } } FILE *fp2; fp2=fopen("CanDatenSkaliert.dat","wt"); //Fehlerabfrage if (fp2 == NULL) { printf("CanDatenSkaliert.dat kann nicht geoeffnet werden\n"); return(-1); } for(i=0;i<lines;i++) { for(j=0;j<5;j++) { fprintf(fp2,"%2.0f\t ",Datenskaliert[i][j]); if (j % 5 == 4) fprintf(fp2,"\n"); } } fclose(fp2); fclose(fp); return (0); }
Das habe ich gemacht, und das funktioniert
-
SeppJ schrieb:
coolzero0001 schrieb:
@Wutz
der totale schrott hat aber funktioniertDas hat der Kapitän der Titanik auch gedacht, als sie aus dem Hafen fuhr.
wesam88 schrieb:
[...viel Code...]
Das habe ich gemacht, und das funktioniertDer Eisberg sagt dazu:
test.c: In function ‘main’: test.c:11:47: warning: variable ‘Rad_differenz’ set but not used [-Wunused-but-set-variable] float t,Zeit_min,Zeit_max,Rad_min,Rad_max,Rad_differenz; ^ test.c:11:13: warning: variable ‘Zeit_min’ set but not used [-Wunused-but-set-variable] float t,Zeit_min,Zeit_max,Rad_min,Rad_max,Rad_differenz; ^ test.c:10:11: warning: unused variable ‘k’ [-Wunused-variable] int i,k,j; ^ [b]test.c:23:27: warning: ‘zeile’ may be used uninitialized in this function [-Wuninitialized] for (lines=0;fgets(zeile,500,fp);++lines){}[/b]
Der fett markierte ist schwerwiegend!
-
auch wenn einige sagen es ist alles schrott von mir!
" Variablen immer am anfang definieren und initialisieren! "
so wirds auch in der Technikerschule gelehrt.