absturz in switch-anweisung

stoepsel555

Grünschnabel
Moin moin,

mein problem ist, dass mein programm nach der eingabe von a, b oder e abstürzt und ich kann den fehler nicht finden.

Vielleicht findet ihn ja jemand :).

Code:
Eingabe_Geo_dezi(int anz_punkte_geo)	{
	double breite_geo[anz_punkte_geo-1], laenge_geo[anz_punkte_geo-1];
	double hochwert, rechtswert;
	int i=0;
	short int a=0;
	FILE *neu;
	
	for (i=0; i<anz_punkte_geo; i++)	{	
		printf("Punkt %i: ",i+1);
		printf("\tGeographische Laenge: ");
		scanf("%lf",&laenge_geo[i]);
		printf("\t\tGeographische Breite: ");
		scanf("%lf",&breite_geo[i]);
		
		Geo_Gauss(&rechtswert, &hochwert, laenge_geo[i], breite_geo[i]);
	}
	
	while(a==0)	{
	printf("Wie sollen die Koordinaten ausgegeben werden?\n");
	printf("(A) : Zur Laufzeit\n");
	printf("(B) : In einer Datei\n");
	printf("(E) : Programm beenden.\n\n");
	printf("Wahl: ");
	fflush(stdin);
	scanf("%s\n",&ausgabe_geo_art1);
	NeueZeile;
	
		switch(toupper(ausgabe_geo_art1))	{
			case 'A':
				for (i=0; i<anz_punkte_geo; i++)	{
					printf("Punkt %i:\tRechtswert = %.3f\n",i+1, rechtswert);
					printf("\t\tHochwert = %.4f\n", hochwert);
				}	
				a=1;
			break;
			case 'B':
				neu = fopen("BerechneteKoordinaten.txt","w");
				if(neu!=NULL)	{
					for (i=0; i<anz_punkte_geo; i++)	{
						Ausgabe_Datei(rechtswert,hochwert,neu);
					}
					printf("Datei BerechneteKoordinaten.txt erfolgreich erstellt.\n");
				}
				fclose(neu);
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}
}

Gruß
 
Hi

was ist denn ausgabe_geo_art1 für eine Variable?
Sollte ein char sein. Wenn nicht, anpassen.
Und für char verwendet man beim scanf %c, nicht %s.
 
Schau mit dem Debugger, in welcher Zeile das Problem ist.
Da beim geposteten Codeteil einige Sachen fehlen kann ich das nicht.
 
Code:
Eingabe_Gauss_Tastatur()	{
	int i=0;
	short int a=0;
	long int anz_punkte_gauss;
	double breite_geo, laenge_geo;
	FILE *neu;
	
	printf("Wieviele Punkte werden eingegeben?\n\n");
	printf("Anzahl: ");
	scanf("%i",&anz_punkte_gauss);
	NeueZeile;
	
	double hochwert[anz_punkte_gauss-1], rechtswert[anz_punkte_gauss-1];
	
	for(i=0;i<anz_punkte_gauss;i++)	{
		printf("Punkt %i: ",i+1);
		printf("\tRechtswert = ");
		scanf("%lf",&rechtswert[i]);
		printf("\t\tHochwert = ");
		scanf("%lf",&hochwert[i]);
		Gauss_Geo(&laenge_geo, &breite_geo, rechtswert[i], hochwert[i]);
	}
	
	while(a==0)	{
	printf("Wie sollen die Koordinaten ausgegeben werden?\n");
	printf("(A) : Zur Laufzeit\n");
	printf("(B) : In einer Datei\n");
	printf("(E) : Programm beenden.\n\n");
	printf("Wahl: ");
	fflush(stdin);
	scanf("%c",&ausgabe_art);
	NeueZeile;
	
		switch(toupper(ausgabe_art))	{
			case 'A':
				for (i=0; i<anz_punkte_gauss; i++)	{
					printf("Punkt %i:\tGeographische Laenge = %.4f\n",i+1, laenge_geo);
					printf("\t\tGeographische Breite = %.4f\n", breite_geo);
				}	
				a=1;
			break;
			case 'B':
				neu = fopen("BerechneteKoordinaten.txt","w");
				if(neu!=NULL)	{
					for (i=0; i<anz_punkte_gauss; i++)	{
						Ausgabe_Datei(laenge_geo,breite_geo,neu);
					}
					printf("Datei BerechneteKoordinaten.txt erfolgreich erstellt.\n");
				}
				fclose(neu);
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}
	
}

Hier funktioniert die switch-anweisung super. unterschiede finde ich aber keine.
 
Sicher, dass ausgabe_geo_art1 ein einzelnes char ist?

Außerdem sind die zwei Funktionen alles Andere als gleich...
 
Code:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define NeueZeile	printf("\n");
#define PUFFER		fflush(stdin);

char geo_art_tast;
char uebergabe_gauss;
char uebergabe_geo;
char umrechnungsart;
char ausgabe_geo;
char ausgabe_geo_dezi;
char ausgabe_art;
char ausgabe_geo_art;

Ausgabe_Datei(double x,double y,FILE *neu)	{
	
	fprintf(neu,"%.3lf\t%.3lf\n",x,y);
}

void Berechnung_aus_Datei_Gauss() {
	FILE *input;
	FILE *neu;
    char inputLine[23];
	int anzahl=0,zeilenanzahl;
    double *speicher;
	short int a=0;
	double rechtswert[zeilenanzahl], hochwert[zeilenanzahl];
	double laenge_geo, breite_geo;
	char delimiter[] = " ";	// Leerzeichen ist Trennung
	char delimiter2[] = "\n";
	char *ptr;
	char string[250];
	int j=0;
	
	input = fopen("Gauss.txt", "r");
	
	if(input != NULL)	{
		while(fgets(inputLine,sizeof(inputLine),input))	{
			anzahl++;
		}
		printf("Anzahl der Koordinaten: %i\n", anzahl);
		fclose(input);
	}
	else{
		printf("Fehler beim oeffnen.\n");
	}
	zeilenanzahl = anzahl;
	
	speicher = (double*) calloc ((zeilenanzahl*2), sizeof(double));
	
	input = fopen( "Gauss.txt", "r");
	
	if ((input != NULL) && (zeilenanzahl > 0))	{
		
		while(!feof(input))	{
			while(fgets(string,sizeof(string),input)) {
				ptr = strtok(string, delimiter);
				sscanf(ptr,"%lf",&rechtswert[j]);
				rechtswert[j] = atof(ptr);
				ptr = strtok(NULL, delimiter2);
				sscanf(ptr,"%lf",&hochwert[j]);
				hochwert[j] = atof(ptr);
				Gauss_Geo(&laenge_geo, &breite_geo, rechtswert[j], hochwert[j]);
				j++;
			}
		}
		fclose( input );
	}
	
	while(a==0)	{
		printf("Wie sollen die Koordinaten ausgegeben werden?\n");
		printf("(A) : Zur Laufzeit\n");
		printf("(B) : In eine Textdatei\n");
		printf("(E) : Programm beenden.\n\n");
		printf("Wahl: ");
		fflush(stdin);
		scanf("%c",&ausgabe_geo);
		
		switch(toupper(ausgabe_geo)){
			case 'A':
				for (j=0;j<zeilenanzahl;j++)	{
					printf("Punkt %i:\tGeographische Laenge = %f\n", j+1,laenge_geo);
					printf("\t\tGeographische Breite = %f\n", breite_geo);
					NeueZeile;
				}			
				a=1;
			break;
			case 'B':
				neu = fopen("BerechneteKoordinaten.txt","w");
				if(neu != NULL)	{
					for(j=0;j<zeilenanzahl;j++)	{
						//Ausgabe_Datei(rechtswert,hochwert,neu);
					}
					printf("Datei BerechneteKoordinaten.txt erfolgreich erstellt.\n");
				}
				fclose(neu);
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n");
			break;
		}
	}
}

void Eingabe_Geokoord()	{ 
	short int a=0;
	
	while(a==0){
		printf("Wie sollen die Koordinaten uebergeben werden?\n\n");
		printf("(A) : Tastatureingabe\n");
		printf("(B) : ASCII-Datei\n");
		printf("(E) : Programm beenden.\n\n");
		printf("Wahl: ");
		fflush(stdin);
		scanf("%c",&uebergabe_geo);
		
		switch(toupper(uebergabe_geo)){
			case 'A':
				NeueZeile;
				Eingabe_Geo_Tastatur();
				a=1;
			break; 
			case 'B': 
				NeueZeile;
				Berechnung_aus_Datei_Geo();
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n");
			break;
		}	
	}
}


Eingabe_Geo_Tastatur()	{
	int anz_punkte_geo;
	
	printf("Wieviele Punkte werden eingegeben?\n\n");
	printf("Anzahl: ");
	scanf("%i",&anz_punkte_geo);
	NeueZeile;
	
	short int a=0;
	while (a==0)	{
		printf("Wie werden die Koordinaten eingegeben?\n\n");
		printf("(A) : hexagesimal\n");
		printf("(B) : dezimal\n");
		printf("(E) : Programm beenden.\n\n");
		printf("Wahl: ");
		fflush(stdin);
		scanf("%c",&geo_art_tast);
	
		switch (toupper(geo_art_tast))	{
			case 'A':
				NeueZeile;
				Eingabe_Geo_hexa(anz_punkte_geo);
				a=1;
			break;
			case 'B':
				NeueZeile;
				Eingabe_Geo_dezi(anz_punkte_geo);
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe\n");
			break;
		}
	}
}
	
Berechnung_aus_Datei_Geo()	{
	FILE *input;
    char inputLine[23];
	int anzahl=0,zeilenanzahl;
    double *speicher;
	short int a=0;
	double rechtswert[zeilenanzahl], hochwert[zeilenanzahl];
	double laenge_geo, breite_geo;
	char delimiter[] = " ";	// Leerzeichen ist Trennung
	char delimiter2[] = "\n";
	char *ptr;
	char string[250];
	int j=0;
	
	printf("Baustelle");
}

Eingabe_Geo_hexa(int anz_punkte_geo)	{
	int i=0;
	short int a=0;
	double hochwert, rechtswert;
	double laenge_hexa_grad[anz_punkte_geo-1], laenge_hexa_min[anz_punkte_geo-1], laenge_hexa_sek[anz_punkte_geo-1];
	double breite_hexa_grad[anz_punkte_geo-1], breite_hexa_min[anz_punkte_geo-1], breite_hexa_sek[anz_punkte_geo-1];
	double breite_geo[anz_punkte_geo-1], laenge_geo[anz_punkte_geo-1];
	FILE *neu;
	
	for (i=0; i<anz_punkte_geo; i++)	{	//Eingabe der Koordinaten in hexagesimal schreibweise. 
		gehe_zu_5:
		printf("Punkt %i: ", i+1);
		printf("\tGeographische Laenge: Grad: ");
		scanf("%lf",&laenge_hexa_grad[i]);
		
		printf("\t\t\t\t      Minute: ");
		scanf("%lf",&laenge_hexa_min[i]);
		
		
		printf("\t\t\t\t      Sekunde: ");
		scanf("%lf",&laenge_hexa_sek[i]);
		
		
		printf("\t\tGeographische Breite: Grad: ");
		scanf("%lf",&breite_hexa_grad[i]);
		
		
		printf("\t\t\t\t      Minute: ");
		scanf("%lf",&breite_hexa_min[i]);
		
		
		printf("\t\t\t\t      Sekunde: ");
		scanf("%lf",&breite_hexa_sek[i]);
	}
	
	for (i=0; i<anz_punkte_geo; i++)	{	//Berechnung der eingegeben Koordinaten in dezimale Koordinaten
		laenge_geo[i] = laenge_hexa_grad[i]+(laenge_hexa_min[i]/60)+(laenge_hexa_sek[i]/3600);
		breite_geo[i] = breite_hexa_grad[i]+(breite_hexa_min[i]/60)+(breite_hexa_sek[i]/3600);
		
		Geo_Gauss(&rechtswert, &hochwert, laenge_geo[i], breite_geo[i]);
	}
	
	NeueZeile;
	while(a==0)	{
	printf("Wie sollen die Koordinaten ausgegeben werden?\n");
	printf("(A) : Zur Laufzeit\n");
	printf("(B) : In einer Datei\n");
	printf("(E) : Programm beenden.\n\n");
	printf("WAhl: ");
	fflush(stdin);
	scanf("%c\n",&ausgabe_geo_art);
	
		switch(toupper(ausgabe_geo_art))	{
			case 'A':
				for (i=0; i<anz_punkte_geo; i++)	{	
					printf("Punkt %i:\tRechtswert = %.4f\n", i+1, rechtswert);
					printf("\t\tHochwert = %.4f\n", hochwert);
				}
				a=1;
			break;
			case 'B':
				neu = fopen("BerechneteKoordinaten.txt","w");
					if(neu != NULL)	{
						for(i=0;i<anz_punkte_geo;i++)	{
							Ausgabe_Datei(rechtswert,hochwert,neu);
						}
					}
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}
	
}

Eingabe_Geo_dezi(int anz_punkte_geo)	{
	double breite_geo[anz_punkte_geo-1], laenge_geo[anz_punkte_geo-1];
	double hochwert, rechtswert;
	int i=0;
	short int a=0;
	FILE *neu;
	
	for (i=0; i<anz_punkte_geo; i++)	{	//Eingabe in dezimal + Kontrolle
		printf("Punkt %i: ",i+1);
		printf("\tGeographische Laenge: ");
		scanf("%lf",&laenge_geo[i]);
		printf("\t\tGeographische Breite: ");
		scanf("%lf",&breite_geo[i]);
		
		Geo_Gauss(&rechtswert, &hochwert, laenge_geo[i], breite_geo[i]);
	}
	
	while(a==0)	{
	printf("Wie sollen die Koordinaten ausgegeben werden?\n");
	printf("(A) : Zur Laufzeit\n");
	printf("(B) : In einer Datei\n");
	printf("(E) : Programm beenden.\n\n");
	printf("Wahl: ");
	fflush(stdin);
	scanf("%c\n",&ausgabe_geo_dezi);
	NeueZeile;
	
		switch(toupper(ausgabe_geo_dezi))	{
			case 'A':
				for (i=0; i<anz_punkte_geo; i++)	{
					printf("Punkt %i:\tRechtswert = %.3f\n",i+1, rechtswert);
					printf("\t\tHochwert = %.4f\n", hochwert);
				}	
				a=1;
			break;
			case 'B':
				neu = fopen("BerechneteKoordinaten.txt","w");
				if(neu!=NULL)	{
					for (i=0; i<anz_punkte_geo; i++)	{
						Ausgabe_Datei(rechtswert,hochwert,neu);
					}
					printf("Datei BerechneteKoordinaten.txt erfolgreich erstellt.\n");
				}
				fclose(neu);
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}
}


void Eingabe_Gausskoord()	{
	short int a=0;
	
	while (a==0)	{
		printf("Wie sollen die Koordinaten uebergeben werden?\n\n");
		printf("(A) : ueber Tastatur\n");
		printf("(B) : ueber ASCII-Datei\n");
		printf("(E) : Programm beenden.\n\n");
		printf("Wahl: ");
		fflush(stdin);
		scanf("%c",&uebergabe_gauss);
		
		switch (toupper(uebergabe_gauss))	{
			case 'A':
				NeueZeile;
				Eingabe_Gauss_Tastatur();
				a=1;
			break;
			case 'B':
				NeueZeile;
				Berechnung_aus_Datei_Gauss();
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}	
}

Eingabe_Gauss_Tastatur()	{
	int i=0;
	short int a=0;
	long int anz_punkte_gauss;
	double breite_geo, laenge_geo;
	FILE *neu;
	
	printf("Wieviele Punkte werden eingegeben?\n\n");
	printf("Anzahl: ");
	scanf("%i",&anz_punkte_gauss);
	NeueZeile;
	
	double hochwert[anz_punkte_gauss-1], rechtswert[anz_punkte_gauss-1];
	
	for(i=0;i<anz_punkte_gauss;i++)	{
		printf("Punkt %i: ",i+1);
		printf("\tRechtswert = ");
		scanf("%lf",&rechtswert[i]);
		printf("\t\tHochwert = ");
		scanf("%lf",&hochwert[i]);
		Gauss_Geo(&laenge_geo, &breite_geo, rechtswert[i], hochwert[i]);
	}
	
	while(a==0)	{
	printf("Wie sollen die Koordinaten ausgegeben werden?\n");
	printf("(A) : Zur Laufzeit\n");
	printf("(B) : In einer Datei\n");
	printf("(E) : Programm beenden.\n\n");
	printf("Wahl: ");
	fflush(stdin);
	scanf("%c",&ausgabe_art);
	NeueZeile;
	
		switch(toupper(ausgabe_art))	{
			case 'A':
				for (i=0; i<anz_punkte_gauss; i++)	{
					printf("Punkt %i:\tGeographische Laenge = %.4f\n",i+1, laenge_geo);
					printf("\t\tGeographische Breite = %.4f\n", breite_geo);
				}	
				a=1;
			break;
			case 'B':
				neu = fopen("BerechneteKoordinaten.txt","w");
				if(neu!=NULL)	{
					for (i=0; i<anz_punkte_gauss; i++)	{
						Ausgabe_Datei(laenge_geo,breite_geo,neu);
					}
					printf("Datei BerechneteKoordinaten.txt erfolgreich erstellt.\n");
				}
				fclose(neu);
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}
	
}	

int main()	{
	short int a=0;
	
	while (a==0)	{
		printf("Bitte waehlen Sie eine Umrechnung aus: \n\n");
		printf("(A) : Geographische Koordinaten in Gauss-Krueger-Koordinaten\n");
		printf("(B) : Gauss-Krueger-Koordinaten in Geographische Koordinaten\n");
		printf("(E) : Programm beenden.\n\n");
		printf("Wahl: ");
		fflush(stdin);
		scanf("%c",&umrechnungsart);
		
		switch (toupper(umrechnungsart))	{
			case 'A':
				NeueZeile;
				Eingabe_Geokoord();		//Auswahl A wird weitergegeben an Eingabe_Geokoord
				a=1;
			break;
			case 'B':
				NeueZeile;
				Eingabe_Gausskoord();	//Auswahl B wird weitergegeben an Eingabe_Gausskoord
				a=2;
			break;
			case 'E':
				printf("Programm wurde beendet.");
				a=3;
			break;
			default:
				printf("Ungueltige Eingabe.\n\n");
			break;
		}
	}	
}

Wenn er in der switch-anweisung abstürzt, und man dann exit eingibt, dann gibt er das aus, was er ausgeben soll, aber nicht von alleine.
 
Dateiaufbau / Beispieldatei?
Und was gibst du ein, damit es zum Absturz kommt?

Wenn er in der switch-anweisung abstürzt, und man dann exit eingibt, dann gibt er das aus, was er ausgeben soll, aber nicht von alleine.
Und was bedeutet das?
 
Zurück