JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Καλησπέρα παίδες, Έχω μερικά αρχεία .cpp που έχουν δημιουργηθεί αυτόνομα και το καθένα κάνει διαφορετικά πράγματα.. Θα ήθελα να μάθω πως μπορώ να δημιουργήσω ένα καινούργιο αρχείο .cpp μέσα στο οποίο θα δημιουργήσω ένα μενού το οποίο ανάλογα με την επιλογή θα τρέχει το ανάλογο .cpp από τα παραπάνω.. Κοινώς πώς συνδέω όλα τα αρχεία μαζί σε ένα ενιαίο project, έχοντας τελικά μόνο ένα εκτελέσιμο αρχείο? Thanks για κάθε βοήθεια!
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Κάτσε λίγο, τον επί μέρους κώδικα λες ότι τον έχεις έτοιμο. Η ερώτηση είναι πως μπορείς σε ένα πρόγραμμα C++ να υλοποιήσεις μενού επιλογών; Μπερδεύτηκα! Δε μπορείς στα επί μέρους cpp να μετονομάσεις τη συνάρτηση main π.χ. σε menu1, menu2,... αντίστοιχα και να κάνεις copy-paste τον κώδικα στο νέο σου πρόγραμμα;
JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Μέλος Δημοσ. 6 Φεβρουαρίου 2007 Όντως δεν τα εξήγησα και πολύ καλα! Καταρχάς τα .cpp τρέχουν σε console mode..Είναι αυτόνομα προγραμματα που κάνουν διαφορετικές εργασίες...Εκτός από την main το κάθε αρχείο έχει και πολλές συναρτήσεις.. Θα ήταν απλό να ενώσω όλα τα αρχεία σε ένα όπως μου προτείνεις (με αποτέλεσμα να ψιλοχαθώ λίγο από τις πολλές συναρτήσεις) αλλά θα ήθελα να μάθω αν υπάρχει τρόπος σε ένα καινούργιο αρχείο .cpp με μία switch για παράδειγμα ανάλογα με την επιλογή που θα δίνει ο χρήστης να τρέχει το ανάλογο αρχείο και αφού τελειώσει την εκτέλεση να επιστρέφει πάλι στο μενού...
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Δεν είναι ανάγκη να ενώσεις όλα τα αρχεία σε ένα. Μπορείς όπως σου είπα να μετονομάσεις την κάθε main σε κάποιο custom όνομα συνάρτησης και στο κυρίως αρχείο θα κάνεις include τα επι μέρους cpp αρχεία. Αν πάλι δεν το θες έτσι, μπορείς να κάνεις το εξής: για το κάθε αυτόνομο πρόγραμμα παράγεις το αντίστοιχο εκτελέσιμο. Στο πρόγραμμα-μενού, θα βάλεις την κατάλληλη switch, και κάθε case θα καλεί το αντίστοιχο υποπρόγραμμα ως εξωτερικό εκτελέσιμο με την system: http://cplusplus.com/reference/clibrary/cstdlib/system.html Μειονέκτημα αυτής της μεθόδου: Για να έχεις μεταφερσιμότητα σε άλλο λειτουργικό σύστημα, πρέπει κάθε φορά να κάνεις build τα ξεχωριστά υπο-προγράμματα...
JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Μέλος Δημοσ. 6 Φεβρουαρίου 2007 Ευχαριστώ για την βοήθεια Προτίμησα την πρώτη μέθοδο όμως έχω ένα προβληματάκι..Αν αλλάξω όνομα στην main ενός αρχείου .cpp αυτομάτως στο compile παίρνω μηνύματα λάθους μιας και δεν υπάρχει πια main()..Τι πρέπει να κάνω?
Επισκέπτης Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Poio compiler xrhsimopoieis? Me gcc gia paradeigma an exeis 3 arxeia C++, px first.cpp (contains main), second.cpp kai third.cpp kai 8eleis na ta "enoseis" (diladd na mporeis apo ena arxeio na kaleseis sunarthseis/antikeimena pou exei to allo) 8a prepei na trekseis ton compiler me thn entolh: g++ first.cpp second.cpp third.cpp -o myprog auto 8a dhmiourghsei ena ektelesimo arxeio myprog
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Μπορείς να παραθέσεις τον αντίστοιχο κώδικα; Υποπτεύομαι ότι δεν έκανες παντού τις απαιτούμενες αλλαγές. Υπάρχει και ένας πιο τυπικός τρόπος να ενωθούν πολλά υπο-προγράμματα σε ένα, απαιτεί τη χρήση header files. Παράδειγμα Έστω ότι έχουμε το κυρίως πρόγραμμα myprogram.cpp, και χρησιμοποιεί τα υποπρογράμματα job1.cpp, job2.cpp. Στο job1.cpp ορίζεται επιπλέον μία συνάρτηση job1 (η παλιά του main) και ένας τύπος δεδομένων type1, ενώ στο job2.cpp αντίστοιχα τα job2, type2. Ο αντίστοιχος κώδικας θα έχει ως εξής: >MYPROGRAM.CPP #include <iostream> #include <job1.hpp> #include <job2.hpp> ... ... int main(void) { ... ... int reply = 0; while(reply != 3) { cout << "Epilekste leitoyrgia:\n1. Job1\n2. Job2\n3. Eksodos\n"; cin >> reply; switch(reply) { case 1: job1(); break; case 2: job2(); break; case 3: break; } } ... ... return 0; } JOB1.HPP #include "job1.cpp" typedef {...}type1; void job1(void); JOB2.HPP #include "job2.cpp" typedef {...}type2; void job2(void); JOB1.CPP // Ο παλιός κώδικας, μόνο που αντί για "void main(void) {...}" θα έχεις "void job1(void) {...}" JOB2.CPP // Ομοίως με JOB1.CPP
JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Μέλος Δημοσ. 6 Φεβρουαρίου 2007 Χρησιμοποιώ Dev-C++ με τον default compiler, MingW32.. Έστω το κυρίως αρχείο που θα γίνει το menu: > //data_structures.cpp #include "1.cpp" int main() { menu1(); return 0; } Και ένα από τα αρχεία που θέλω να 'ενώσω'.. > //1.cpp #include <iostream> #include <string> using namespace std; class myStack{ public: char* sp; int maxSize; int topp; myStack(int s){ ... } void push(char value){ ... } char top(){ ... } bool empty(){ ... } void pop(){ ... } }; int protereotita (char ch); int telestis (char ch); int telesteos(char ch); int menu1() { ... } int protereotita (char ch) { ... } int telestis (char ch) { ... } int telesteos(char ch) { ... } Έχω σβήσει τον κώδικα των συναρτήσεων για να μην είναι όλο το κατεβατό.. Με header files πως ακριβώς γίνεται η δουλειά???
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Αν προσέξεις την προσθήκη που έκανα στο προηγούμενο post μου, θα καταλάβεις που είναι το λάθος
JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Μέλος Δημοσ. 6 Φεβρουαρίου 2007 Φίλε μου έκανα όλες τις απαραίτητες διορθώσεις αλλά από τον compiler συνεχίζω να παίρνω τα παρακάτω μηνύματα: multiple definition of `menu()' first defined here multiple definition of `protereotita(char)' first defined here multiple definition of `telestis(char)' first defined here multiple definition of `telesteos(char)' first defined here ld returned 1 exit status D:\...\Makefile.win [build Error] [data_structures.exe] Error 1 :(:(:(
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Στο "1.cpp" δε χρειάζεται πλέον forward declaration για τις συναρτήσεις menu, protereotita κλπ.
JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Μέλος Δημοσ. 6 Φεβρουαρίου 2007 Sorry parsifal αλλά δεν κατάλαβα,δηλάδη τι πρέπει να κάνω για να μην έχω πρόβλημα??Αν δεν τις δηλώσω στην αρχή έχω πάλι πρόβλημα...
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Από το "1.cpp" αφαίρεσε αυτές τις γραμμές (ή καλύτερα, βάλε σε σχόλια): int protereotita (char ch); int telestis (char ch); int telesteos(char ch);
JohnnysR Δημοσ. 6 Φεβρουαρίου 2007 Μέλος Δημοσ. 6 Φεβρουαρίου 2007 Αν τις σβήσω έχω ακόμη πιο πολλά μηνύματα λάθους μιας και λέει πως δεν αναγνωρίζονται οι συναρτησεις...
parsifal Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Δικό μου λάθος, υπέθεσα ότι ακολουθείς το παράδειγμα με τα header files που έδωσα πιο πάνω και είχες βάλει αυτές τις δηλώσεις στο αντίστοιχο hpp αρχείο. Δε μου λες, μήπως και στα υπόλοιπα αρχεία (2.cpp, 3.cpp κλπ) έχεις συναρτήσεις με ίδια ονόματα; (protereotita, telestis, telesteos)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.