019
29.04.2006, 20:40 Uhr
~Stefan S.
Gast
|
Ich habe mir nun einmal den Code etwas genauer angesehen. Es sind so einige Schnitzer im Quellcode enthalten. Du hantierst mit einigen ungültigen Indexen und Pointern. Das Programm, so wie es dasteht ist sehr unsicher, nicht nur aufgrund von Buffer-Overruns beim Einlesen. Ich habe die gröbsten Fehler beim schnellen Überfliegen beseitigt, eventuell stecken noch weitere drinnen, da der Code sehr konfus strukturiert ist. So wie es nachfolgend da steht hat es zumindest meine Umgebung bei den gängigen Tests beschwerdefrei überstanden:
C++: |
# include <stdio.h> # include <stdlib.h> # include <malloc.h>
/**Define´s**********************************/
# define MAX_TEMP 3
/**Funktion main.c***************************/
int main(int argc, char *argv[]){
double *Luftdruck; double **Temperatur; int Tage, zusatz; char Zeichen; int i,u,o = 0; double mittel_Temp = 0; double mittel_LD = 0;
printf("Wieviele Tage einlesen: "); scanf("%i",&Tage); fflush(stdin);
/**Speicherreservierung**********************/
Luftdruck = (double*)malloc(Tage * sizeof(double)); if (Luftdruck == NULL){ printf("ERROR. Kein Speicher fuer Luftdruck\n"); exit(1); } Temperatur = (double**)malloc(Tage * sizeof(double*)); if (Temperatur == NULL){ printf("ERROR. Kein Speicher fuer Temperatur Tage\n"); exit(1); } for(i = 0;i < Tage; i++){ Temperatur[i] = (double*)malloc(MAX_TEMP * sizeof(double)); if (Temperatur[i] == NULL){ printf("ERROR. Kein Speicher fuer Temperatur Werte\n"); exit(1); } }
/**Werte Eingeben****************************/
for(i = 0; i <= Tage-1; i++){ printf("Tag %i\n",i+1); for(u = 0; u <= 2; u++){ printf("Temperatur %i: ",u+1); scanf("%lf",&Temperatur[i][u]); fflush(stdin); } printf("Luftdruck: "); scanf("%lf",&Luftdruck[i]); fflush(stdin); }
/**Durchschnittsberechnungen*****************/
printf("Druchschnittswert des Luftdrucks: "); for(i = 0; i <= Tage-1; i++){ mittel_LD += Luftdruck[i]; } mittel_LD = mittel_LD / Tage; printf("%lf\n",mittel_LD);
printf("Durchschnittswert der Temperatur: "); for(i = 0; i <= Tage-1; i++){ for(u = 0; u < 3; u++){ mittel_Temp += Temperatur[i][u]; } } mittel_Temp = mittel_Temp / (Tage * 3); printf("%lf\n",mittel_Temp);
/**Schleife für Wiederholungen****************/ while(o == 0){ printf("Neue Tage [J/N]: "); Zeichen = getc(stdin);
if((Zeichen == 'J')||(Zeichen == 'j')){ printf("Wieviel Tage zusätzlich: "); scanf("%i",&zusatz); fflush(stdin);
Luftdruck = (double*)realloc(Luftdruck, (_msize(Luftdruck)+zusatz) * sizeof(double)); if (Luftdruck == NULL){ printf("ERROR. Kein Speicher fuer Luftdruck\n"); exit(1); } Temperatur = (double**)realloc(Temperatur, (_msize(Temperatur)+zusatz) * sizeof(double*)); if (Temperatur == NULL){ printf("ERROR. Kein Speicher fuer Temperatur Tage\n"); exit(1); } for(i = Tage ;i < (Tage + zusatz); i++){ Temperatur[i] = (double*)malloc(MAX_TEMP * sizeof(double)); if (Temperatur[i] == NULL){ printf("ERROR. Kein Speicher fuer Temperatur Werte\n"); exit(1); } }
for(i = Tage; i < (Tage + zusatz); i++){ printf("Tage %i: \n",i+1); for(u = 0; u < MAX_TEMP; u++){ printf("Temperatur %i: ", u+1); scanf("%lf",&Temperatur[i][u]); fflush(stdin); } printf("Luftdruck: "); scanf("%lf",&Luftdruck[i]); fflush(stdin); } Tage += zusatz;
mittel_LD = 0; mittel_Temp = 0;
printf("Druchschnittswert des Luftdrucks: "); for(i = (Tage - zusatz); i < Tage; i++){ mittel_LD += Luftdruck[i]; } mittel_LD = mittel_LD /zusatz; printf("%lf\n",mittel_LD);
printf("Durchschnittswert der Temperatur: "); for(i = (Tage - zusatz); i < Tage; i++){ for(u = 0; u < MAX_TEMP; u++){ mittel_Temp += Temperatur[i][u]; } } mittel_Temp = mittel_Temp / (zusatz * 3); printf("%lf\n",mittel_Temp); } else{ o++; } }
/**Ende und Speicher freigeben***************/ printf("Programm ENDE\n");
free(Luftdruck);
for(i = 0; i < Tage; i++){ free(Temperatur[i]); } free(Temperatur); return(0); }
|
|