Stack Overflow mit struct
-
Hallo alle zusammen!
Ich habe mal wieder Probleme mit dem struct Befehl, der wie folgt aussieht:
struct d_Reservation { char Kunde[20]; short Anzahl; short BuchNummer; }; struct d_Vermietung { d_Reservation Datum[5][12][31][12]; }; struct d_Flugzeug { short Typ; char Name[10]; short Passagiere; d_Vermietung Vermietung; };
Dann deklariere ich ein Array:
d_Flugzeug Flugzeug[10];
Und bekomme ein Stack overflow!
Es liegt irgendwie an char Kunde[20]; unter d_Reservation!
Sobald ich das auskommentiere klappt alles ohne Probleme.
Hat einer vielleicht eine Idee?
-
Stackspeicher ist begrenzt. Lass dir doch mal sizeof(d_Flugzeug) ausgeben.
Du wirst dein Array wohl auf dem Heap anlegen müssen (malloc).
-
MFK schrieb:
Lass dir doch mal sizeof(d_Flugzeug) ausgeben.
*lol*
ich schätze mal ca. 1/2 MB
-
Das liegt an dem komischen...
struct d_Vermietung { d_Reservation Datum[5][12][31][12]; };
Das sind 5 * 12 * 31 * 12 d_Reservation-Elemente (jedes mit 24 Byte). Wenn Du Deinen Kunden da raus schmeisst, sind das 20 * 5 * 12 * 31 * 12 * Byte weniger.
Wieso stellt Du ein Datum (der Name impliziert zumindest, dass es ein Datum sein soll) mit einem vierdimensionalen Array dar?10 von Deinen Flugzeugen haben dann ca. 5 MByte. Funktionslokale Stacks haben per Default meist so 1-2 MByte. Kein Wunder, dass das knallt.
-
Ich hatte die Idee das Programm für einen Zeitraum für 5 jahre zu implementieren. Und ich hatte keine bessere Idee das umzusetzen. Gibts denn einen vordefinierten Typ oder ähnliches um das ganze Platzsparender zu machen?
Ich will einem bestimmten Flugzeug von den 10 genau ein Datum zuweisen wo der Kundenname, die Anzhl der Gäste und Reservierungsnummer drinstehen.
Ich hatte am Anfang per struct mal ein Datum kreiert konnte damit aber nicht eindeutig die Daten zuordnen.
-
^^ benutze für sowas ein DBMS, z.b. mySQL, berkeley-db oder was ähnliches.
-
resis schrieb:
Ich hatte die Idee das Programm für einen Zeitraum für 5 jahre zu implementieren. Und ich hatte keine bessere Idee das umzusetzen. Gibts denn einen vordefinierten Typ oder ähnliches um das ganze Platzsparender zu machen?
Ich will einem bestimmten Flugzeug von den 10 genau ein Datum zuweisen wo der Kundenname, die Anzhl der Gäste und Reservierungsnummer drinstehen.
Ich hatte am Anfang per struct mal ein Datum kreiert konnte damit aber nicht eindeutig die Daten zuordnen.
Ich würde einen Datumstypen benutzen und den in die Reservierung mit hinein packen.
struct data { int year; int month; int day; //haben die Reservierungen keine Uhrzeit? }
Oder alternativ vielleicht tm aus der time.h.
Und dann vielleicht nur Reservierungen für Tage anlegen, wo auch wirklich welche benötigt werden.
-
jo...die Idee hatte ich auch schon, aber es sollen alle Tage benutzt werden und ich kann somit keine Tage ausschließen.
struct d_Datum { short Jahr; short Monat; short Tag; short Stunde[12]; //Buchung soll von 08:00 bis 20:00 möglich sein }; struct d_Reservation { int ResNr; short Anzahl; char Kunde[20]; d_datum Datum; }; struct d_Flugzeug { short Typ; char Name[10]; short Passagiere; d_Reservation Vermietung; };
Das Problem hier ist, dass ich die Buchung nicht eindeutig zuordnen kann. Das ist ja mein Hauptproblem! Oder liegt hier mein Denkfehler?
Danke noch mal für eure Hilfen.
-
Das kann man mit einer Suche lösen, mit der man nach bestimmten Daten/Uhrzeiten oder auch anderen Kriterien suchen kann.
-
Aber ist es jetzt nicht so, dass ich nur einen Termin pro Flugzeug speichern kann?
-
resis schrieb:
short Stunde[12]; //Buchung soll von 08:00 bis 20:00 möglich sein
wtf? bitte erklär mal mit deinen eigenen worten, was diese zeile bewirken soll.
weißt du was arrays sind?
-
Hallo resis,
wie eigentlich schon "ansiC bad ass" geschrieben hat, verwendet man für
solche Sachen eher eine Datenbank.Wenn du es aber trotzdem so machen möchtest, kannst du mit malloc()
Speicher auf dem Heap anlegen, welcher im Wesentlichen durch deinen
Hauptspeicher begrenzt wird. (dies hat dir schon MFK geschrieben)resis schrieb:
Dann deklariere ich ein Array:
d_Flugzeug Flugzeug[10];
Verwende an Stelle von s.o. folgendes:
int main(void) { d_Flugzeug *Flugzeug = malloc(10*sizeof(d_Flugzeug)); ... free(Flugzeug); }
Gruß mcr
-
@dr. strange
Ich habe da ein Array genommen, weil ja das Flugzeug nicht den ganzen Tag gebucht werden muss, sondern auch nur für eine Stunde. daher wollte ich in diesem Array hinterlegen, ob es frei oder bereits belegt ist für einen eingegebenen Zeitraum.Also sprich ne 0 heißt frei und ne 1 heißt belegt. Das war so mein Gedanke.
@mcr
hab mich die ganze Zeit über malloc belesen..also habs nicht vergessen
Werde das mal so probieren. Danke auf jeden Fall!
-
resis schrieb:
Aber ist es jetzt nicht so, dass ich nur einen Termin pro Flugzeug speichern kann?
Weiss ich nicht. Mir ist schließlich nicht klar, was Du schlussendlich willst.
Ich kann es nur mutmaßen:
Du willst eine Art Reservierungssystem für Flugtickets aufbauen.
Ich weiss natürlich nicht, was für Flugzeuge das sein sollen, aber in der Regel kann da mehr als eine Person pro Flug teilnehmen.Vielleicht so:
typedef enum { jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec }month_t; typedef unsigned int time_number_t; typedef struct date_t { time_number_t year; month_t month; time_number_t day; }; typedef struct time_t { time_number_t hour; time_number_t minute; }; typedef char name_t[50]; typedef struct reservierung_t { unsigned int reservation_nr; date_t embarkation_day; time_t embarkation_time; name_t surname; name_t forename; //zeugs das noch noetig ist, z.B. Klasse, vllt. Flugnummer usw. };
Dann evtl. einen eigenen Typen für Flüge und Funktionalität, die Flüge und reservierungen in Beziehung zueinander setzt.
Möglichkeiten zum Suchen nach bestimmten Kriterien (Namen, Flugnummern, Reservierungsnummern etc.) sollte auch gegeben sein.
-
Danke @all
Mit malloc() hat jetzt das geklappt was ich machen wollte. Ist zwar sehr unsauber und Speicherlastig, aber vorerst werd ich mich damit zufrieden geben!