Laurana Geschrieben 26. Mai 2006 Geschrieben 26. Mai 2006 Hi Leutz. Seid bitte gnädig mit mir, ich arbeite noch nicht besonders lang mit C++ und muss noch ne Menge lernen *g*. Folgendes Problem: In einem größeren Programmierprojekt von der Schule aus, müssen wir mit Modulen arbeiten. Im Anschluss werde ich den DL-Link für alle cpp und die DATA bereitstellen, denn ich weiß nicht recht, ob man durch meinen wirren Text durchsteigt, wenn ich euch nur einen Bruchteil des Quelltextes zeigen kann. Zum Problem: In meiner Funktion liegt ein Array, in dessen Bereichen die Bezeichnungen von Flugzeugnummern ( in dem Fall 1-5 ) gespeichert werden sollen, sobald für diese Flieger keine Einträge vorherrschen zu bestimmten Tagen/Uhrzeiten. die Tageingabe erfolgt von 1-10 Stunden von 08:00 bis 20:00 und Flugzeugtypen gibt es von 1 bis 3. : 09.- In der Data bezeichnet die erste Zahl die gesamte Anzahl aller gespeicherten FLieger, danach kommt die erste Flugzeugnummer, darauf folgt der Typ und dann die Eintragungen der Kundennamen, wenn jemand das Flugzeug gebucht hat ( jaaaa, alles sehr wirr, ich weiß ^^ ) Wenn ich nun testweise eingebe Tag: 4, Uhrzeit: 09:00 bis 13:00 Typ 3 gibt er mir korrekterweise bei "Array" die Flugzeugnummer 2 aus, nebenher aber noch zweimal "Array: 32" ... irgendwas läuft ganz gewaltig schief und ich hänge seit 3 Tagen über dem Quellcode, um mittlerweile nichts mehr zu erkennen als sinnlos aneinander gereihte Buchstaben :eek :eek :eek ( Ich muss dazu sagen, ich überprüfe gerade erstmal die erste If-Anweisung in der Funktion, die anderen sind noch nicht getestet und vermutlich genauso mordsfalsch ^^ ) Ich bete das jemand die Muse findet um mal drüber zu schauen und vll. durchzusteigen. Immerhin hängt meine dämliche Zensur dran und ich hab nen Zustand der mittelschweren Verzweiflung erreicht *g*. Danke an alle, die so lieb sind :uli MfG Tina http://rapidshare.de/files/21419342/Abfrage_Test.zip.html Zitieren
carstenj Geschrieben 26. Mai 2006 Geschrieben 26. Mai 2006 Hi, warum postest du den Quellcode nicht einfach hier? Zitieren
Laurana Geschrieben 26. Mai 2006 Autor Geschrieben 26. Mai 2006 Weil es halt alles sehr komplex ist und ich nicht genau weiß, wo der Fehler steckt. ich versuche es mal zu raffen, allerdings könnte dann niemand wirklich prüfen, denn die Eingabe fehlt in dem Fall. #include <iostream> #include "my_func.h" #include <conio.h> using namespace std; void abfrage(tflugzeug *pInventar, int Anzahl, int Tag, int Typ, int Stunde_eingang, int Stunde_ausgang, int *array_frei, int *Anzahl_frei) // Übergabe mit Pointer direkt auf den Speicher des Arrays (wird in Main angelegt) { int t, s_e=0, i, z, fs; bool belegt=false; /*-------------------------------------------------------------------*/ if (Tag !='0' && Stunde_eingang !='0' && Typ !='0') { t=Tag; cout << "Stelle 1: "<<*Anzahl_frei << endl; for(z=0; z<Anzahl; z++) { cout << "Flugzeugtyp: " << pInventar[z].FzTyp<<endl; cout << "Typ: " << Typ << endl; fs=0; belegt=false; if (pInventar[z].FzTyp == Typ) { for (s_e=Stunde_eingang; s_e<=Stunde_ausgang; s_e++) { if (pInventar[z].Kalender[t][s_e][0]!='0') belegt=true; } if (!belegt) { array_frei[*Anzahl_frei]=pInventar[z].FzNr; *Anzahl_frei++; } } cout <<"Stelle 2: " <<*Anzahl_frei << endl; } } for (i=0;i<*Anzahl_frei;i++) { cout <<"Array: "<<array_frei << endl; } } Das ist der Ausschnitt aus der Funktion. Hier die variablendeklarationen aus der main. tflugzeug* pInventar; int Anzahl=anzahl(); pInventar = new tflugzeug[Anzahl]; char temp[21]; int stunde_start, stunde_end, tag, typ, anzahl_frei=0; int *array_frei; array_frei = new int[Anzahl]; und das struct aus der Header: struct tflugzeug { int FzTyp; int FzNr; char Kalender[10][12][21]; }; Wenn jemand was damit anfangen kann, wäre ich super happy :beagolisc Zitieren
Guybrush Threepwood Geschrieben 26. Mai 2006 Geschrieben 26. Mai 2006 Joa ziemlich wirr alles Hast du dir das ganze mal im Debugger Schritt für Schritt angeguckt? Damit lassen sich solche Fehler eigentlich sehr schnell finden. Zitieren
maverick82 Geschrieben 26. Mai 2006 Geschrieben 26. Mai 2006 void abfrage(tflugzeug *pInventar, int Anzahl, int Tag, int Typ, int Stunde_eingang, int Stunde_ausgang, int *array_frei, int *Anzahl_frei) [...] if (Tag !='0' && Stunde_eingang !='0' && Typ !='0') [...] Die Schleife dürfte nie abgearbeitet werden. Habe es gerade mit dem Borland C-Builder 4 getestet. Tag, Stunde_eingang und Typ sind vom Typ Integer. Du vergleichst aber auf den Datentyp Char. Richtig wäre also: if (Tag !=0 && Stunde_eingang !=0 && Typ !=0) Teste es einfach mal mit einer Ausgabe (echo) innerhalb der Schleife aus. Kleiner Hinweis zum Umgang mit Arrays: Arrays werden in C ab 0 beginnend indiziert. Wenn also ein Array[10] angelegt wurde, erreicht man das erste Element mit Array[0] und das 10. mit Array[9]. Zitieren
GrEnE Geschrieben 26. Mai 2006 Geschrieben 26. Mai 2006 Wenn ich nun testweise eingebe Tag: 4, Uhrzeit: 09:00 bis 13:00 Typ 3 gibt er mir korrekterweise bei "Array" die Flugzeugnummer 2 aus, nebenher aber noch zweimal "Array: 32" ... Eventuell stellt du den Quellbeispiel-Code formatiert hierrein, dass liest sich leichter ... dazu kannst du die PHP-Tags benutzen. Mein Versuch den Code auseinander zunehmen ergab: void abfrage(tflugzeug *pInventar, int Anzahl, int Tag, int Typ, int Stunde_eingang, int Stunde_ausgang, int *array_frei, int *Anzahl_frei) // Übergabe mit Pointer direkt auf den Speicher des Arrays (wird in Main angelegt) { int t, s_e=0, i, z, fs; bool belegt=false; /*-------------------------------------------------------------------*/ if (Tag !='0' && Stunde_eingang !='0' && Typ !='0') { t=Tag; cout << "Stelle 1: "<<*Anzahl_frei << endl; for(z=0; z<Anzahl; z++) { cout << "Flugzeugtyp: " << pInventar[z].FzTyp<<endl; cout << "Typ: " << Typ << endl; fs=0; belegt=false; if (pInventar[z].FzTyp == Typ) { for (s_e=Stunde_eingang; s_e<=Stunde_ausgang; s_e++) { if (pInventar[z].Kalender[t][s_e][0]!='0') belegt=true; } if (!belegt) { array_frei[*Anzahl_frei]=pInventar[z].FzNr; *Anzahl_frei++; } } cout <<"Stelle 2: " <<*Anzahl_frei << endl; } } for (i=0;i<*Anzahl_frei;i++) { cout <<"Array: "<<array_frei[i] << endl; } }[/PHP] Stimmt der mit deinem Überein? Zitieren
Laurana Geschrieben 26. Mai 2006 Autor Geschrieben 26. Mai 2006 Japp, stimmt so. Habe selbst was zum Code darstellen gesucht, aber den Button nicht gefunden. Naja, nu seh ich ihn Wie auch immer, die Schleife wird abgearbeitet, immerhin geh er ja rein. Dazu sind die ganzen cout's da, um ne Ausgabekontrolle zu haben ( Problem ist, unsere Gruppe muss DevCPP nutzen und wir sind alle noch nicht wirklich fit mit dieser Oberfläche ). Irgendwo in einer der Schleifen oder in der Speicherbelegung muss der Fehler liegen, die Frage ist jetzt nur: Wo? :beagolisc Zitieren
Guybrush Threepwood Geschrieben 26. Mai 2006 Geschrieben 26. Mai 2006 Trotzdem stimmt das was maverick82 geschrieben hat. Tag !='0' wäre das Selbe wie Tag !=48 weil 48 der Asciicode des Zeichens 0 ist. Ansonsten wäre es gut wenn du einfach mal schreibst was ausgegeben wird und was ausgegeben werdne soll damit man sich davon ein Bild machen kann ohne das Programm runterladen zu müssen PS: von devcpp würde ich komplett abraten weil das sehr viele Macken hat. Das Problem wird aber denke ich nichtsdamit zu tub haben Zitieren
Laurana Geschrieben 27. Mai 2006 Autor Geschrieben 27. Mai 2006 Ich überprüfe das nochmal. Also, wie erklär ich nun am Besten, was ausgegeben werden soll ^^. Ich werde dabei die couts, bis auf das Letzte ignorieren, denn die sind, wie schon erwähnt nur zur Überprüfung ( ich befürchte fast DevCPP hat nichtmal nen debug mode. ) In der main.cpp findet die Eingabe statt. Ermittelt werden der gewünschte tag des Anwenders ( Tag 1-10 ), der gewünschte Flugzeugtyp ( 1-3 ) und die Stunden, in denen geschaut werden soll, ob ein Flugzeug des gewünschten Types frei ist. ( das sind zwölf Stunden --> 1-12 ). Anzahl gibt hierbei an, wieviele Flugzeuge es überhaupt gibt ( in unserem Fall 5 Stück ). Anzahl_frei ist zu Beginn auf Null gesetzt, und zwar ebenfalls in der main.cpp,. pInventar ist vom Struct tflugzeug ( die Deklaration findet ihr in meinem zweiten Post nochmal ), in dem sich unter anderem ein mehrdimensionales Array befindet ( der Kalender, in dem in folgender Reihenfolge gespeichert wird: pInventar.Kalender[Tag][stunde][Kundenname] ) Array_frei hat zu beginn noch keine feste Größe. Es ist dynamisch und erhält soviele Speicherplätze, wie Anzahl_frei am Ende groß sein wird. Dort werden die Flugzeugnummern ( pInventar.FzNr ) gespeichert von den Flugzeugen, die im gewünschten zeitraum noch nicht gebucht sind. DAS ist dann auch die letztendliche Ausgabe: das array_frei, das max. so groß sein kann wie Anzahl ( aller Flieger ). Ausgegeben werden Zahlen von 1-5, da wir die FLugzeugnummern eben nur so gestaltet haben. Verglichen wird der Eintrag. Wir haben unsere Data so gestaltet, dass überall, wo keine Buchung getätigt wurde, eine Null drin steht. Ansonsten steht in der Data der Name des Kunden. Sprich man muss nur vergleichen, ob eben die erste Stelle eine Null ist, oder nicht. Wenn ja, is das Flugzeug in der Stundefrei, wenn nicht, dann nicht Die Stunden sind im Array von 0 bis 12 gespeichert, auf der Oberfläche wird dann halt 08:00 bis 20:00 angegeben, aber mit den einzelnen Werten rechnet es sich besser . Stunde_eingang ist im Kalenderarray unter Stunde gespeichert, Stunde_ausgang gibt lediglich den Grenzwert an, bis wohin gezählt werden soll. Beispiel: Tag 4 von 12:00 ( also Wert 4 ) bis 16:00 ( also Wert 8 ) Typ 1 ( ich weiß es aus dem kopf: Flugzeugnummer 3 und 4 sind von dem Typ ) Beim letzten cout vom array_frei soll er dann jeweils also 3 und beim zweiten schleifendurchlauf 4 ausgeben ( die Werte werden später, wenn alles funzt eh an die main übergeben. die Ausgabe ist auch hier nur behelfsmässig ) Das ist "alles". Zitieren
pit030771 Geschrieben 2. Juni 2006 Geschrieben 2. Juni 2006 if (pInventar[z].FzTyp == Typ) { for (s_e=Stunde_eingang; s_e<=Stunde_ausgang; s_e++) { if (pInventar[z].Kalender[t][s_e][0]!='0') belegt=true; } if (!belegt) { array_frei[*Anzahl_frei]=pInventar[z].FzNr; *Anzahl_frei++; } fehlt bei der ersten if abfrage nicht der else zeig der belegt wieder auf false setzt? was ist denn wenn s_e=1 ist und der fall an der stelle ist wahr, dann ist belegt=true so jetzt beim zweiten schlefen durchlauf wenn s_e=2(oder welcher wert auch immer) und der fall trifft nicht mehr zu, also ist falsch, dann bleibt belgt doch true. und die zweite abfrage sollte doch auch besser in der schleife sein, sonst wird array_frei doch nicht belegt zu der bestimmten stunde. oder hab ich da was falsch verstanden? :confused: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.