EXE aus (veraltetem?) C++ Code erstellen
-
Hallo allerseits.
Ich habe eigentlich nichts mit C++ zu tun, programmiere eigentlich nur in Java, und entschuldige mich, falls ich mein Thema im falschen Abteil erstellt habe.
Derzeit schreibe ich in Java ein Programm mit dem man Curriculum basierte Stundenpläne erstellen und optimieren kann. Vor 2 Tagen habe ich angefangen, mein Programm für eine neue Probleminstanz anzupassen. Normalerweise ist für eine Probleminstanz immer eine ausführbare EXE-Datei dabei, die den erstellten Stundenplan bewertet. Dieser dient nur zur Überprüfung, ob das eigene Bewertungssystem funktioniert (Abgleich).
Lange Rede kurzer Sinn. Für meine neue Probleminstanz ist keine ausführbare EXE-Datei, sondern nur folgender Code aus der Datei checksln.cpp dabei:
#include <stdio.h> #include <iostream.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <fstream.h> #include <string.h> main(int argc, char * argv[]) { int norooms,nostudents, noevents; int nofeatures; bool * * roomfeatures; bool * * eventfeatures; int * roomsizes; int * eventrooms; int * eventslots; bool * * attends; //attends[event][student] bool * * studentavailability; //studentavailability[slot][student] int * eventtypes; char filename[100]; char timfilename[100]; char slnfilename[100]; if(argc!=2){cout<<"Usage: checksln filename"<<endl;cout<<"Press return to continue"<<endl; char key; cin.get(key);exit(0);} sscanf(argv[1],"%s",&filename); int len = strlen(filename); strcpy(timfilename,filename) ; timfilename[len]='.'; timfilename[len+1]='t'; timfilename[len+2]='i'; timfilename[len+3]='m'; timfilename[len+4]='\0'; strcpy(slnfilename,filename) ; slnfilename[len]='.'; slnfilename[len+1]='s'; slnfilename[len+2]='l'; slnfilename[len+3]='n'; slnfilename[len+4]='\0'; ifstream tim; tim.open(timfilename); if (!tim ) { cout<< "Couldn't open the file "<<timfilename<<endl; cout<<"Press return to continue"<<endl; char key; cin.get(key); exit(1); } tim>>noevents; tim>>norooms; tim>>nofeatures; tim>>nostudents; roomsizes = new int[norooms]; eventrooms = new int[noevents]; eventslots = new int[noevents]; eventtypes = new int[noevents]; roomfeatures = new bool*[norooms] ; for(int i=0;i<norooms;i++) roomfeatures[i] = new bool[nofeatures]; eventfeatures = new bool*[noevents] ; for(int i=0;i<noevents;i++) eventfeatures[i] = new bool[nofeatures]; attends = new bool *[noevents]; for(int t=0;t<noevents;t++)attends[t] = new bool [nostudents]; studentavailability = new bool *[45]; for(int i=0;i<45;i++) studentavailability[i]=new bool[nostudents]; for(int i=0;i<norooms;i++)tim>>roomsizes[i]; for(int i=0;i<nostudents;i++)for(int j=0;j<noevents;j++)tim>>attends[j][i]; for(int i=0;i<norooms;i++)for(int j=0;j<nofeatures;j++)tim>>roomfeatures[i][j]; for(int i=0;i<noevents;i++)for(int j=0;j<nofeatures;j++)tim>>eventfeatures[i][j]; tim.close(); ifstream sln; sln.open(slnfilename); if (!sln) { cout<< "Couldn't open the file "<<slnfilename<<endl; cout<<"Press return to continue"<<endl; char key; cin.get(key); exit(1); } long unplaced=0; long endofday=0; for(int i=0;i<noevents;i++) { sln>>eventslots[i]>>eventrooms[i]; if ((eventslots[i])== -1)cout<<"Event "<<i<<" does not have a timeslot assigned"<<endl; if ((eventrooms[i])== -1)cout<<"Event "<<i<<" does not have a room assigned"<<endl; if (((eventrooms[i])== -1)|| ((eventrooms[i])== -1)) unplaced++ ; } sln.close(); long unsuitablerooms=0; for(int e=0;e<noevents;e++) { int size =0; bool badroom=false; for(int g=0;g<nostudents;g++)if(attends[e][g])size++; if((eventrooms[e]!=-1)&& (roomsizes[eventrooms[e]]<size)) { cout<<"Event "<<e<<" requires a room of size "<<size<<endl; cout<<"It has been assigned a room ("<<eventrooms[e]<<") of size "<<roomsizes[eventrooms[e]]<<endl; badroom=true; } for(int f=0;f<nofeatures;f++) if((eventrooms[e]!=-1)&&eventfeatures[e][f]&&!roomfeatures[eventrooms[e]][f]) { cout<<"Event "<<e<<" requires feature "<<f<<endl; cout<<"It has been assigned a room ("<<eventrooms[e]<<") without feature "<<f<<endl; badroom=true; } if(badroom)unsuitablerooms++; } long studentclashes=0; long roomclashes=0; for(int i=0;i<nostudents;i++)for(int e=0;e<45;e++)studentavailability[e][i]=true; for(int g = 0; g<nostudents;g++) for(int e=0;e<noevents;e++) { for(int f=0;f<e;f++) if((eventslots[e]!=-1) &&(eventslots[f]!=-1) &&attends[e][g] &&attends[f][g] &&eventslots[e]==eventslots[f]) { cout <<"Student "<<g<<" has to attend both event "<<e<<" and event "<<f<<" in slot "<< eventslots[e]<<endl; studentclashes++; } if((eventslots[e]!=-1)&&attends[e][g])studentavailability[eventslots[e]][g]=false; } for(int e=0;e<noevents;e++) for(int f=0;f<e;f++) if((eventslots[e]!=-1) &&(eventslots[f]!=-1) &&(eventrooms[e]!=-1) &&(eventrooms[f]!=-1) &&(eventslots[e]==eventslots[f]) &&(eventrooms[e]==eventrooms[f])) { cout <<"Events "<<e<<" and event "<<f<<" both occur in slot "<< eventslots[e]<<" and room "<<eventrooms[e]<<endl; roomclashes++; } cout<<endl<<endl<<"Number of unplaced events ="<<unplaced<<endl; cout <<"Number of unsuitable rooms = "<<unsuitablerooms<<endl; cout <<"Number of student clashes = "<<studentclashes<<endl; cout <<"Number of room clashes = "<<roomclashes<<endl<<endl; long longintensive=0; for(int g=0;g<nostudents;g++) { for(int d=0;d<5;d++) { int count=0; for(int t=0;t<9;t++) { int slot=d*9+t; if(studentavailability[slot][g]==false)count++; else count=0; if(count>=3) { cout <<"Student "<<g<<" has a set of three events up to slot "<<slot<<endl; longintensive++; } } } } cout<<endl<<endl; long single=0; for(int g=0;g<nostudents;g++) { for(int d=0;d<5;d++) { int count=0; int badslot=-1; for(int t=0;t<9;t++) { int slot=d*9+t; if(studentavailability[slot][g]==false) { count++; badslot=slot; } } if(count==1) { cout <<"Student "<<g<<" has an event in slot "<<badslot<<" which is the only one on that day"<<endl; single++; } } } for(int g=0;g<nostudents;g++) { if(studentavailability[8][g]==false) { cout<<"Student "<<g<<" has an event in slot 8 which is at the end of a day"<<endl; endofday++; } if(studentavailability[17][g]==false) { cout<<"Student "<<g<<" has an event in slot 17 which is at the end of a day"<<endl; endofday++; } if(studentavailability[26][g]==false) { cout<<"Student "<<g<<" has an event in slot 26 which is at the end of a day"<<endl; endofday++; } if(studentavailability[35][g]==false) { cout<<"Student "<<g<<" has an event in slot 35 which is at the end of a day"<<endl; endofday++; } if(studentavailability[44][g]==false) { cout<<"Student "<<g<<" has an event in slot 44 which is at the end of a day"<<endl; endofday++; } } cout <<endl<<"Penalty for students having three or more events in a row = "<<longintensive<<endl; cout <<"Penalty for students having single events on a day = "<<single<<endl; cout <<"Penalty for students having end of day events = "<<endofday<<endl; cout<<endl<<"TOTAL PENALTY = "<<(longintensive+single+endofday)<<endl<<endl; if (unplaced+unsuitablerooms+studentclashes+roomclashes)cout<<"This solution file does not give a complete and feasible timetable"<<endl; else cout<<"This solution file gives a complete and feasible timetable"<<endl; delete [] roomsizes; delete [] eventrooms; delete [] eventslots; for(int t=0;t<noevents;t++)delete[]attends[t]; delete [] attends; for(int i=0;i<45;i++)delete []studentavailability[i]; delete [] studentavailability; delete []eventtypes; for(int i=0;i<nofeatures;i++)delete []roomfeatures[i]; delete []roomfeatures; for(int i=0;i<nofeatures;i++)delete []eventfeatures[i]; delete []eventfeatures; cout<<"Press return to continue"<<endl; char key; cin.get(key); }Ich bräuchte also eine ausführbare EXE-Datei dieses Codes. Ich habe mir heute Mittag Bloodshed Dev-C++ geholt und installiert. Der Code kann soweit auch kompiliert und eine EXE-Datei erstellt werden, jedoch funktioniert die EXE-Datei insofern nicht, dass sie als Fehler ausgibt, die 2 benötigten Input-Dateien würden fehlen. Diese liegen aber im selben Ordner wie die EXE-Datei (laut Quelle soll es so auch sein). Und die 2 Inputdateien haben auch die benötigte Bezeichnung filename.tim und filename.sln.
Beim Kompilieren werden (wenn ich das richtig erkannt habe), folgende Warnungen ausgegeben:
-C:\Dev-Cpp\include\c++\3.4.2\backward\iostream.h:31
-#warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.Der Code selbst ist sicherlich korrekt, und Fehlerfrei (Logik).. Nur denke ich dass er (Syntax) veraltet ist, und die heutigen Kompiler damit nicht klar kommen (meine wage Vermutung), aber ihr wisst das besser.
Der Code stammt laut Quelle aus 2002. Und beim Googlen nach der Warnmeldung, habe gelesen, dass die Libraries oben veraltet seien, und es deshalb zu Fehlern kommen könnte.Ich hoffe ihr könnt mir helfen das zum laufen zu bekommen.
-
Die Dateien müssen im Arbeitsverzeichnis liegen, nicht notwendigerweise im selben Verzeichnis wie die .exe.
Ich weiß jetzt nicht, wie du das Programm aufrufst, aber es klingt für mich so, als sei das beim Erstellen einer Verknüpfung oder so schiefgegangen.
-
Ich ruf die EXE direkt auf (Doppelklick). Und die liegt im selben Ordner wie meine 2 Input-Dateien.
-
Also ab hier will das Programm nicht mehr (siehe Quellcode oben zeile 28-30):
if(argc!=2){cout<<"Usage: checksln filename"<<endl;cout<<"Press return to continue"<<endl; char key; cin.get(key);exit(0);}Wie wenn beide Input Files nicht vorhanden wären.
-
Ah. In dem Fall ist das kein Wunder - das Programm erwartet den gemeinsamen Teil des Dateinamens als ersten Parameter. So, wie es das ja auch ausgibt.
-
Ich weiß nicht ob das funktioniert, aber wenn ich den Code richtig verstehe, dann klick mal die Datei, die er nicht findet rechts an und öffne sie über "öffnen mit" mit dieser .exe .
mfG
-
@Magellan
Hm jetzt sagt er "Couldn't open the file" wie im Quellcode Zeile 56... Dateien sind aber korrekt.Das steht noch in der Quelle drin:
The program takes a command line parameter, the name of the file to check: filename.
It expects to find in the current directory a problem file called filename.tim and a solution file filename.sln, produced by your algorithm in the format described in the Output Format section.
-
Demnach müsste es also funktionieren, wenn du in der Commandline den Pfad der Exe und nach einem Leerzeichen den Pfad der .tim / .sln Datei ohne die Endung eingibst.
Probier das bitte mal aus.
Wenn in einem der Pfade Leerzeichen sind musst du sie in Anführungszeichen schreiben.Wieder natürlich nur, wenn ich es diesmal verstanden habe ;).
Viel Glück
-
Pfad der EXE: c:\val\checksln.exe
Pfad der Problemdatei: c:\val\problem.tim
Pfad der Lösungsdatei: c:\val\solution.slnIch habe probiert:
c:\val\checksln.exe c:\val\problem c:\val\solution
bringt Fehler: Aus Zeile 28Wenn ich nur eine der Dateien angebe
bringt Fehler: Aus Zeile 56
-
Ok, wenn ichs richtig verstanden hab, dann müssen problem und solution gleich heißen, sich also nur in der Dateiendung unterscheiden.
Dann musst du nur eine übergeben, also z.B. nennst du beide problem_solution.tim bzw. .sln
dann rufst du auf:c:\val\checksln.exe c:\val\problem_solution
das müsste dann gehen

-
Ich glaube du liegst völlig richtig, sobald ich das ausführe arbeitet der PC kurz, dann aber kommt "checksln.exe hat ein Problem festgestellt und muss beendet werden"...
Ich mach mal einen Neustart und probiere es wieder. Bin gleich zurück...
-
Gut, sollte es dann weiterhin abstürzen, dann sind entweder deine .sln und .tim Dateien falsch aufgebaut, oder in diesen knapp 300 Codezeilen steckt irgendwo ein Fehler...
Ich schätze ja auf das erste, aber ich weiß es leider nicht...
Viel Glück noch!
-
Ich werde alles nochmal überprüfen.
Vielen Dank für dein Hilfe...
-
OK es hat funktioniert, du hattest mit deinem letzten Ansatz vollkommen Recht. Das Problem lag an einem der Input Files, dort waren statt Leerzeichen Kommas als Trennzeichen, aber wenn man ließt:
For each event, in the order of the problem file, one per line:
The timeslot number, the room number.
The timeslot number is an integer between 0 and 44 representing the timeslots allocated to the event.
Versteht man doch eher "12,45" als "12 45"... Naja DANKE nochmal für die Hilfe!
-
Kein Problem.
